feat-insert-service (#5)

Reviewed-on: http://catelliub.zapto.org:3000/brontomark/flux/pulls/5
Co-authored-by: mark-cachy <marco@catelli.it>
Co-committed-by: mark-cachy <marco@catelli.it>
This commit is contained in:
2026-04-20 16:52:20 +02:00
committed by brontomark
parent 667bbf6404
commit c3d4f3fac7
63 changed files with 4715 additions and 1371 deletions

View File

@@ -8,7 +8,7 @@ import 'package:flux/core/theme/bloc/theme_bloc.dart';
import 'package:flux/features/auth/bloc/auth_bloc.dart';
import 'package:flux/features/company/bloc/company_bloc.dart';
import 'package:flux/features/company/data/company_repository.dart';
import 'package:flux/features/customers/blocs/customer_bloc.dart';
import 'package:flux/features/customers/blocs/customer_cubit.dart';
import 'package:flux/features/customers/data/customer_repository.dart';
import 'package:flux/features/master_data/products/blocs/product_cubit.dart';
import 'package:flux/features/master_data/products/data/product_repository.dart';
@@ -37,8 +37,16 @@ void main() async {
BlocProvider<ThemeBloc>(
create: (context) => ThemeBloc()..add(LoadThemeEvent()),
),
BlocProvider<SessionBloc>(
create: (context) => SessionBloc()..add(AppStarted()),
BlocProvider<SessionBloc>(create: (_) => GetIt.I<SessionBloc>()),
BlocProvider<AuthBloc>(create: (_) => AuthBloc()),
BlocProvider<CompanyBloc>(create: (_) => CompanyBloc()),
BlocProvider<StoreCubit>(create: (_) => StoreCubit()..loadStores()),
BlocProvider<CustomerCubit>(create: (_) => CustomerCubit()),
BlocProvider<ProductCubit>(create: (_) => ProductCubit()),
BlocProvider<StaffCubit>(create: (_) => StaffCubit()..loadAllStaff()),
BlocProvider<ServicesCubit>(create: (_) => ServicesCubit()),
BlocProvider<ProvidersCubit>(
create: (_) => ProvidersCubit()..loadProviders(null),
),
],
child: const FluxApp(),
@@ -65,6 +73,7 @@ Future<void> setupLocator() async {
getIt.registerLazySingleton<StaffRepository>(() => StaffRepository());
getIt.registerLazySingleton<ServicesRepository>(() => ServicesRepository());
getIt.registerLazySingleton<ProviderRepository>(() => ProviderRepository());
getIt.registerSingleton<SessionBloc>(SessionBloc()..add(AppStarted()));
}
class FluxApp extends StatefulWidget {
@@ -86,40 +95,51 @@ class _FluxAppState extends State<FluxApp> {
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<AuthBloc>(create: (_) => AuthBloc()),
BlocProvider<CompanyBloc>(create: (_) => CompanyBloc()),
BlocProvider<StoreCubit>(
create: (_) => StoreCubit(context.read<SessionBloc>())..loadStores(),
return BlocBuilder<SessionBloc, SessionState>(
builder: (context, state) {
if (state.status == SessionStatus.unknown) {
return _buildLoadingScreen();
}
return BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, state) {
return MaterialApp.router(
title: 'FLUX Gestionale',
debugShowCheckedModeBanner: false,
theme: fluxLightTheme,
darkTheme: fluxDarkTheme,
themeMode: state.currentTheme.themeMode,
routerConfig: _router, // Usa l'istanza mantenuta nello stato
);
},
);
},
);
}
// Una semplice schermata di caricamento coerente con il brand
Widget _buildLoadingScreen() {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Qui puoi mettere il tuo logo
const Icon(Icons.bolt, size: 64, color: Colors.blue),
const SizedBox(height: 24),
const CircularProgressIndicator(),
const SizedBox(height: 16),
const Text(
"Inizializzazione sessione...",
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.grey,
),
),
],
),
),
BlocProvider<CustomerBloc>(create: (_) => CustomerBloc()),
BlocProvider<ProductCubit>(
create: (context) => ProductCubit(context.read<SessionBloc>()),
),
BlocProvider<StaffCubit>(
create: (_) =>
StaffCubit(context.read<SessionBloc>())..loadAllStaff(),
),
BlocProvider<ServicesCubit>(
create: (_) => ServicesCubit(context.read<SessionBloc>()),
),
BlocProvider<ProvidersCubit>(
create: (_) =>
ProvidersCubit(context.read<SessionBloc>())..loadProviders(null),
),
],
child: BlocBuilder<ThemeBloc, ThemeState>(
builder: (context, state) {
return MaterialApp.router(
title: 'FLUX Gestionale',
debugShowCheckedModeBanner: false,
theme: fluxLightTheme,
darkTheme: fluxDarkTheme,
themeMode: state.currentTheme.themeMode,
routerConfig: _router, // Usa l'istanza mantenuta nello stato
);
},
),
);
}