feat(App): update Finlytic Flutter app UI and blocs

This commit is contained in:
2026-08-09 21:01:46 +02:00
parent e7427b7464
commit a708d2977c
591 changed files with 1095105 additions and 0 deletions
+108
View File
@@ -0,0 +1,108 @@
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/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<ApiClient>.value(value: apiClient),
ChangeNotifierProvider<SignalRService>.value(value: signalRService),
Provider<SecureStorageService>.value(value: storageService),
BlocProvider<AuthBloc>(
create: (ctx) {
final bloc = AuthBloc(apiClient: apiClient, storageService: storageService);
apiClient.onUnauthorized = () {
bloc.add(LogoutRequested());
};
bloc.add(CheckAuthStatus());
return bloc;
},
),
BlocProvider<ThemeCubit>(
create: (_) => ThemeCubit(apiClient: apiClient)..fetchUserThemePreference(),
),
BlocProvider<FavoritesCubit>(
create: (_) => FavoritesCubit(apiClient: apiClient, signalRService: signalRService),
),
BlocProvider<DiscoveryCubit>(
create: (_) => DiscoveryCubit(apiClient: apiClient),
),
],
child: BlocBuilder<ThemeCubit, ThemeState>(
builder: (context, themeState) {
return MaterialApp(
title: 'Finlytic Enterprise Terminal',
debugShowCheckedModeBanner: false,
theme: themeState.preset.toThemeData(),
home: BlocBuilder<AuthBloc, AuthState>(
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),
),
);
},
),
);
},
),
);
}
}