import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:provider/provider.dart'; import 'core/network/api_client.dart'; import 'core/network/signalr_service.dart'; import 'core/services/secure_storage_service.dart'; import 'core/theme/app_theme.dart'; import 'core/theme/custom_scroll_behavior.dart'; import 'core/theme/theme_cubit.dart'; import 'features/auth/bloc/auth_bloc.dart'; import 'features/auth/views/login_screen.dart'; import 'features/auth/views/change_initial_password_screen.dart'; import 'features/discovery/cubit/discovery_cubit.dart'; import 'features/favorites/cubit/favorites_cubit.dart'; import 'shared/widgets/responsive_scaffold.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final storageService = SecureStorageService(); final apiClient = ApiClient(storageService); final signalRService = SignalRService(storageService); runApp(FinlyticApp( storageService: storageService, apiClient: apiClient, signalRService: signalRService, )); } class FinlyticApp extends StatelessWidget { final SecureStorageService storageService; final ApiClient apiClient; final SignalRService signalRService; const FinlyticApp({ super.key, required this.storageService, required this.apiClient, required this.signalRService, }); @override Widget build(BuildContext context) { return MultiProvider( providers: [ Provider.value(value: apiClient), ChangeNotifierProvider.value(value: signalRService), Provider.value(value: storageService), BlocProvider( create: (ctx) { final bloc = AuthBloc(apiClient: apiClient, storageService: storageService); apiClient.onUnauthorized = () { bloc.add(LogoutRequested()); }; bloc.add(CheckAuthStatus()); return bloc; }, ), BlocProvider( create: (_) => ThemeCubit(apiClient: apiClient)..fetchUserThemePreference(), ), BlocProvider( create: (_) => FavoritesCubit(apiClient: apiClient, signalRService: signalRService), ), BlocProvider( create: (_) => DiscoveryCubit(apiClient: apiClient), ), ], child: BlocBuilder( builder: (context, themeState) { return MaterialApp( title: 'Finlytic Enterprise Terminal', debugShowCheckedModeBanner: false, scrollBehavior: const CustomAppScrollBehavior(), theme: themeState.preset.toThemeData(), home: BlocBuilder( builder: (context, state) { if (state is Authenticated) { signalRService.initSignalR(); return ResponsiveScaffold( user: state.user, apiClient: apiClient, signalRService: signalRService, ); } if (state is Unauthenticated || state is AuthFailure) { return const LoginScreen(); } if (state is AuthRequiresPasswordChange) { return ChangeInitialPasswordScreen(userId: state.userId); } return Scaffold( body: Center( child: CircularProgressIndicator(color: AppTheme.primaryEmerald), ), ); }, ), ); }, ), ); } }