From e6b8c9854ef6b3aa2ee88f30df1b36137b8b6e33 Mon Sep 17 00:00:00 2001 From: mark-cachy Date: Thu, 9 Apr 2026 16:01:57 +0200 Subject: [PATCH] creazione nuovo negozio --- lib/core/blocs/session/session_bloc.dart | 47 +++++++++++++----- lib/core/blocs/session/session_state.dart | 48 ++++++++++++------- .../company/ui/create_company_screen.dart | 4 +- lib/features/settings/settings.dart | 18 +------ .../store/ui/create_store_screen.dart | 10 ++-- lib/main.dart | 2 + 6 files changed, 78 insertions(+), 51 deletions(-) diff --git a/lib/core/blocs/session/session_bloc.dart b/lib/core/blocs/session/session_bloc.dart index 54346fc..08ccaca 100644 --- a/lib/core/blocs/session/session_bloc.dart +++ b/lib/core/blocs/session/session_bloc.dart @@ -1,7 +1,8 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flux/core/enums/enums.dart'; -import 'package:flux/features/settings/settings.dart'; +import 'package:flux/features/company/models/company_model.dart'; +import 'package:flux/features/store/models/store_model.dart'; import 'package:get_it/get_it.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:async'; @@ -14,7 +15,7 @@ class SessionBloc extends Bloc { final SupabaseClient _supabase = GetIt.I.get(); StreamSubscription? _authSubscription; - SessionBloc() : super(const SessionState.unknown()) { + SessionBloc() : super(const SessionState(status: SessionStatus.unknown)) { on((event, emit) { // 1. Controlla la sessione attuale al boot final session = _supabase.auth.currentSession; @@ -32,33 +33,47 @@ class SessionBloc extends Bloc { }); on((event, emit) async { - GetIt.I.get().setCurrentUserId(event.userId); if (event.userId == null) { - emit(SessionState.unauthenticated()); + emit(SessionState(status: SessionStatus.unauthenticated)); return; } // 1. Controlla se l'utente ha una Company - final company = await _supabase + final companyJson = await _supabase .from('company') .select() .eq('user_id', event.userId!) .maybeSingle(); - if (company == null) { - emit(SessionState.authenticatedNoCompany(event.userId!)); + if (companyJson == null) { + emit( + SessionState( + status: SessionStatus.authenticatedNoCompany, + userId: event.userId, + ), + ); return; } + CompanyModel company = CompanyModel.fromJson(companyJson); // 2. Controlla i negozi final stores = await _supabase .from('store') .select() - .eq('company_id', company['id']); + .eq('company_id', companyJson['id']); if (stores.isEmpty) { - emit(SessionState.authenticatedNoStore(event.userId!, company['id'])); + emit( + SessionState( + status: SessionStatus.authenticatedNoStore, + userId: event.userId, + company: company, + ), + ); return; } + final availableStores = stores + .map((s) => StoreModel.fromJson(s)) + .toList(); // 3. Tutto ok, gestiamo le SharedPreferences per il negozio final prefs = GetIt.I.get(); @@ -69,6 +84,18 @@ class SessionBloc extends Bloc { lastStoreId = stores.first['id']; await prefs.setString('last_store_id', lastStoreId!); } + final selectedStore = StoreModel.fromJson( + stores.firstWhere((s) => s['id'] == lastStoreId), + ); + emit( + SessionState( + status: SessionStatus.ready, + userId: event.userId, + company: company, + selectedStore: selectedStore, + availableStores: availableStores, + ), + ); }); } @@ -78,5 +105,3 @@ class SessionBloc extends Bloc { return super.close(); } } - -class SharedPreferencesKeys {} diff --git a/lib/core/blocs/session/session_state.dart b/lib/core/blocs/session/session_state.dart index 300765f..c85154c 100644 --- a/lib/core/blocs/session/session_state.dart +++ b/lib/core/blocs/session/session_state.dart @@ -11,27 +11,41 @@ enum SessionStatus { class SessionState extends Equatable { final SessionStatus status; final String? userId; - final String? companyId; + final CompanyModel? company; + final StoreModel? selectedStore; + final List availableStores; // Utile per uno switcher in futuro - const SessionState._({ + const SessionState({ this.status = SessionStatus.unknown, this.userId, - this.companyId, + this.company, + this.selectedStore, + this.availableStores = const [], }); - const SessionState.unknown() : this._(); - const SessionState.unauthenticated() - : this._(status: SessionStatus.unauthenticated); - const SessionState.authenticatedNoCompany(String userId) - : this._(status: SessionStatus.authenticatedNoCompany, userId: userId); - const SessionState.authenticatedNoStore(String userId, String companyId) - : this._( - status: SessionStatus.authenticatedNoStore, - userId: userId, - companyId: companyId, - ); - const SessionState.ready(String userId) - : this._(status: SessionStatus.ready, userId: userId); @override - List get props => [status, userId]; + List get props => [ + status, + userId, + company, + selectedStore, + availableStores, + ]; + + // copyWith per aggiornare solo un pezzo (es. quando cambi negozio) + SessionState copyWith({ + SessionStatus? status, + String? userId, + CompanyModel? company, + StoreModel? selectedStore, + List? availableStores, + }) { + return SessionState( + status: status ?? this.status, + userId: userId ?? this.userId, + company: company ?? this.company, + selectedStore: selectedStore ?? this.selectedStore, + availableStores: availableStores ?? this.availableStores, + ); + } } diff --git a/lib/features/company/ui/create_company_screen.dart b/lib/features/company/ui/create_company_screen.dart index a56603e..acc7341 100644 --- a/lib/features/company/ui/create_company_screen.dart +++ b/lib/features/company/ui/create_company_screen.dart @@ -48,7 +48,7 @@ class _CreateCompanyScreenState extends State { void _onSave() { if (_formKey.currentState!.validate()) { // Recuperiamo l'ID utente attuale da Supabase o dal SessionBloc - final userId = GetIt.I.get().currentUserId!; + final userId = context.read().state.userId!; final company = CompanyModel( userId: userId, @@ -91,7 +91,7 @@ class _CreateCompanyScreenState extends State { listener: (context, state) { if (state.status == CompanyStatus.success && state.company != null) { // 1. Aggiorniamo la singleton con i dati reali (ID incluso) - GetIt.I.get().setCurrentCompany(state.company); + //GetIt.I.get().setCurrentCompany(state.company); // 2. Notifichiamo il SessionBloc per cambiare pagina context.read().add(AppStarted()); diff --git a/lib/features/settings/settings.dart b/lib/features/settings/settings.dart index ab80f3e..b20c77a 100644 --- a/lib/features/settings/settings.dart +++ b/lib/features/settings/settings.dart @@ -1,12 +1,10 @@ -import 'package:flux/features/company/models/company_model.dart'; +import 'package:flux/core/enums/enums.dart'; import 'package:get_it/get_it.dart'; import 'package:shared_preferences/shared_preferences.dart'; class AppSettings { late String _themeModeSetting; - late String? _currentUserId; late SharedPreferences _prefs; - late CompanyModel? _currentCompany; // Singleton @@ -25,18 +23,6 @@ class AppSettings { void setThemeModeSetting(String value) { _themeModeSetting = value; - _prefs.setString('theme', value); - } - - String? get currentUserId => _currentUserId; - - void setCurrentUserId(String? value) { - _currentUserId = value; - } - - CompanyModel? get currentCompany => _currentCompany; - - void setCurrentCompany(CompanyModel? value) { - _currentCompany = value; + _prefs.setString(PrefKeys.theme.value, value); } } diff --git a/lib/features/store/ui/create_store_screen.dart b/lib/features/store/ui/create_store_screen.dart index dfe0454..7e18114 100644 --- a/lib/features/store/ui/create_store_screen.dart +++ b/lib/features/store/ui/create_store_screen.dart @@ -37,7 +37,7 @@ class _CreateStoreScreenState extends State { /// Funzione magica per copiare i dati dall'azienda salvata in GetIt void _useCompanyAddress() { - final company = _settings.currentCompany; + final company = context.read().state.company; if (company != null) { setState(() { _indirizzoController.text = company.indirizzo; @@ -61,18 +61,18 @@ class _CreateStoreScreenState extends State { void _onSave() { if (_formKey.currentState!.validate()) { - final settings = GetIt.I(); + final company = context.read().state.company; - if (_settings.currentCompany?.id == null) { + if (company == null) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Errore: ID Azienda non trovato')), + const SnackBar(content: Text('Errore: Azienda non trovata')), ); return; } final store = StoreModel( nome: _nomeController.text.trim(), - companyId: _settings.currentCompany!.id, + companyId: company.id, indirizzo: _indirizzoController.text.trim(), cap: _capController.text.trim(), comune: _comuneController.text.trim(), diff --git a/lib/main.dart b/lib/main.dart index 327ad6c..73e296a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'package:flux/features/auth/ui/auth_screen.dart'; import 'package:flux/features/company/bloc/company_bloc.dart'; import 'package:flux/features/company/data/company_repository.dart'; import 'package:flux/features/company/ui/create_company_screen.dart'; +import 'package:flux/features/store/bloc/store_bloc.dart'; import 'package:flux/features/store/data/store_repository.dart'; import 'package:flux/features/store/ui/create_store_screen.dart'; import 'package:flux/ui/home_screen.dart'; @@ -31,6 +32,7 @@ void main() async { ), BlocProvider(create: (context) => AuthBloc()), BlocProvider(create: (context) => CompanyBloc()), + BlocProvider(create: (context) => StoreBloc()), ], child: const FluxApp(), ),