From 55de7fab0f35ea5ad3351df162f5afbd0b53492a Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Sat, 15 Feb 2025 00:34:38 +0400 Subject: [PATCH] Introduced `ProjectCubit` to handle project-related state. --- lib/main.dart | 23 +++++++++++++------- lib/pages/auth/model/project_model.dart | 27 ++++++++++++++++++++++++ lib/pages/common/bloc/project_cubit.dart | 19 +++++++++++++++++ 3 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 lib/pages/auth/model/project_model.dart create mode 100644 lib/pages/common/bloc/project_cubit.dart diff --git a/lib/main.dart b/lib/main.dart index 0bf0b9d3..fe14241e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,8 +2,10 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/home/bloc/home_bloc.dart'; import 'package:syncrow_web/pages/home/bloc/home_event.dart'; import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; @@ -17,18 +19,21 @@ import 'package:syncrow_web/utils/theme/theme.dart'; Future main() async { try { - const environment = String.fromEnvironment('FLAVOR', defaultValue: 'development'); + const environment = + String.fromEnvironment('FLAVOR', defaultValue: 'development'); await dotenv.load(fileName: '.env.$environment'); WidgetsFlutterBinding.ensureInitialized(); initialSetup(); } catch (_) {} - runApp(MyApp()); + final storage = FlutterSecureStorage(); + final projectCubit = ProjectCubit(storage); + runApp(MyApp(projectCubit: projectCubit)); } class MyApp extends StatelessWidget { - MyApp({ - super.key, - }); + final ProjectCubit projectCubit; + + MyApp({super.key, required this.projectCubit}); final GoRouter _router = GoRouter( initialLocation: RoutesConst.auth, @@ -49,15 +54,17 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), + BlocProvider(create: (context) => projectCubit), + BlocProvider( + create: (context) => HomeBloc(projectCubit)..add(const FetchUserInfo())), BlocProvider( create: (context) => VisitorPasswordBloc(), ), BlocProvider( - create: (context) => RoutineBloc(), + create: (context) => RoutineBloc(projectCubit), ), BlocProvider( - create: (context) => SpaceTreeBloc()..add(InitialEvent()), + create: (context) => SpaceTreeBloc(projectCubit)..add(InitialEvent()), ), ], child: MaterialApp.router( diff --git a/lib/pages/auth/model/project_model.dart b/lib/pages/auth/model/project_model.dart new file mode 100644 index 00000000..4f2f4247 --- /dev/null +++ b/lib/pages/auth/model/project_model.dart @@ -0,0 +1,27 @@ +class Project { + final String uuid; + final String name; + final String description; + + const Project({ + required this.uuid, + required this.name, + required this.description, + }); + + factory Project.fromJson(Map json) { + return Project( + uuid: json['uuid'] as String, + name: json['name'] as String, + description: json['description'] as String, + ); + } + + Map toJson() { + return { + 'uuid': uuid, + 'name': name, + 'description': description, + }; + } +} diff --git a/lib/pages/common/bloc/project_cubit.dart b/lib/pages/common/bloc/project_cubit.dart new file mode 100644 index 00000000..ab0c8912 --- /dev/null +++ b/lib/pages/common/bloc/project_cubit.dart @@ -0,0 +1,19 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + +class ProjectCubit extends Cubit { + final FlutterSecureStorage storage; + static const String projectKey = "selected_project_uuid"; + + ProjectCubit(this.storage) : super(null); + + Future setProjectUUID(String newUUID) async { + await storage.write(key: projectKey, value: newUUID); + emit(newUUID); + } + + Future clearProjectUUID() async { + await storage.delete(key: projectKey); + emit(null); + } +}