From 010176cc25af2a3d3654a891470ab238a3166b8d Mon Sep 17 00:00:00 2001 From: Abdullah Alassaf Date: Thu, 20 Feb 2025 12:53:59 +0300 Subject: [PATCH] Added clear data and cached events in space tree --- lib/pages/auth/bloc/auth_bloc.dart | 39 +++++++------------ lib/pages/home/bloc/home_bloc.dart | 20 +++++----- .../space_tree/bloc/space_tree_bloc.dart | 38 ++++++++++++++++++ .../space_tree/bloc/space_tree_event.dart | 4 ++ 4 files changed, 67 insertions(+), 34 deletions(-) diff --git a/lib/pages/auth/bloc/auth_bloc.dart b/lib/pages/auth/bloc/auth_bloc.dart index c2aa01a4..b22dae7b 100644 --- a/lib/pages/auth/bloc/auth_bloc.dart +++ b/lib/pages/auth/bloc/auth_bloc.dart @@ -10,9 +10,12 @@ 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_manager.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.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'; +import 'package:syncrow_web/utils/navigation_service.dart'; import 'package:syncrow_web/utils/snack_bar.dart'; class AuthBloc extends Bloc { @@ -32,8 +35,7 @@ class AuthBloc extends Bloc { ////////////////////////////// forget password ////////////////////////////////// final TextEditingController forgetEmailController = TextEditingController(); - final TextEditingController forgetPasswordController = - TextEditingController(); + final TextEditingController forgetPasswordController = TextEditingController(); final TextEditingController forgetOtp = TextEditingController(); final forgetFormKey = GlobalKey(); final forgetEmailKey = GlobalKey(); @@ -50,8 +52,7 @@ class AuthBloc extends Bloc { return; } _remainingTime = 1; - add(UpdateTimerEvent( - remainingTime: _remainingTime, isButtonEnabled: false)); + add(UpdateTimerEvent(remainingTime: _remainingTime, isButtonEnabled: false)); try { forgetEmailValidate = ''; _remainingTime = (await AuthenticationAPI.sendOtp( @@ -88,8 +89,7 @@ class AuthBloc extends Bloc { _timer?.cancel(); add(const UpdateTimerEvent(remainingTime: 0, isButtonEnabled: true)); } else { - add(UpdateTimerEvent( - remainingTime: _remainingTime, isButtonEnabled: false)); + add(UpdateTimerEvent(remainingTime: _remainingTime, isButtonEnabled: false)); } }); } @@ -99,8 +99,7 @@ class AuthBloc extends Bloc { emit(const TimerState(isButtonEnabled: true, remainingTime: 0)); } - Future changePassword( - ChangePasswordEvent event, Emitter emit) async { + Future changePassword(ChangePasswordEvent event, Emitter emit) async { emit(LoadingForgetState()); try { var response = await AuthenticationAPI.verifyOtp( @@ -116,8 +115,7 @@ class AuthBloc extends Bloc { } } on DioException catch (e) { final errorData = e.response!.data; - String errorMessage = - errorData['error']['message'] ?? 'something went wrong'; + String errorMessage = errorData['error']['message'] ?? 'something went wrong'; validate = errorMessage; emit(AuthInitialState()); } @@ -131,9 +129,7 @@ class AuthBloc extends Bloc { } void _onUpdateTimer(UpdateTimerEvent event, Emitter emit) { - emit(TimerState( - isButtonEnabled: event.isButtonEnabled, - remainingTime: event.remainingTime)); + emit(TimerState(isButtonEnabled: event.isButtonEnabled, remainingTime: event.remainingTime)); } ///////////////////////////////////// login ///////////////////////////////////// @@ -183,15 +179,13 @@ class AuthBloc extends Bloc { if (token.accessTokenIsNotEmpty) { FlutterSecureStorage storage = const FlutterSecureStorage(); - await storage.write( - key: Token.loginAccessTokenKey, value: token.accessToken); + await storage.write(key: Token.loginAccessTokenKey, value: token.accessToken); const FlutterSecureStorage().write( key: UserModel.userUuidKey, value: Token.decodeToken(token.accessToken)['uuid'].toString()); user = UserModel.fromToken(token); loginEmailController.clear(); loginPasswordController.clear(); - debugPrint("token " + token.accessToken); emit(LoginSuccess()); } else { emit(const LoginFailure(error: 'Something went wrong')); @@ -342,14 +336,12 @@ class AuthBloc extends Bloc { static Future getTokenAndValidate() async { try { const storage = FlutterSecureStorage(); - final firstLaunch = await SharedPreferencesHelper.readBoolFromSP( - StringsManager.firstLaunch) ?? - true; + final firstLaunch = + await SharedPreferencesHelper.readBoolFromSP(StringsManager.firstLaunch) ?? true; if (firstLaunch) { storage.deleteAll(); } - await SharedPreferencesHelper.saveBoolToSP( - StringsManager.firstLaunch, false); + await SharedPreferencesHelper.saveBoolToSP(StringsManager.firstLaunch, false); final value = await storage.read(key: Token.loginAccessTokenKey) ?? ''; if (value.isEmpty) { return 'Token not found'; @@ -402,9 +394,7 @@ class AuthBloc extends Bloc { final String formattedTime = [ if (days > 0) '${days}d', // Append 'd' for days if (days > 0 || hours > 0) - hours - .toString() - .padLeft(2, '0'), // Show hours if there are days or hours + hours.toString().padLeft(2, '0'), // Show hours if there are days or hours minutes.toString().padLeft(2, '0'), seconds.toString().padLeft(2, '0'), ].join(':'); @@ -445,6 +435,7 @@ class AuthBloc extends Bloc { static Future logout(BuildContext context) async { final storage = FlutterSecureStorage(); ProjectManager.clearProjectUUID(); + context.read().add(ClearAllData()); storage.deleteAll(); } } diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index f23e87ed..25b8b98d 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -2,20 +2,19 @@ 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_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'; import 'package:syncrow_web/pages/routines/bloc/routine_bloc/routine_bloc.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; +import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart'; 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'; +import 'package:syncrow_web/utils/navigation_service.dart'; class HomeBloc extends Bloc { // final Graph graph = Graph()..isTree = true; @@ -52,12 +51,12 @@ class HomeBloc extends Bloc { Future _fetchUserInfo(FetchUserInfo event, Emitter emit) async { try { - var uuid = - await const FlutterSecureStorage().read(key: UserModel.userUuidKey); + var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); user = await HomeApi().fetchUserInfo(uuid); if (user != null && user!.project != null) { await ProjectManager.setProjectUUID(user!.project!.uuid); + NavigationService.navigatorKey.currentContext!.read().add(InitialEvent()); } add(FetchTermEvent()); add(FetchPolicyEvent()); @@ -93,12 +92,10 @@ class HomeBloc extends Bloc { } } - Future _confirmUserAgreement( - ConfirmUserAgreementEvent event, Emitter emit) async { + Future _confirmUserAgreement(ConfirmUserAgreementEvent event, Emitter emit) async { try { emit(LoadingHome()); - var uuid = - await const FlutterSecureStorage().read(key: UserModel.userUuidKey); + var uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); policy = await HomeApi().confirmUserAgreements(uuid); emit(PolicyAgreement()); } catch (e) { @@ -122,6 +119,7 @@ class HomeBloc extends Bloc { icon: Assets.accessIcon, active: true, onPress: (context) { + context.read().add(ClearCachedData()); context.go(RoutesConst.accessManagementPage); }, color: null, @@ -131,6 +129,7 @@ class HomeBloc extends Bloc { icon: Assets.spaseManagementIcon, active: true, onPress: (context) { + context.read().add(ClearCachedData()); context.go(RoutesConst.spacesManagementPage); }, color: ColorsManager.primaryColor, @@ -140,6 +139,7 @@ class HomeBloc extends Bloc { icon: Assets.devicesIcon, active: true, onPress: (context) { + context.read().add(ClearCachedData()); BlocProvider.of(context) .add(const TriggerSwitchTabsEvent(isRoutineTab: false)); context.go(RoutesConst.deviceManagementPage); diff --git a/lib/pages/space_tree/bloc/space_tree_bloc.dart b/lib/pages/space_tree/bloc/space_tree_bloc.dart index 6c3cee82..c2a26164 100644 --- a/lib/pages/space_tree/bloc/space_tree_bloc.dart +++ b/lib/pages/space_tree/bloc/space_tree_bloc.dart @@ -14,6 +14,8 @@ class SpaceTreeBloc extends Bloc { on(_onCommunitySelected); on(_onSpaceSelected); on(_onSearch); + on(_clearAllData); + on(_clearCachedData); } _fetchSpaces(InitialEvent event, Emitter emit) async { @@ -241,6 +243,42 @@ class SpaceTreeBloc extends Bloc { } } + _clearAllData(ClearAllData event, Emitter emit) async { + try { + emit(state.copyWith( + communitiesList: [], + filteredCommunity: [], + isSearching: false, + soldCheck: [], + selectedSpaces: [], + selectedCommunities: [], + selectedCommunityAndSpaces: {}, + searchQuery: '', + expandedSpaces: [], + expandedCommunity: [])); + } catch (e) { + emit(const SpaceTreeErrorState('Something went wrong')); + } + } + + _clearCachedData(ClearCachedData event, Emitter emit) async { + try { + emit(state.copyWith( + communitiesList: state.communityList, + filteredCommunity: [], + isSearching: false, + soldCheck: [], + selectedSpaces: [], + selectedCommunities: [], + selectedCommunityAndSpaces: {}, + searchQuery: '', + expandedSpaces: [], + expandedCommunity: [])); + } catch (e) { + emit(const SpaceTreeErrorState('Something went wrong')); + } + } + // 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); diff --git a/lib/pages/space_tree/bloc/space_tree_event.dart b/lib/pages/space_tree/bloc/space_tree_event.dart index 5a44d7fb..e8fa996f 100644 --- a/lib/pages/space_tree/bloc/space_tree_event.dart +++ b/lib/pages/space_tree/bloc/space_tree_event.dart @@ -68,3 +68,7 @@ class SearchQueryEvent extends SpaceTreeEvent { @override List get props => [searchQuery]; } + +class ClearAllData extends SpaceTreeEvent {} + +class ClearCachedData extends SpaceTreeEvent {}