Files
flux/lib/main.dart
Mark M2 Macbook 753b5489b6 Refactor StoreBloc to Cubit and Fix Staff Assignment UI (#1)
Convertito StoreBloc in StoreCubit per coerenza con il resto del progetto.

Sistemata la logica di assegnazione dipendenti nel modal dei negozi.

Utilizzato il doppio BlocBuilder per garantire la reattività tra StaffCubit e StoreCubit.

Reviewed-on: http://catelliub.zapto.org:3000/brontomark/flux/pulls/1
Co-authored-by: Mark M2 Macbook <marco@catelli.it>
Co-committed-by: Mark M2 Macbook <marco@catelli.it>
2026-04-15 10:05:07 +02:00

114 lines
4.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flux/core/blocs/session/session_bloc.dart';
import 'package:flux/core/routes/app_router.dart';
import 'package:flux/core/theme/theme.dart';
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/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';
import 'package:flux/features/master_data/staff/blocs/staff_cubit.dart';
import 'package:flux/features/master_data/staff/data/staff_repository.dart';
import 'package:flux/features/master_data/store/bloc/store_cubit.dart';
import 'package:flux/features/master_data/store/data/store_repository.dart';
import 'package:flux/features/settings/settings.dart';
import 'package:get_it/get_it.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await dotenv.load(fileName: ".env");
await setupLocator();
runApp(
MultiBlocProvider(
providers: [
BlocProvider<ThemeBloc>(
create: (context) => ThemeBloc()..add(LoadThemeEvent()),
),
BlocProvider<SessionBloc>(
create: (context) => SessionBloc()..add(AppStarted()),
),
],
child: const FluxApp(),
),
);
}
Future<void> setupLocator() async {
final GetIt getIt = GetIt.instance;
getIt.registerSingleton<SharedPreferences>(
await SharedPreferences.getInstance(),
);
await Supabase.initialize(
url: dotenv.env['SUPABASE_URL'] ?? '',
anonKey: dotenv.env['SUPABASE_ANON_KEY'] ?? '',
);
getIt.registerSingleton<SupabaseClient>(Supabase.instance.client);
getIt.registerLazySingleton<AppSettings>(() => AppSettings());
getIt.registerLazySingleton<CompanyRepository>(() => CompanyRepository());
getIt.registerLazySingleton<StoreRepository>(() => StoreRepository());
getIt.registerLazySingleton<CustomerRepository>(() => CustomerRepository());
getIt.registerLazySingleton<ProductRepository>(() => ProductRepository());
getIt.registerLazySingleton<StaffRepository>(() => StaffRepository());
}
class FluxApp extends StatefulWidget {
const FluxApp({super.key});
@override
State<FluxApp> createState() => _FluxAppState();
}
class _FluxAppState extends State<FluxApp> {
late final GoRouter _router;
@override
void initState() {
super.initState();
// Lo creiamo una volta sola all'avvio dell'app
_router = AppRouter.createRouter(context.read<SessionBloc>());
}
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider<AuthBloc>(create: (_) => AuthBloc()),
BlocProvider<CompanyBloc>(create: (_) => CompanyBloc()),
BlocProvider<StoreCubit>(
create: (_) => StoreCubit(context.read<SessionBloc>())..loadStores(),
),
BlocProvider<CustomerBloc>(create: (_) => CustomerBloc()),
BlocProvider<ProductCubit>(
create: (context) => ProductCubit(context.read<SessionBloc>()),
),
BlocProvider<StaffCubit>(
create: (_) =>
StaffCubit(context.read<SessionBloc>())..loadAllStaff(),
),
],
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
);
},
),
);
}
}