From b8204f101599642d79a7efe891f960e45a9f7f83 Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Tue, 18 Feb 2025 12:56:25 +0400 Subject: [PATCH 1/3] changed project class to use shared preference --- lib/pages/common/bloc/project_manager.dart | 19 +++++++++++++++++++ lib/utils/constants/strings_manager.dart | 1 + 2 files changed, 20 insertions(+) create mode 100644 lib/pages/common/bloc/project_manager.dart diff --git a/lib/pages/common/bloc/project_manager.dart b/lib/pages/common/bloc/project_manager.dart new file mode 100644 index 00000000..8ab442f7 --- /dev/null +++ b/lib/pages/common/bloc/project_manager.dart @@ -0,0 +1,19 @@ +import 'package:syncrow_web/utils/constants/strings_manager.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; + +class ProjectManager { + static Future getProjectUUID() async { + final projectUuid = await SharedPreferencesHelper.readStringFromSP( + StringsManager.projectKey); + return projectUuid.isNotEmpty ? projectUuid : null; + } + + static Future setProjectUUID(String newUUID) async { + await SharedPreferencesHelper.saveStringToSP( + StringsManager.projectKey, newUUID); + } + + static Future clearProjectUUID() async { + await SharedPreferencesHelper.removeValueFromSP(StringsManager.projectKey); + } +} diff --git a/lib/utils/constants/strings_manager.dart b/lib/utils/constants/strings_manager.dart index f3edde6e..2ea63fe4 100644 --- a/lib/utils/constants/strings_manager.dart +++ b/lib/utils/constants/strings_manager.dart @@ -40,4 +40,5 @@ class StringsManager { static const String firstLaunch = "firstLaunch"; static const String deleteScene = 'Delete Scene'; static const String deleteAutomation = 'Delete Automation'; + static const String projectKey = 'selected_project_uuid'; } From 05edc7641a785d69b10a38da071ba668284cb32a Mon Sep 17 00:00:00 2001 From: hannathkadher Date: Tue, 18 Feb 2025 12:56:51 +0400 Subject: [PATCH 2/3] removed project cubit from all classes --- lib/main.dart | 18 +- .../access_management/bloc/access_bloc.dart | 13 +- .../view/access_management.dart | 47 ++-- lib/pages/auth/bloc/auth_bloc.dart | 10 +- lib/pages/common/bloc/project_cubit.dart | 19 -- .../device_managment_bloc.dart | 13 +- .../view/device_managment_page.dart | 4 +- lib/pages/home/bloc/home_bloc.dart | 10 +- .../view/agreement_and_privacy_dialog.dart | 5 +- .../add_user_dialog/bloc/users_bloc.dart | 33 +-- .../add_user_dialog/view/add_user_dialog.dart | 4 +- .../add_user_dialog/view/build_tree_view.dart | 4 +- .../view/edit_user_dialog.dart | 4 +- .../users_table/bloc/user_table_bloc.dart | 24 +-- .../view/roles_and_permission_page.dart | 4 +- .../bloc/routine_bloc/routine_bloc.dart | 200 +++++++++++------- .../space_tree/bloc/space_tree_bloc.dart | 76 ++++--- .../bloc/space_management_bloc.dart | 71 ++++--- .../view/spaces_management_page.dart | 2 - .../widgets/loaded_space_widget.dart | 3 +- .../bloc/create_space_model_bloc.dart | 24 +-- .../space_model/bloc/space_model_bloc.dart | 17 +- .../dialog/create_space_model_dialog.dart | 2 - .../bloc/visitor_password_bloc.dart | 12 +- .../view/add_device_dialog.dart | 4 +- .../view/visitor_password_dialog.dart | 4 +- lib/utils/user_drop_down_menu.dart | 7 +- 27 files changed, 348 insertions(+), 286 deletions(-) delete mode 100644 lib/pages/common/bloc/project_cubit.dart diff --git a/lib/main.dart b/lib/main.dart index 72895e94..ee1a55f5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,10 +2,8 @@ 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'; @@ -25,15 +23,12 @@ Future main() async { WidgetsFlutterBinding.ensureInitialized(); initialSetup(); } catch (_) {} - final storage = FlutterSecureStorage(); - final projectCubit = ProjectCubit(storage); - runApp(MyApp(projectCubit: projectCubit)); + runApp(MyApp()); } class MyApp extends StatelessWidget { - final ProjectCubit projectCubit; - MyApp({super.key, required this.projectCubit}); + MyApp({super.key}); final GoRouter _router = GoRouter( initialLocation: RoutesConst.auth, @@ -54,16 +49,15 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MultiBlocProvider( providers: [ - BlocProvider(create: (context) => projectCubit), - BlocProvider(create: (context) => HomeBloc(projectCubit)..add(const FetchUserInfo())), + BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), BlocProvider( - create: (context) => VisitorPasswordBloc(projectCubit), + create: (context) => VisitorPasswordBloc(), ), BlocProvider( - create: (context) => RoutineBloc(projectCubit), + create: (context) => RoutineBloc(), ), BlocProvider( - create: (context) => SpaceTreeBloc(projectCubit)..add(InitialEvent()), + create: (context) => SpaceTreeBloc()..add(InitialEvent()), ), ], child: MaterialApp.router( diff --git a/lib/pages/access_management/bloc/access_bloc.dart b/lib/pages/access_management/bloc/access_bloc.dart index ac94036c..4b1c37d6 100644 --- a/lib/pages/access_management/bloc/access_bloc.dart +++ b/lib/pages/access_management/bloc/access_bloc.dart @@ -3,18 +3,18 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; import 'package:syncrow_web/pages/access_management/model/password_model.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/hour_picker_dialog.dart'; import 'package:syncrow_web/services/access_mang_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/app_enum.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; class AccessBloc extends Bloc { - final ProjectCubit projectCubit; - - AccessBloc(this.projectCubit) : super((AccessInitial())) { + AccessBloc() : super((AccessInitial())) { on(_onFetchTableData); on(selectTime); on(_filterData); @@ -34,10 +34,9 @@ class AccessBloc extends Bloc { Future _onFetchTableData( FetchTableData event, Emitter emit) async { try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; emit(AccessLoaded()); - data = await AccessMangApi() - .fetchVisitorPassword(projectUuid ?? TempConst.projectId); + data = await AccessMangApi().fetchVisitorPassword(projectUuid); filteredData = data; updateTabsCount(); emit(TableLoaded(data)); diff --git a/lib/pages/access_management/view/access_management.dart b/lib/pages/access_management/view/access_management.dart index 620dd566..c60b4bb2 100644 --- a/lib/pages/access_management/view/access_management.dart +++ b/lib/pages/access_management/view/access_management.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_bloc.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_event.dart'; import 'package:syncrow_web/pages/access_management/bloc/access_state.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/buttons/search_reset_buttons.dart'; import 'package:syncrow_web/pages/common/custom_table.dart'; @@ -28,7 +28,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { final isLargeScreen = isLargeScreenSize(context); final isSmallScreen = isSmallScreenSize(context); final isHalfMediumScreen = isHafMediumScreenSize(context); - final padding = isLargeScreen ? const EdgeInsets.all(30) : const EdgeInsets.all(15); + final padding = + isLargeScreen ? const EdgeInsets.all(30) : const EdgeInsets.all(15); return WebScaffold( enableMenuSidebar: false, @@ -40,7 +41,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { ), rightBody: const NavigateHomeGridView(), scaffoldBody: BlocProvider( - create: (BuildContext context) => AccessBloc(context.read())..add(FetchTableData()), + create: (BuildContext context) => + AccessBloc()..add(FetchTableData()), child: BlocConsumer( listener: (context, state) {}, builder: (context, state) { @@ -94,11 +96,14 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { return [ item.passwordName, item.passwordType.value, - accessBloc.timestampToDate(item.effectiveTime), - accessBloc.timestampToDate(item.invalidTime), + accessBloc + .timestampToDate(item.effectiveTime), + accessBloc + .timestampToDate(item.invalidTime), item.deviceName.toString(), item.authorizerEmail.toString(), - accessBloc.timestampToDate(item.invalidTime), + accessBloc + .timestampToDate(item.invalidTime), item.passwordStatus.value, ]; }).toList(), @@ -109,7 +114,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { }))); } - Wrap _buildVisitorAdminPasswords(BuildContext context, AccessBloc accessBloc) { + Wrap _buildVisitorAdminPasswords( + BuildContext context, AccessBloc accessBloc) { return Wrap( spacing: 10, runSpacing: 10, @@ -135,7 +141,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { borderRadius: 8, child: Text( 'Create Visitor Password ', - style: context.textTheme.titleSmall!.copyWith(color: Colors.white, fontSize: 12), + style: context.textTheme.titleSmall! + .copyWith(color: Colors.white, fontSize: 12), )), ), // Container( @@ -173,8 +180,10 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { description: '', onSubmitted: (value) { accessBloc.add(FilterDataEvent( - emailAuthorizer: accessBloc.emailAuthorizer.text.toLowerCase(), - selectedTabIndex: BlocProvider.of(context).selectedIndex, + emailAuthorizer: + accessBloc.emailAuthorizer.text.toLowerCase(), + selectedTabIndex: + BlocProvider.of(context).selectedIndex, passwordName: accessBloc.passwordName.text.toLowerCase(), startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp)); @@ -192,8 +201,10 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { description: '', onSubmitted: (value) { accessBloc.add(FilterDataEvent( - emailAuthorizer: accessBloc.emailAuthorizer.text.toLowerCase(), - selectedTabIndex: BlocProvider.of(context).selectedIndex, + emailAuthorizer: + accessBloc.emailAuthorizer.text.toLowerCase(), + selectedTabIndex: + BlocProvider.of(context).selectedIndex, passwordName: accessBloc.passwordName.text.toLowerCase(), startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp)); @@ -222,7 +233,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { onSearch: () { accessBloc.add(FilterDataEvent( emailAuthorizer: accessBloc.emailAuthorizer.text.toLowerCase(), - selectedTabIndex: BlocProvider.of(context).selectedIndex, + selectedTabIndex: + BlocProvider.of(context).selectedIndex, passwordName: accessBloc.passwordName.text.toLowerCase(), startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp)); @@ -250,8 +262,10 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { description: '', onSubmitted: (value) { accessBloc.add(FilterDataEvent( - emailAuthorizer: accessBloc.emailAuthorizer.text.toLowerCase(), - selectedTabIndex: BlocProvider.of(context).selectedIndex, + emailAuthorizer: + accessBloc.emailAuthorizer.text.toLowerCase(), + selectedTabIndex: + BlocProvider.of(context).selectedIndex, passwordName: accessBloc.passwordName.text.toLowerCase(), startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp)); @@ -275,7 +289,8 @@ class AccessManagementPage extends StatelessWidget with HelperResponsiveLayout { onSearch: () { accessBloc.add(FilterDataEvent( emailAuthorizer: accessBloc.emailAuthorizer.text.toLowerCase(), - selectedTabIndex: BlocProvider.of(context).selectedIndex, + selectedTabIndex: + BlocProvider.of(context).selectedIndex, passwordName: accessBloc.passwordName.text.toLowerCase(), startTime: accessBloc.effectiveTimeTimeStamp, endTime: accessBloc.expirationTimeTimeStamp)); diff --git a/lib/pages/auth/bloc/auth_bloc.dart b/lib/pages/auth/bloc/auth_bloc.dart index 13490069..c2aa01a4 100644 --- a/lib/pages/auth/bloc/auth_bloc.dart +++ b/lib/pages/auth/bloc/auth_bloc.dart @@ -9,7 +9,7 @@ import 'package:syncrow_web/pages/auth/model/login_with_email_model.dart'; import 'package:syncrow_web/pages/auth/model/region_model.dart'; import 'package:syncrow_web/pages/auth/model/token.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/services/auth_api.dart'; import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; @@ -442,13 +442,9 @@ class AuthBloc extends Bloc { emit(LoginInitial()); } - static Future logout( - BuildContext context, ProjectCubit projectCubit) async { + static Future logout(BuildContext context) async { final storage = FlutterSecureStorage(); - - await storage.delete(key: ProjectCubit.projectKey); - - projectCubit.clearProjectUUID(); + ProjectManager.clearProjectUUID(); storage.deleteAll(); } } diff --git a/lib/pages/common/bloc/project_cubit.dart b/lib/pages/common/bloc/project_cubit.dart deleted file mode 100644 index ab0c8912..00000000 --- a/lib/pages/common/bloc/project_cubit.dart +++ /dev/null @@ -1,19 +0,0 @@ -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); - } -} diff --git a/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart b/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart index 672c4d67..e52debb0 100644 --- a/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart +++ b/lib/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart @@ -1,11 +1,13 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; part 'device_managment_event.dart'; part 'device_managment_state.dart'; @@ -22,9 +24,8 @@ class DeviceManagementBloc String currentProductName = ''; String? currentCommunity; String? currentUnitName; - final ProjectCubit projectCubit; - DeviceManagementBloc(this.projectCubit) : super(DeviceManagementInitial()) { + DeviceManagementBloc() : super(DeviceManagementInitial()) { on(_onFetchDevices); on(_onFilterDevices); on(_onSelectedFilterChanged); @@ -42,18 +43,18 @@ class DeviceManagementBloc List devices = []; _devices.clear(); var spaceBloc = event.context.read(); - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; if (spaceBloc.state.selectedCommunities.isEmpty) { devices = await DevicesManagementApi() - .fetchDevices('', '', projectUuid ?? TempConst.projectId); + .fetchDevices('', '', projectUuid ); } else { for (var community in spaceBloc.state.selectedCommunities) { List spacesList = spaceBloc.state.selectedCommunityAndSpaces[community] ?? []; for (var space in spacesList) { devices.addAll(await DevicesManagementApi().fetchDevices( - community, space, projectUuid ?? TempConst.projectId)); + community, space, projectUuid)); } } } diff --git a/lib/pages/device_managment/all_devices/view/device_managment_page.dart b/lib/pages/device_managment/all_devices/view/device_managment_page.dart index 1ce42b57..1bc4d071 100644 --- a/lib/pages/device_managment/all_devices/view/device_managment_page.dart +++ b/lib/pages/device_managment/all_devices/view/device_managment_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/bloc/device_mgmt_bloc/device_managment_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_managment_body.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; @@ -21,7 +21,7 @@ class DeviceManagementPage extends StatelessWidget with HelperResponsiveLayout { providers: [ BlocProvider( create: (context) => - DeviceManagementBloc(context.read())..add(FetchDevices(context)), + DeviceManagementBloc()..add(FetchDevices(context)), ), ], child: WebScaffold( diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index 6cd3e064..f23e87ed 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -2,9 +2,10 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:go_router/go_router.dart'; +import 'package:shared_preferences/shared_preferences.dart'; // import 'package:graphview/GraphView.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/home/bloc/home_event.dart'; import 'package:syncrow_web/pages/home/bloc/home_state.dart'; import 'package:syncrow_web/pages/home/home_model/home_item_model.dart'; @@ -13,6 +14,8 @@ import 'package:syncrow_web/services/home_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class HomeBloc extends Bloc { // final Graph graph = Graph()..isTree = true; @@ -22,9 +25,8 @@ class HomeBloc extends Bloc { UserModel? user; String terms = ''; String policy = ''; - final ProjectCubit projectCubit; - HomeBloc(this.projectCubit) : super((HomeInitial())) { + HomeBloc() : super((HomeInitial())) { // on(_createNode); on(_fetchUserInfo); on(_fetchTerms); @@ -55,7 +57,7 @@ class HomeBloc extends Bloc { user = await HomeApi().fetchUserInfo(uuid); if (user != null && user!.project != null) { - projectCubit.setProjectUUID(user!.project!.uuid); + await ProjectManager.setProjectUUID(user!.project!.uuid); } add(FetchTermEvent()); add(FetchPolicyEvent()); diff --git a/lib/pages/home/view/agreement_and_privacy_dialog.dart b/lib/pages/home/view/agreement_and_privacy_dialog.dart index bbdb7b34..6b72c300 100644 --- a/lib/pages/home/view/agreement_and_privacy_dialog.dart +++ b/lib/pages/home/view/agreement_and_privacy_dialog.dart @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_html/flutter_html.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/common/bloc/project_manager.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -164,8 +164,7 @@ class _AgreementAndPrivacyDialogState extends State { children: [ InkWell( onTap: () { - final projectCubit = BlocProvider.of(context); - AuthBloc.logout(context, projectCubit); + AuthBloc.logout(context); context.go(RoutesConst.auth); }, child: const Text("Cancel"), diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart index 73bc23f3..356c4e31 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart @@ -1,6 +1,6 @@ import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/custom_dialog.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/edit_user_model.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/role_type_model.dart'; @@ -13,12 +13,12 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model import 'package:syncrow_web/services/space_mana_api.dart'; import 'package:syncrow_web/services/user_permission.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class UsersBloc extends Bloc { - final ProjectCubit projectCubit; - - UsersBloc(this.projectCubit) : super(UsersInitial()) { + UsersBloc() : super(UsersInitial()) { on(isCompleteBasicsFun); on(_onLoadCommunityAndSpaces); on(searchTreeNode); @@ -78,10 +78,10 @@ class UsersBloc extends Bloc { Future> _fetchSpacesForCommunity( String communityUuid) async { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; return await CommunitySpaceManagementApi() - .getSpaceHierarchy(communityUuid, projectUuid ?? TempConst.projectId); + .getSpaceHierarchy(communityUuid, projectUuid); } List updatedCommunities = []; @@ -91,9 +91,10 @@ class UsersBloc extends Bloc { LoadCommunityAndSpacesEvent event, Emitter emit) async { try { emit(UsersLoadingState()); - final projectUuid = projectCubit.state; - List communities = await CommunitySpaceManagementApi() - .fetchCommunities(projectUuid ?? TempConst.projectId); + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + + List communities = + await CommunitySpaceManagementApi().fetchCommunities(projectUuid); communityIds = communities.map((community) => community.uuid).toList(); updatedCommunities = await Future.wait( communities.map((community) async { @@ -336,7 +337,7 @@ class UsersBloc extends Bloc { void _sendInvitUser(SendInviteUsers event, Emitter emit) async { try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; emit(UsersLoadingState()); List selectedIds = getSelectedIds(updatedCommunities) @@ -351,7 +352,7 @@ class UsersBloc extends Bloc { phoneNumber: phoneController.text, roleUuid: roleSelected, spaceUuids: selectedIds, - projectUuid: projectUuid ?? TempConst.projectId); + projectUuid: projectUuid); if (res) { showCustomDialog( @@ -386,7 +387,7 @@ class UsersBloc extends Bloc { List selectedIds = getSelectedIds(updatedCommunities) .where((id) => !communityIds.contains(id)) .toList(); - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; bool res = await UserPermissionApi().editInviteUser( userId: event.userId, @@ -396,7 +397,7 @@ class UsersBloc extends Bloc { phoneNumber: phoneController.text, roleUuid: roleSelected, spaceUuids: selectedIds, - projectUuid: projectUuid ?? TempConst.projectId); + projectUuid: projectUuid); if (res == true) { showCustomDialog( barrierDismissible: false, @@ -501,11 +502,11 @@ class UsersBloc extends Bloc { emit(UsersLoadingState()); try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; if (event.uuid?.isNotEmpty ?? false) { - final res = await UserPermissionApi() - .fetchUserById(event.uuid, projectUuid ?? TempConst.projectId); + final res = + await UserPermissionApi().fetchUserById(event.uuid, projectUuid); if (res != null) { // Populate the text controllers diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart index 4023f9bd..15981ea6 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/add_user_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -24,7 +24,7 @@ class _AddNewUserDialogState extends State { @override Widget build(BuildContext context) { return BlocProvider( - create: (BuildContext context) => UsersBloc(context.read()) + create: (BuildContext context) => UsersBloc() ..add(const LoadCommunityAndSpacesEvent()) ..add(const RoleEvent()), child: BlocConsumer( diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart index d45e3482..2863a862 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/build_tree_view.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -22,7 +22,7 @@ class TreeView extends StatelessWidget { final _blocRole = BlocProvider.of(context); debugPrint('TreeView constructed with userId = $userId'); return BlocProvider( - create: (_) => UsersBloc(context.read()), + create: (_) => UsersBloc(), // ..add(const LoadCommunityAndSpacesEvent()), child: BlocConsumer( listener: (context, state) { diff --git a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart index fdf52c4d..22c603ab 100644 --- a/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart +++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/view/edit_user_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart'; @@ -25,7 +25,7 @@ class _EditUserDialogState extends State { @override Widget build(BuildContext context) { return BlocProvider( - create: (BuildContext context) => UsersBloc(context.read()) + create: (BuildContext context) => UsersBloc() ..add(const LoadCommunityAndSpacesEvent()) ..add(const RoleEvent()) ..add(GetUserByIdEvent(uuid: widget.userId)), diff --git a/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart b/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart index 2ba3130a..e7eda606 100644 --- a/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart +++ b/lib/pages/roles_and_permission/users_page/users_table/bloc/user_table_bloc.dart @@ -1,17 +1,16 @@ import 'dart:async'; -import 'package:bloc/bloc.dart'; import 'package:flutter/material.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/roles_and_permission/model/roles_user_model.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_event.dart'; import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_state.dart'; import 'package:syncrow_web/services/user_permission.dart'; -import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class UserTableBloc extends Bloc { - final ProjectCubit _projectCubit; - - UserTableBloc(this._projectCubit) : super(TableInitial()) { + UserTableBloc() : super(TableInitial()) { on(_getUsers); on(_changeUserStatus); on(_toggleSortUsersByNameAsc); @@ -50,13 +49,12 @@ class UserTableBloc extends Bloc { Future _getUsers(GetUsers event, Emitter emit) async { emit(UsersLoadingState()); try { - final projectUuid = _projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; roleTypes.clear(); jobTitle.clear(); createdBy.clear(); - users = await UserPermissionApi() - .fetchUsers(projectUuid ?? TempConst.projectId); + users = await UserPermissionApi().fetchUsers(projectUuid); users.sort((a, b) { final dateA = _parseDateTime(a.createdDate); final dateB = _parseDateTime(b.createdDate); @@ -103,13 +101,11 @@ class UserTableBloc extends Bloc { Future _changeUserStatus( ChangeUserStatus event, Emitter emit) async { try { - final projectUuid = _projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; emit(UsersLoadingState()); - bool res = await UserPermissionApi().changeUserStatusById( - event.userId, - event.newStatus == "disabled" ? false : true, - projectUuid ?? TempConst.projectId); + bool res = await UserPermissionApi().changeUserStatusById(event.userId, + event.newStatus == "disabled" ? false : true, projectUuid); if (res == true) { add(const GetUsers()); } diff --git a/lib/pages/roles_and_permission/view/roles_and_permission_page.dart b/lib/pages/roles_and_permission/view/roles_and_permission_page.dart index 68b586bc..cd1cadeb 100644 --- a/lib/pages/roles_and_permission/view/roles_and_permission_page.dart +++ b/lib/pages/roles_and_permission/view/roles_and_permission_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_bloc.dart'; import 'package:syncrow_web/pages/roles_and_permission/bloc/roles_permission_state.dart'; @@ -77,7 +77,7 @@ class RolesAndPermissionPage extends StatelessWidget { ], ), scaffoldBody: BlocProvider( - create: (context) => UserTableBloc(context.read())..add(const GetUsers()), + create: (context) => UserTableBloc()..add(const GetUsers()), child: UsersPage(), ) // _blocRole.tapSelect == false diff --git a/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart b/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart index 7cd66a9e..1baafb14 100644 --- a/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart +++ b/lib/pages/routines/bloc/routine_bloc/routine_bloc.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_model.dart'; import 'package:syncrow_web/pages/routines/models/create_scene_and_autoamtion/create_automation_model.dart'; @@ -16,7 +16,9 @@ import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; import 'package:syncrow_web/services/devices_mang_api.dart'; import 'package:syncrow_web/services/routines_api.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; import 'package:syncrow_web/utils/navigation_service.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; import 'package:uuid/uuid.dart'; @@ -28,9 +30,7 @@ part 'routine_state.dart'; // String communityId = 'aff21a57-2f91-4e5c-b99b-0182c3ab65a9'; class RoutineBloc extends Bloc { - final ProjectCubit projectCubit; - - RoutineBloc(this.projectCubit) : super(const RoutineState()) { + RoutineBloc() : super(const RoutineState()) { on(_onAddToIfContainer); on(_onAddToThenContainer); on(_onLoadScenes); @@ -61,7 +61,8 @@ class RoutineBloc extends Bloc { TriggerSwitchTabsEvent event, Emitter emit, ) { - emit(state.copyWith(routineTab: event.isRoutineTab, createRoutineView: false)); + emit(state.copyWith( + routineTab: event.isRoutineTab, createRoutineView: false)); add(ResetRoutineState()); if (event.isRoutineTab) { add(const LoadScenes()); @@ -87,8 +88,8 @@ class RoutineBloc extends Bloc { final updatedIfItems = List>.from(state.ifItems); // Find the index of the item in teh current itemsList - int index = - updatedIfItems.indexWhere((map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); + int index = updatedIfItems.indexWhere( + (map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); // Replace the map if the index is valid if (index != -1) { updatedIfItems[index] = event.item; @@ -97,18 +98,21 @@ class RoutineBloc extends Bloc { } if (event.isTabToRun) { - emit(state.copyWith(ifItems: updatedIfItems, isTabToRun: true, isAutomation: false)); + emit(state.copyWith( + ifItems: updatedIfItems, isTabToRun: true, isAutomation: false)); } else { - emit(state.copyWith(ifItems: updatedIfItems, isTabToRun: false, isAutomation: true)); + emit(state.copyWith( + ifItems: updatedIfItems, isTabToRun: false, isAutomation: true)); } } - void _onAddToThenContainer(AddToThenContainer event, Emitter emit) { + void _onAddToThenContainer( + AddToThenContainer event, Emitter emit) { final currentItems = List>.from(state.thenItems); // Find the index of the item in teh current itemsList - int index = - currentItems.indexWhere((map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); + int index = currentItems.indexWhere( + (map) => map['uniqueCustomId'] == event.item['uniqueCustomId']); // Replace the map if the index is valid if (index != -1) { currentItems[index] = event.item; @@ -119,22 +123,26 @@ class RoutineBloc extends Bloc { emit(state.copyWith(thenItems: currentItems)); } - void _onAddFunctionsToRoutine(AddFunctionToRoutine event, Emitter emit) { + void _onAddFunctionsToRoutine( + AddFunctionToRoutine event, Emitter emit) { try { if (event.functions.isEmpty) return; - List selectedFunction = List.from(event.functions); + List selectedFunction = + List.from(event.functions); Map> currentSelectedFunctions = Map>.from(state.selectedFunctions); if (currentSelectedFunctions.containsKey(event.uniqueCustomId)) { List currentFunctions = - List.from(currentSelectedFunctions[event.uniqueCustomId] ?? []); + List.from( + currentSelectedFunctions[event.uniqueCustomId] ?? []); List functionCode = []; for (int i = 0; i < selectedFunction.length; i++) { for (int j = 0; j < currentFunctions.length; j++) { - if (selectedFunction[i].functionCode == currentFunctions[j].functionCode) { + if (selectedFunction[i].functionCode == + currentFunctions[j].functionCode) { currentFunctions[j] = selectedFunction[i]; if (!functionCode.contains(currentFunctions[j].functionCode)) { functionCode.add(currentFunctions[j].functionCode); @@ -144,13 +152,15 @@ class RoutineBloc extends Bloc { } for (int i = 0; i < functionCode.length; i++) { - selectedFunction.removeWhere((code) => code.functionCode == functionCode[i]); + selectedFunction + .removeWhere((code) => code.functionCode == functionCode[i]); } - currentSelectedFunctions[event.uniqueCustomId] = List.from(currentFunctions) - ..addAll(selectedFunction); + currentSelectedFunctions[event.uniqueCustomId] = + List.from(currentFunctions)..addAll(selectedFunction); } else { - currentSelectedFunctions[event.uniqueCustomId] = List.from(event.functions); + currentSelectedFunctions[event.uniqueCustomId] = + List.from(event.functions); } emit(state.copyWith(selectedFunctions: currentSelectedFunctions)); @@ -159,18 +169,21 @@ class RoutineBloc extends Bloc { } } - Future _onLoadScenes(LoadScenes event, Emitter emit) async { + Future _onLoadScenes( + LoadScenes event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); List scenes = []; try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + BuildContext context = NavigationService.navigatorKey.currentContext!; var spaceBloc = context.read(); for (var communityId in spaceBloc.state.selectedCommunities) { - List spacesList = spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; + List spacesList = + spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; for (var spaceId in spacesList) { scenes.addAll( - await SceneApi.getScenes(spaceId, communityId, projectUuid ?? TempConst.projectId)); + await SceneApi.getScenes(spaceId, communityId, projectUuid)); } } @@ -188,7 +201,8 @@ class RoutineBloc extends Bloc { } } - Future _onLoadAutomation(LoadAutomation event, Emitter emit) async { + Future _onLoadAutomation( + LoadAutomation event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); List automations = []; @@ -196,7 +210,8 @@ class RoutineBloc extends Bloc { BuildContext context = NavigationService.navigatorKey.currentContext!; var spaceBloc = context.read(); for (var communityId in spaceBloc.state.selectedCommunities) { - List spacesList = spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; + List spacesList = + spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; for (var spaceId in spacesList) { automations.addAll(await SceneApi.getAutomation(spaceId)); } @@ -215,14 +230,16 @@ class RoutineBloc extends Bloc { } } - FutureOr _onSearchRoutines(SearchRoutines event, Emitter emit) async { + FutureOr _onSearchRoutines( + SearchRoutines event, Emitter emit) async { emit(state.copyWith(isLoading: true, errorMessage: null)); await Future.delayed(const Duration(seconds: 1)); emit(state.copyWith(isLoading: false, errorMessage: null)); emit(state.copyWith(searchText: event.query)); } - FutureOr _onAddSelectedIcon(AddSelectedIcon event, Emitter emit) { + FutureOr _onAddSelectedIcon( + AddSelectedIcon event, Emitter emit) { emit(state.copyWith(selectedIcon: event.icon)); } @@ -236,7 +253,8 @@ class RoutineBloc extends Bloc { return actions.last['deviceId'] == 'delay'; } - Future _onCreateScene(CreateSceneEvent event, Emitter emit) async { + Future _onCreateScene( + CreateSceneEvent event, Emitter emit) async { try { // Check if first action is delay // if (_isFirstActionDelay(state.thenItems)) { @@ -249,7 +267,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); return; @@ -325,7 +344,8 @@ class RoutineBloc extends Bloc { } } - Future _onCreateAutomation(CreateAutomationEvent event, Emitter emit) async { + Future _onCreateAutomation( + CreateAutomationEvent event, Emitter emit) async { try { if (state.routineName == null || state.routineName!.isEmpty) { emit(state.copyWith( @@ -346,7 +366,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); CustomSnackBar.redSnackBar('Cannot have delay as the last action'); @@ -458,17 +479,21 @@ class RoutineBloc extends Bloc { } } - FutureOr _onRemoveDragCard(RemoveDragCard event, Emitter emit) { + FutureOr _onRemoveDragCard( + RemoveDragCard event, Emitter emit) { if (event.isFromThen) { final thenItems = List>.from(state.thenItems); - final selectedFunctions = Map>.from(state.selectedFunctions); + final selectedFunctions = + Map>.from(state.selectedFunctions); thenItems.removeAt(event.index); selectedFunctions.remove(event.key); - emit(state.copyWith(thenItems: thenItems, selectedFunctions: selectedFunctions)); + emit(state.copyWith( + thenItems: thenItems, selectedFunctions: selectedFunctions)); } else { final ifItems = List>.from(state.ifItems); - final selectedFunctions = Map>.from(state.selectedFunctions); + final selectedFunctions = + Map>.from(state.selectedFunctions); ifItems.removeAt(event.index); selectedFunctions.remove(event.key); @@ -479,7 +504,8 @@ class RoutineBloc extends Bloc { isAutomation: false, isTabToRun: false)); } else { - emit(state.copyWith(ifItems: ifItems, selectedFunctions: selectedFunctions)); + emit(state.copyWith( + ifItems: ifItems, selectedFunctions: selectedFunctions)); } } } @@ -491,18 +517,23 @@ class RoutineBloc extends Bloc { )); } - FutureOr _onEffectiveTimeEvent(EffectiveTimePeriodEvent event, Emitter emit) { + FutureOr _onEffectiveTimeEvent( + EffectiveTimePeriodEvent event, Emitter emit) { emit(state.copyWith(effectiveTime: event.effectiveTime)); } - FutureOr _onSetRoutineName(SetRoutineName event, Emitter emit) { + FutureOr _onSetRoutineName( + SetRoutineName event, Emitter emit) { emit(state.copyWith( routineName: event.name, )); } - (List>, List>, Map>) - _createCardData( + ( + List>, + List>, + Map> + ) _createCardData( List actions, List? conditions, Map> currentFunctions, @@ -535,7 +566,8 @@ class RoutineBloc extends Bloc { 'deviceId': condition.entityId, 'title': matchingDevice.name ?? condition.entityId, 'productType': condition.entityType, - 'imagePath': matchingDevice.getDefaultIcon(condition.entityType), + 'imagePath': + matchingDevice.getDefaultIcon(condition.entityType), }; final functions = matchingDevice.functions; @@ -571,8 +603,11 @@ class RoutineBloc extends Bloc { final cardData = { 'entityId': action.entityId, 'uniqueCustomId': const Uuid().v4(), - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, - 'title': action.actionExecutor == 'delay' ? 'Delay' : (matchingDevice.name ?? 'Device'), + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'title': action.actionExecutor == 'delay' + ? 'Delay' + : (matchingDevice.name ?? 'Device'), 'productType': action.productType, 'imagePath': matchingDevice.getDefaultIcon(action.productType), }; @@ -615,7 +650,8 @@ class RoutineBloc extends Bloc { return (thenItems, ifItems, currentFunctions); } - Future _onGetSceneDetails(GetSceneDetails event, Emitter emit) async { + Future _onGetSceneDetails( + GetSceneDetails event, Emitter emit) async { try { emit(state.copyWith( isLoading: true, @@ -663,10 +699,12 @@ class RoutineBloc extends Bloc { if (!deviceCards.containsKey(deviceId)) { deviceCards[deviceId] = { 'entityId': action.entityId, - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, - 'uniqueCustomId': action.type == 'automation' || action.actionExecutor == 'delay' - ? const Uuid().v4() - : action.entityId, + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'uniqueCustomId': + action.type == 'automation' || action.actionExecutor == 'delay' + ? const Uuid().v4() + : action.entityId, 'title': action.actionExecutor == 'delay' ? 'Delay' : action.type == 'automation' @@ -701,7 +739,8 @@ class RoutineBloc extends Bloc { ), ); // emit(state.copyWith(automationActionExecutor: action.actionExecutor)); - } else if (action.executorProperty != null && action.actionExecutor != 'delay') { + } else if (action.executorProperty != null && + action.actionExecutor != 'delay') { if (!updatedFunctions.containsKey(uniqueCustomId)) { updatedFunctions[uniqueCustomId] = []; } @@ -773,7 +812,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onResetRoutineState(ResetRoutineState event, Emitter emit) { + FutureOr _onResetRoutineState( + ResetRoutineState event, Emitter emit) { emit(state.copyWith( ifItems: [], thenItems: [], @@ -797,17 +837,20 @@ class RoutineBloc extends Bloc { createRoutineView: false)); } - FutureOr _deleteScene(DeleteScene event, Emitter emit) async { + FutureOr _deleteScene( + DeleteScene event, Emitter emit) async { try { emit(state.copyWith(isLoading: true)); BuildContext context = NavigationService.navigatorKey.currentContext!; var spaceBloc = context.read(); if (state.isTabToRun) { await SceneApi.deleteScene( - unitUuid: spaceBloc.state.selectedSpaces[0], sceneId: state.sceneId ?? ''); + unitUuid: spaceBloc.state.selectedSpaces[0], + sceneId: state.sceneId ?? ''); } else { await SceneApi.deleteAutomation( - unitUuid: spaceBloc.state.selectedSpaces[0], automationId: state.automationId ?? ''); + unitUuid: spaceBloc.state.selectedSpaces[0], + automationId: state.automationId ?? ''); } add(const LoadScenes()); @@ -836,19 +879,22 @@ class RoutineBloc extends Bloc { // } // } - FutureOr _fetchDevices(FetchDevicesInRoutine event, Emitter emit) async { + FutureOr _fetchDevices( + FetchDevicesInRoutine event, Emitter emit) async { emit(state.copyWith(isLoading: true)); try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + List devices = []; BuildContext context = NavigationService.navigatorKey.currentContext!; var spaceBloc = context.read(); for (var communityId in spaceBloc.state.selectedCommunities) { - List spacesList = spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; + List spacesList = + spaceBloc.state.selectedCommunityAndSpaces[communityId] ?? []; for (var spaceId in spacesList) { devices.addAll(await DevicesManagementApi() - .fetchDevices(communityId, spaceId, projectUuid ?? TempConst.projectId)); + .fetchDevices(communityId, spaceId, projectUuid)); } } @@ -858,7 +904,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onUpdateScene(UpdateScene event, Emitter emit) async { + FutureOr _onUpdateScene( + UpdateScene event, Emitter emit) async { try { // Check if first action is delay // if (_isFirstActionDelay(state.thenItems)) { @@ -872,7 +919,8 @@ class RoutineBloc extends Bloc { if (_isLastActionDelay(state.thenItems)) { emit(state.copyWith( - errorMessage: 'A delay condition cannot be the only or the last action', + errorMessage: + 'A delay condition cannot be the only or the last action', isLoading: false, )); return; @@ -925,7 +973,8 @@ class RoutineBloc extends Bloc { actions: actions, ); - final result = await SceneApi.updateScene(createSceneModel, state.sceneId ?? ''); + final result = + await SceneApi.updateScene(createSceneModel, state.sceneId ?? ''); if (result['success']) { add(ResetRoutineState()); add(const LoadScenes()); @@ -944,7 +993,8 @@ class RoutineBloc extends Bloc { } } - FutureOr _onUpdateAutomation(UpdateAutomation event, Emitter emit) async { + FutureOr _onUpdateAutomation( + UpdateAutomation event, Emitter emit) async { try { if (state.routineName == null || state.routineName!.isEmpty) { emit(state.copyWith( @@ -1055,8 +1105,8 @@ class RoutineBloc extends Bloc { actions: actions, ); - final result = - await SceneApi.updateAutomation(createAutomationModel, state.automationId ?? ''); + final result = await SceneApi.updateAutomation( + createAutomationModel, state.automationId ?? ''); if (result['success']) { add(ResetRoutineState()); @@ -1089,7 +1139,8 @@ class RoutineBloc extends Bloc { thenItems: [], )); - final automationDetails = await SceneApi.getAutomationDetails(event.automationId); + final automationDetails = + await SceneApi.getAutomationDetails(event.automationId); final Map> deviceIfCards = {}; final Map> deviceThenCards = {}; @@ -1157,13 +1208,15 @@ class RoutineBloc extends Bloc { ), ); - final deviceId = - action.actionExecutor == 'delay' ? '${action.entityId}_delay' : action.entityId; + final deviceId = action.actionExecutor == 'delay' + ? '${action.entityId}_delay' + : action.entityId; if (!deviceThenCards.containsKey(deviceId)) { deviceThenCards[deviceId] = { 'entityId': action.entityId, - 'deviceId': action.actionExecutor == 'delay' ? 'delay' : action.entityId, + 'deviceId': + action.actionExecutor == 'delay' ? 'delay' : action.entityId, 'uniqueCustomId': const Uuid().v4(), 'title': action.actionExecutor == 'delay' ? 'Delay' @@ -1194,7 +1247,8 @@ class RoutineBloc extends Bloc { updatedFunctions[uniqueCustomId] = []; } - if (action.executorProperty != null && action.actionExecutor != 'delay') { + if (action.executorProperty != null && + action.actionExecutor != 'delay') { final functions = matchingDevice.functions; final functionCode = action.executorProperty!.functionCode; for (var function in functions) { @@ -1236,10 +1290,14 @@ class RoutineBloc extends Bloc { } } - final ifItems = deviceIfCards.values.where((card) => card['type'] == 'condition').toList(); + final ifItems = deviceIfCards.values + .where((card) => card['type'] == 'condition') + .toList(); final thenItems = deviceThenCards.values .where((card) => - card['type'] == 'action' || card['type'] == 'automation' || card['type'] == 'scene') + card['type'] == 'action' || + card['type'] == 'automation' || + card['type'] == 'scene') .toList(); emit(state.copyWith( diff --git a/lib/pages/space_tree/bloc/space_tree_bloc.dart b/lib/pages/space_tree/bloc/space_tree_bloc.dart index 9a0078e3..3325a721 100644 --- a/lib/pages/space_tree/bloc/space_tree_bloc.dart +++ b/lib/pages/space_tree/bloc/space_tree_bloc.dart @@ -1,23 +1,24 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_state.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; import 'package:syncrow_web/services/space_mana_api.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class SpaceTreeBloc extends Bloc { // String selectedCommunityId = 'aff21a57-2f91-4e5c-b99b-0182c3ab65a9'; // String selectedSpaceId = '25c96044-fadf-44bb-93c7-3c079e527ce6'; - final ProjectCubit projectCubit; final TextEditingController textController = TextEditingController(); // String selectedCommunityId = 'aff21a57-2f91-4e5c-b99b-0182c3ab65a9'; // String selectedSpaceId = '25c96044-fadf-44bb-93c7-3c079e527ce6'; - SpaceTreeBloc(this.projectCubit) : super(const SpaceTreeState()) { + SpaceTreeBloc() : super(const SpaceTreeState()) { on(_fetchSpaces); on(_onCommunityExpanded); on(_onSpaceExpanded); @@ -29,15 +30,15 @@ class SpaceTreeBloc extends Bloc { _fetchSpaces(InitialEvent event, Emitter emit) async { emit(SpaceTreeLoadingState()); try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; List communities = - await CommunitySpaceManagementApi().fetchCommunities(projectUuid ?? TempConst.projectId); + await CommunitySpaceManagementApi().fetchCommunities(projectUuid); List updatedCommunities = await Future.wait( communities.map((community) async { List spaces = await CommunitySpaceManagementApi() - .getSpaceHierarchy(community.uuid, projectUuid ?? TempConst.projectId); + .getSpaceHierarchy(community.uuid, projectUuid); return CommunityModel( uuid: community.uuid, @@ -52,15 +53,19 @@ class SpaceTreeBloc extends Bloc { ); emit(state.copyWith( - communitiesList: updatedCommunities, expandedCommunity: [], expandedSpaces: [])); + communitiesList: updatedCommunities, + expandedCommunity: [], + expandedSpaces: [])); } catch (e) { emit(SpaceTreeErrorState('Error loading communities and spaces: $e')); } } - _onCommunityExpanded(OnCommunityExpanded event, Emitter emit) async { + _onCommunityExpanded( + OnCommunityExpanded event, Emitter emit) async { try { - List updatedExpandedCommunityList = List.from(state.expandedCommunities); + List updatedExpandedCommunityList = + List.from(state.expandedCommunities); if (updatedExpandedCommunityList.contains(event.communityId)) { updatedExpandedCommunityList.remove(event.communityId); @@ -92,13 +97,17 @@ class SpaceTreeBloc extends Bloc { } } - _onCommunitySelected(OnCommunitySelected event, Emitter emit) async { + _onCommunitySelected( + OnCommunitySelected event, Emitter emit) async { try { List updatedSelectedCommunities = List.from(state.selectedCommunities.toSet().toList()); - List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); - List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); - Map> communityAndSpaces = Map.from(state.selectedCommunityAndSpaces); + List updatedSelectedSpaces = + List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = + List.from(state.soldCheck.toSet().toList()); + Map> communityAndSpaces = + Map.from(state.selectedCommunityAndSpaces); List childrenIds = _getAllChildIds(event.children); @@ -129,9 +138,12 @@ class SpaceTreeBloc extends Bloc { try { List updatedSelectedCommunities = List.from(state.selectedCommunities.toSet().toList()); - List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); - List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); - Map> communityAndSpaces = Map.from(state.selectedCommunityAndSpaces); + List updatedSelectedSpaces = + List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = + List.from(state.soldCheck.toSet().toList()); + Map> communityAndSpaces = + Map.from(state.selectedCommunityAndSpaces); List childrenIds = _getAllChildIds(event.children); bool isChildSelected = false; @@ -151,9 +163,11 @@ class SpaceTreeBloc extends Bloc { updatedSelectedSpaces.addAll(childrenIds); } - List spaces = _getThePathToChild(event.communityId, event.spaceId); + List spaces = + _getThePathToChild(event.communityId, event.spaceId); for (String space in spaces) { - if (!updatedSelectedSpaces.contains(space) && !updatedSoldChecks.contains(space)) { + if (!updatedSelectedSpaces.contains(space) && + !updatedSoldChecks.contains(space)) { updatedSoldChecks.add(space); } } @@ -172,7 +186,8 @@ class SpaceTreeBloc extends Bloc { } updatedSoldChecks.remove(event.spaceId); - List parents = _getThePathToChild(event.communityId, event.spaceId); + List parents = + _getThePathToChild(event.communityId, event.spaceId); if (!_parentSelected(parents, updatedSelectedSpaces)) { updatedSoldChecks.removeWhere(parents.contains); } @@ -211,10 +226,11 @@ class SpaceTreeBloc extends Bloc { // Filter communities and expand only those that match the query filteredCommunity = communities.where((community) { - final containsQueryInCommunity = - community.name.toLowerCase().contains(event.searchQuery.toLowerCase()); - final containsQueryInSpaces = - community.spaces.any((space) => _containsQuery(space, event.searchQuery.toLowerCase())); + final containsQueryInCommunity = community.name + .toLowerCase() + .contains(event.searchQuery.toLowerCase()); + final containsQueryInSpaces = community.spaces.any( + (space) => _containsQuery(space, event.searchQuery.toLowerCase())); return containsQueryInCommunity || containsQueryInSpaces; }).toList(); @@ -231,8 +247,8 @@ class SpaceTreeBloc extends Bloc { // Helper function to determine if any space or its children match the search query bool _containsQuery(SpaceModel space, String query) { final matchesSpace = space.name.toLowerCase().contains(query); - final matchesChildren = - space.children.any((child) => _containsQuery(child, query)); // Recursive check for children + final matchesChildren = space.children.any((child) => + _containsQuery(child, query)); // Recursive check for children return matchesSpace || matchesChildren; } @@ -246,14 +262,15 @@ class SpaceTreeBloc extends Bloc { return ids; } - bool _anySpacesSelectedInCommunity( - String communityId, List selectedSpaces, List partialCheckedList) { + bool _anySpacesSelectedInCommunity(String communityId, + List selectedSpaces, List partialCheckedList) { bool result = false; for (var community in state.communityList) { if (community.uuid == communityId) { List ids = _getAllChildIds(community.spaces); for (var id in ids) { - result = selectedSpaces.contains(id) || partialCheckedList.contains(id); + result = + selectedSpaces.contains(id) || partialCheckedList.contains(id); if (result) { return result; } @@ -280,7 +297,8 @@ class SpaceTreeBloc extends Bloc { return ids; } - List _getAllParentsIds(SpaceModel child, String spaceId, List listIds) { + List _getAllParentsIds( + SpaceModel child, String spaceId, List listIds) { List ids = listIds; ids.add(child.uuid ?? ''); diff --git a/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart b/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart index fdbdef88..358bdd48 100644 --- a/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart +++ b/lib/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart @@ -1,5 +1,8 @@ +import 'dart:developer'; + import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/create_subspace_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; @@ -15,19 +18,19 @@ import 'package:syncrow_web/services/product_api.dart'; import 'package:syncrow_web/services/space_mana_api.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/utils/constants/action_enum.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class SpaceManagementBloc extends Bloc { final CommunitySpaceManagementApi _api; final ProductApi _productApi; final SpaceModelManagementApi _spaceModelApi; - final ProjectCubit projectCubit; List? _cachedProducts; - SpaceManagementBloc( - this._api, this._productApi, this._spaceModelApi, this.projectCubit) + SpaceManagementBloc(this._api, this._productApi, this._spaceModelApi) : super(SpaceManagementInitial()) { on(_onLoadCommunityAndSpaces); on(_onUpdateSpacePosition); @@ -43,17 +46,23 @@ class SpaceManagementBloc on(_onLoadSpaceModel); } + void _logEvent(String eventName) { + log('Event Triggered: $eventName'); + } + void _onUpdateCommunity( UpdateCommunityEvent event, Emitter emit, ) async { + _logEvent('UpdateCommunityEvent'); + final previousState = state; try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; emit(SpaceManagementLoading()); final success = await _api.updateCommunity( - event.communityUuid, event.name, projectUuid ?? TempConst.projectId); + event.communityUuid, event.name, projectUuid); if (success) { if (previousState is SpaceManagementLoaded) { final updatedCommunities = @@ -85,7 +94,7 @@ class SpaceManagementBloc Future> fetchSpaceModels( SpaceManagementState previousState) async { try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; List allSpaces = []; List prevSpaceModels = []; @@ -104,7 +113,7 @@ class SpaceManagementBloc while (hasNext) { final spaces = await _spaceModelApi.listSpaceModels( - page: page, projectId: projectUuid ?? TempConst.projectId); + page: page, projectId: projectUuid); if (spaces.isNotEmpty) { allSpaces.addAll(spaces); page++; @@ -113,7 +122,7 @@ class SpaceManagementBloc } } prevSpaceModels = await _spaceModelApi.listSpaceModels( - page: 1, projectId: projectUuid ?? TempConst.projectId); + page: 1, projectId: projectUuid); } return allSpaces; @@ -142,10 +151,9 @@ class SpaceManagementBloc Future> _fetchSpacesForCommunity( String communityUuid) async { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; - return await _api.getSpaceHierarchy( - communityUuid, projectUuid ?? TempConst.projectId); + return await _api.getSpaceHierarchy(communityUuid, projectUuid); } Future _onNewCommunity( @@ -176,7 +184,7 @@ class SpaceManagementBloc BlankStateEvent event, Emitter emit) async { try { final previousState = state; - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; var prevSpaceModels = await fetchSpaceModels(previousState); @@ -191,8 +199,7 @@ class SpaceManagementBloc return; } - final communities = - await _api.fetchCommunities(projectUuid ?? TempConst.projectId); + final communities = await _api.fetchCommunities(projectUuid); final updatedCommunities = await Future.wait(communities.map((community) async { final spaces = await _fetchSpacesForCommunity(community.uuid); @@ -222,14 +229,16 @@ class SpaceManagementBloc LoadCommunityAndSpacesEvent event, Emitter emit, ) async { + _logEvent('LoadCommunityAndSpacesEvent'); + var prevState = state; emit(SpaceManagementLoading()); try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; _onloadProducts(); List communities = - await _api.fetchCommunities(projectUuid ?? TempConst.projectId); + await _api.fetchCommunities(projectUuid); List updatedCommunities = await Future.wait( communities.map((community) async { @@ -263,10 +272,10 @@ class SpaceManagementBloc ) async { try { emit(SpaceManagementLoading()); - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; - final success = await _api.deleteCommunity( - event.communityUuid, projectUuid ?? TempConst.projectId); + final success = + await _api.deleteCommunity(event.communityUuid, projectUuid); if (success) { add(LoadCommunityAndSpacesEvent()); } else { @@ -291,9 +300,10 @@ class SpaceManagementBloc emit(SpaceManagementLoading()); try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + CommunityModel? newCommunity = await _api.createCommunity( - event.name, event.description, projectUuid ?? TempConst.projectId); + event.name, event.description, projectUuid); var prevSpaceModels = await fetchSpaceModels(previousState); if (newCommunity != null) { @@ -436,7 +446,7 @@ class SpaceManagementBloc Future> saveSpacesHierarchically( List spaces, String communityUuid) async { final orderedSpaces = flattenHierarchy(spaces); - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; final parentsToDelete = orderedSpaces.where((space) => space.status == SpaceStatus.deleted && @@ -445,8 +455,7 @@ class SpaceManagementBloc for (var parent in parentsToDelete) { try { if (parent.uuid != null) { - await _api.deleteSpace( - communityUuid, parent.uuid!, projectUuid ?? TempConst.projectId); + await _api.deleteSpace(communityUuid, parent.uuid!, projectUuid); } } catch (e) { rethrow; @@ -459,8 +468,8 @@ class SpaceManagementBloc if (space.uuid != null && space.uuid!.isNotEmpty) { List tagUpdates = []; - final prevSpace = await _api.getSpace( - communityUuid, space.uuid!, projectUuid ?? TempConst.projectId); + final prevSpace = + await _api.getSpace(communityUuid, space.uuid!, projectUuid); final List subspaceUpdates = []; final List? prevSubspaces = prevSpace?.subspaces; final List? newSubspaces = space.subspaces; @@ -539,7 +548,7 @@ class SpaceManagementBloc subspaces: subspaceUpdates, tags: tagUpdates, direction: space.incomingConnection?.direction, - projectId: projectUuid ?? TempConst.projectId); + projectId: projectUuid); } else { // Call create if the space does not have a UUID final List tagBodyModels = space.tags != null @@ -568,7 +577,7 @@ class SpaceManagementBloc spaceModelUuid: space.spaceModel?.uuid, tags: tagBodyModels, subspaces: createSubspaceBodyModels, - projectId: projectUuid ?? TempConst.projectId); + projectId: projectUuid); space.uuid = response?.uuid; } } catch (e) { @@ -608,10 +617,10 @@ class SpaceManagementBloc emit(SpaceManagementLoading()); try { var prevState = state; - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; List communities = - await _api.fetchCommunities(projectUuid ?? TempConst.projectId); + await _api.fetchCommunities(projectUuid); List updatedCommunities = await Future.wait( communities.map((community) async { diff --git a/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart b/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart index 4d03d11f..02000e1a 100644 --- a/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart +++ b/lib/pages/spaces_management/all_spaces/view/spaces_management_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/device_managment/shared/navigate_home_grid_view.dart'; import 'package:syncrow_web/pages/spaces_management/structure_selector/bloc/center_body_bloc.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/bloc/space_management_bloc.dart'; @@ -33,7 +32,6 @@ class SpaceManagementPageState extends State { _api, _productApi, _spaceModelApi, - context.read(), )..add(LoadCommunityAndSpacesEvent()), ), BlocProvider( diff --git a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart index 626052cb..e9f24f0f 100644 --- a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart +++ b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; @@ -88,7 +88,6 @@ class _LoadedSpaceViewState extends State { child: BlocProvider( create: (context) => SpaceModelBloc( api: SpaceModelManagementApi(), - projectCubit: context.read(), initialSpaceModels: _spaceModels, ), child: SpaceModelPage( diff --git a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart index bb609084..7c68e15c 100644 --- a/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/create_space_model_bloc.dart @@ -1,5 +1,5 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/create_space_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/create_space_template_body_model.dart'; @@ -9,20 +9,21 @@ import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_model import 'package:syncrow_web/pages/spaces_management/space_model/models/tag_update_model.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; import 'package:syncrow_web/utils/constants/action_enum.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class CreateSpaceModelBloc extends Bloc { SpaceTemplateModel? _space; final SpaceModelManagementApi _api; - final ProjectCubit _projectCubit; - CreateSpaceModelBloc(this._api, this._projectCubit) - : super(CreateSpaceModelInitial()) { + CreateSpaceModelBloc(this._api) : super(CreateSpaceModelInitial()) { on((event, emit) async { try { - final projectUuid = _projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + late SpaceTemplateModel spaceTemplate = event.spaceTemplate; final tagBodyModels = @@ -45,8 +46,8 @@ class CreateSpaceModelBloc tags: tagBodyModels, subspaceModels: subspaceTemplateBodyModels); - final newSpaceTemplate = await _api.createSpaceModel( - spaceModelBody, projectUuid ?? TempConst.projectId); + final newSpaceTemplate = + await _api.createSpaceModel(spaceModelBody, projectUuid); spaceTemplate.uuid = newSpaceTemplate?.uuid ?? ''; if (newSpaceTemplate != null) { @@ -207,12 +208,11 @@ class CreateSpaceModelBloc on((event, emit) async { try { - final projectUuid = _projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; if (event.spaceTemplate.uuid != null) { final prevSpaceModel = await _api.getSpaceModel( - event.spaceTemplate.uuid ?? '', - projectUuid ?? TempConst.projectId); + event.spaceTemplate.uuid ?? '', projectUuid); final newSpaceModel = event.updatedSpaceTemplate; String? spaceModelName; @@ -295,8 +295,8 @@ class CreateSpaceModelBloc tags: tagUpdates, subspaceModels: subspaceUpdates); - final res = await _api.updateSpaceModel(spaceModelBody, - prevSpaceModel?.uuid ?? '', projectUuid ?? TempConst.projectId); + final res = await _api.updateSpaceModel( + spaceModelBody, prevSpaceModel?.uuid ?? '', projectUuid); if (res != null) { emit(CreateSpaceModelLoaded(newSpaceModel)); diff --git a/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart b/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart index 4464a829..facfe64f 100644 --- a/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart +++ b/lib/pages/spaces_management/space_model/bloc/space_model_bloc.dart @@ -1,18 +1,18 @@ import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_event.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/bloc/space_model_state.dart'; import 'package:syncrow_web/pages/spaces_management/space_model/models/space_template_model.dart'; import 'package:syncrow_web/services/space_model_mang_api.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; class SpaceModelBloc extends Bloc { final SpaceModelManagementApi api; - final ProjectCubit projectCubit; SpaceModelBloc({ required this.api, - required this.projectCubit, required List initialSpaceModels, }) : super(SpaceModelLoaded(spaceModels: initialSpaceModels)) { on(_onCreateSpaceModel); @@ -25,9 +25,10 @@ class SpaceModelBloc extends Bloc { if (currentState is SpaceModelLoaded) { try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; + final newSpaceModel = await api.getSpaceModel( - event.newSpaceModel.uuid ?? '', projectUuid ?? TempConst.projectId); + event.newSpaceModel.uuid ?? '', projectUuid); if (newSpaceModel != null) { final updatedSpaceModels = @@ -46,10 +47,10 @@ class SpaceModelBloc extends Bloc { final currentState = state; if (currentState is SpaceModelLoaded) { try { - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; - final newSpaceModel = await api.getSpaceModel( - event.spaceModelUuid ?? '', projectUuid ?? TempConst.projectId); + final newSpaceModel = + await api.getSpaceModel(event.spaceModelUuid ?? '', projectUuid); if (newSpaceModel != null) { final updatedSpaceModels = currentState.spaceModels.map((model) { return model.uuid == event.spaceModelUuid ? newSpaceModel : model; diff --git a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart index 5beb1fc1..9a89c452 100644 --- a/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart +++ b/lib/pages/spaces_management/space_model/widgets/dialog/create_space_model_dialog.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; import 'package:syncrow_web/pages/common/buttons/cancel_button.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; @@ -53,7 +52,6 @@ class CreateSpaceModelDialog extends StatelessWidget { create: (_) { final bloc = CreateSpaceModelBloc( _spaceModelApi, - context.read(), ); if (spaceModel != null) { bloc.add(UpdateSpaceTemplate(spaceModel!, otherSpaceModels)); diff --git a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart index 02dc0dd3..45fb03fe 100644 --- a/lib/pages/visitor_password/bloc/visitor_password_bloc.dart +++ b/lib/pages/visitor_password/bloc/visitor_password_bloc.dart @@ -3,7 +3,7 @@ import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:intl/intl.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/custom_dialog.dart'; import 'package:syncrow_web/pages/common/hour_picker_dialog.dart'; import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_event.dart'; @@ -14,14 +14,15 @@ import 'package:syncrow_web/pages/visitor_password/model/schedule_model.dart'; import 'package:syncrow_web/services/access_mang_api.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; +import 'package:syncrow_web/utils/constants/strings_manager.dart'; import 'package:syncrow_web/utils/constants/temp_const.dart'; +import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; class VisitorPasswordBloc extends Bloc { - final ProjectCubit projectCubit; - VisitorPasswordBloc(this.projectCubit) : super(VisitorPasswordInitial()) { + VisitorPasswordBloc() : super(VisitorPasswordInitial()) { on(selectUsageFrequency); on(_onFetchDevice); on(selectAccessType); @@ -191,10 +192,9 @@ class VisitorPasswordBloc FetchDevice event, Emitter emit) async { try { emit(DeviceLoaded()); - final projectUuid = projectCubit.state; + final projectUuid = await ProjectManager.getProjectUUID() ?? ''; - data = await AccessMangApi() - .fetchDevices(projectUuid ?? TempConst.projectId); + data = await AccessMangApi().fetchDevices(projectUuid); emit(TableLoaded(data)); } catch (e) { emit(FailedState(e.toString())); diff --git a/lib/pages/visitor_password/view/add_device_dialog.dart b/lib/pages/visitor_password/view/add_device_dialog.dart index 99a50012..d69aa21d 100644 --- a/lib/pages/visitor_password/view/add_device_dialog.dart +++ b/lib/pages/visitor_password/view/add_device_dialog.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:syncrow_web/pages/common/access_device_table.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; @@ -21,7 +21,7 @@ class AddDeviceDialog extends StatelessWidget { Size size = MediaQuery.of(context).size; return BlocProvider( create: (context) => - VisitorPasswordBloc(context.read())..add(FetchDevice()), + VisitorPasswordBloc()..add(FetchDevice()), child: BlocBuilder( builder: (BuildContext context, VisitorPasswordState state) { final visitorBloc = BlocProvider.of(context); diff --git a/lib/pages/visitor_password/view/visitor_password_dialog.dart b/lib/pages/visitor_password/view/visitor_password_dialog.dart index d610e36e..4db5017c 100644 --- a/lib/pages/visitor_password/view/visitor_password_dialog.dart +++ b/lib/pages/visitor_password/view/visitor_password_dialog.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/pages/common/date_time_widget.dart'; import 'package:syncrow_web/pages/common/text_field/custom_web_textfield.dart'; @@ -23,7 +23,7 @@ class VisitorPasswordDialog extends StatelessWidget { Size size = MediaQuery.of(context).size; var text = Theme.of(context).textTheme.bodySmall!.copyWith(color: Colors.black, fontSize: 13); return BlocProvider( - create: (context) => VisitorPasswordBloc(context.read()), + create: (context) => VisitorPasswordBloc(), child: BlocListener( listener: (context, state) { final visitorBloc = BlocProvider.of(context); diff --git a/lib/utils/user_drop_down_menu.dart b/lib/utils/user_drop_down_menu.dart index b0028843..c9fe492e 100644 --- a/lib/utils/user_drop_down_menu.dart +++ b/lib/utils/user_drop_down_menu.dart @@ -4,7 +4,7 @@ import 'package:flutter_svg/svg.dart'; import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; import 'package:syncrow_web/pages/auth/model/user_model.dart'; -import 'package:syncrow_web/pages/common/bloc/project_cubit.dart'; +import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; import 'package:syncrow_web/pages/common/buttons/default_button.dart'; import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/constants/assets.dart'; @@ -220,10 +220,7 @@ class _UserDropdownMenuState extends State { ), GestureDetector( onTap: () { - final projectCubit = - BlocProvider.of(context); - - AuthBloc.logout(context, projectCubit); + AuthBloc.logout(context); context.go(RoutesConst.auth); }, child: SizedBox( From 0c2a092f4de80cccf94568d0f88acc5847ba23df Mon Sep 17 00:00:00 2001 From: Abdullah Alassaf Date: Tue, 18 Feb 2025 12:31:43 +0300 Subject: [PATCH 3/3] Added side tree to space model --- .../widgets/loaded_space_widget.dart | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart index e9f24f0f..dccd7fd9 100644 --- a/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart +++ b/lib/pages/spaces_management/all_spaces/widgets/loaded_space_widget.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:syncrow_web/pages/common/bloc/project_manager.dart'; +import 'package:syncrow_web/pages/space_tree/view/space_tree_view.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/product_model.dart'; import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart'; @@ -75,16 +75,11 @@ class _LoadedSpaceViewState extends State { return Stack( clipBehavior: Clip.none, children: [ - Row( - children: [ - SidebarWidget( - communities: widget.communities, - selectedSpaceUuid: widget.selectedSpace?.uuid ?? - widget.selectedCommunity?.uuid ?? - '', - ), - widget.shouldNavigateToSpaceModelPage - ? Expanded( + widget.shouldNavigateToSpaceModelPage + ? Row( + children: [ + SizedBox(width: 300, child: SpaceTreeView(onSelect: () {})), + Expanded( child: BlocProvider( create: (context) => SpaceModelBloc( api: SpaceModelManagementApi(), @@ -95,8 +90,17 @@ class _LoadedSpaceViewState extends State { onSpaceModelsUpdated: _onSpaceModelsUpdated, ), ), - ) - : CommunityStructureArea( + ), + ], + ) + : Row( + children: [ + SidebarWidget( + communities: widget.communities, + selectedSpaceUuid: + widget.selectedSpace?.uuid ?? widget.selectedCommunity?.uuid ?? '', + ), + CommunityStructureArea( selectedCommunity: widget.selectedCommunity, selectedSpace: widget.selectedSpace, spaces: widget.selectedCommunity?.spaces ?? [], @@ -104,8 +108,8 @@ class _LoadedSpaceViewState extends State { communities: widget.communities, spaceModels: _spaceModels, ), - ], - ), + ], + ), const GradientCanvasBorderWidget(), ], );