From c8c9dbc1f816c2a0eb38cfd02689bb502d311be8 Mon Sep 17 00:00:00 2001 From: Mark M2 Macbook Date: Thu, 9 Apr 2026 12:12:02 +0200 Subject: [PATCH] hj --- .../store/ui/create_store_screen.dart | 247 +++++++++++++++++- 1 file changed, 245 insertions(+), 2 deletions(-) diff --git a/lib/features/store/ui/create_store_screen.dart b/lib/features/store/ui/create_store_screen.dart index bef33cc..dfe0454 100644 --- a/lib/features/store/ui/create_store_screen.dart +++ b/lib/features/store/ui/create_store_screen.dart @@ -1,10 +1,253 @@ import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flux/features/settings/settings.dart'; +import 'package:flux/features/store/bloc/store_bloc.dart'; +import 'package:flux/features/store/models/store_model.dart'; +import 'package:get_it/get_it.dart'; +import 'package:flux/core/blocs/session/session_bloc.dart'; +import 'package:flux/core/theme/theme.dart'; +import 'package:flux/core/widgets/flux_text_field.dart'; -class CreateStoreScreen extends StatelessWidget { +class CreateStoreScreen extends StatefulWidget { const CreateStoreScreen({super.key}); + @override + State createState() => _CreateStoreScreenState(); +} + +class _CreateStoreScreenState extends State { + final _formKey = GlobalKey(); + + final _nomeController = TextEditingController(); + final _indirizzoController = TextEditingController(); + final _capController = TextEditingController(); + final _comuneController = TextEditingController(); + final _provinciaController = TextEditingController(); + final AppSettings _settings = GetIt.I(); + + @override + void dispose() { + _nomeController.dispose(); + _indirizzoController.dispose(); + _capController.dispose(); + _comuneController.dispose(); + _provinciaController.dispose(); + super.dispose(); + } + + /// Funzione magica per copiare i dati dall'azienda salvata in GetIt + void _useCompanyAddress() { + final company = _settings.currentCompany; + if (company != null) { + setState(() { + _indirizzoController.text = company.indirizzo; + _capController.text = company.cap; + _comuneController.text = + company.citta; // Nel DB company è 'citta', store è 'comune' + _provinciaController.text = company.provincia; + // Suggeriamo anche un nome se vuoto + if (_nomeController.text.isEmpty) { + _nomeController.text = '${company.ragioneSociale} - Sede'; + } + }); + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('Dati indirizzo copiati dalla sede legale'), + ), + ); + } + } + + void _onSave() { + if (_formKey.currentState!.validate()) { + final settings = GetIt.I(); + + if (_settings.currentCompany?.id == null) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Errore: ID Azienda non trovato')), + ); + return; + } + + final store = StoreModel( + nome: _nomeController.text.trim(), + companyId: _settings.currentCompany!.id, + indirizzo: _indirizzoController.text.trim(), + cap: _capController.text.trim(), + comune: _comuneController.text.trim(), + provincia: _provinciaController.text.trim().toUpperCase(), + ); + + context.read().add(CreateStoreRequested(store: store)); + } + } + @override Widget build(BuildContext context) { - return const Placeholder(); + return BlocProvider( + create: (context) => StoreBloc(), + child: Scaffold( + appBar: AppBar(title: const Text('Il tuo primo Negozio')), + body: BlocConsumer( + listener: (context, state) { + if (state.status == StoreStatus.success) { + context.read().add(AppStarted()); + } + if (state.status == StoreStatus.failure) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(state.errorMessage ?? 'Errore salvataggio'), + ), + ); + } + }, + builder: (context, state) { + return SafeArea( + child: SingleChildScrollView( + padding: const EdgeInsets.all(24.0), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildHeader(context), + const SizedBox(height: 32), + + // Nome del Negozio (Icona obbligatoria) + FluxTextField( + label: 'Nome del Negozio', + icon: Icons.storefront_rounded, + controller: _nomeController, + ), + + const SizedBox(height: 24), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + _SectionTitle(title: 'LOCALIZZAZIONE'), + TextButton.icon( + onPressed: _useCompanyAddress, + icon: const Icon(Icons.copy_rounded, size: 16), + label: const Text( + 'Copia da Azienda', + style: TextStyle(fontSize: 12), + ), + ), + ], + ), + const SizedBox(height: 12), + + // Indirizzo (Icona obbligatoria) + FluxTextField( + label: 'Indirizzo e n. civico', + icon: Icons.map_outlined, + controller: _indirizzoController, + ), + const SizedBox(height: 16), + + // RIGA TRIPLA: Comune, CAP, PR + Row( + crossAxisAlignment: CrossAxisAlignment + .start, // Allinea in alto in caso di errori + children: [ + Expanded( + flex: 3, + child: FluxTextField( + label: 'Comune', + icon: + Icons.location_city_rounded, // Icona aggiunta + controller: _comuneController, + ), + ), + const SizedBox(width: 12), + Expanded( + flex: 2, + child: FluxTextField( + label: 'CAP', + icon: Icons.post_add_rounded, // Icona aggiunta + controller: _capController, + keyboardType: TextInputType.number, + ), + ), + const SizedBox(width: 12), + Expanded( + flex: + 2, // Aumentato leggermente per ospitare l'icona + child: FluxTextField( + label: 'PR', + icon: Icons.explore_outlined, // Icona aggiunta + controller: _provinciaController, + ), + ), + ], + ), + + const SizedBox(height: 48), + + _buildSubmitButton(context, state), + ], + ), + ), + ), + ); + }, + ), + ), + ); + } + + Widget _buildSubmitButton(BuildContext context, StoreState state) { + return SizedBox( + width: double.infinity, + height: 56, + child: ElevatedButton( + onPressed: state.status == StoreStatus.loading ? null : _onSave, + child: state.status == StoreStatus.loading + ? const CircularProgressIndicator(color: Colors.white) + : const Text('ATTIVA NEGOZIO'), + ), + ); + } + + Widget _buildHeader(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(Icons.add_location_alt_rounded, color: context.accent, size: 48), + const SizedBox(height: 16), + Text( + 'Dove si trova il tuo store?', + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + color: context.primaryText, + ), + ), + const SizedBox(height: 8), + Text( + 'Configura il primo punto vendita per iniziare a gestire i tuoi clienti e le operazioni.', + style: TextStyle(color: context.secondaryText, fontSize: 15), + ), + ], + ); + } +} + +class _SectionTitle extends StatelessWidget { + final String title; + const _SectionTitle({required this.title}); + + @override + Widget build(BuildContext context) { + return Text( + title, + style: TextStyle( + color: context.accent, + fontWeight: FontWeight.w800, + letterSpacing: 1.2, + fontSize: 12, + ), + ); } }