From 96f463229c2ad4890223abecbe0ad275e0e67d9a Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 16 Jun 2025 13:12:57 +0300 Subject: [PATCH 1/2] SP-1723-FE-Integrate-Charts-with-API-s-for-AQI-sensor. --- lib/main.dart | 12 +++--- lib/main_dev.dart | 10 +++-- lib/main_staging.dart | 5 +-- lib/pages/home/bloc/home_bloc.dart | 66 ++++++++---------------------- lib/pages/home/view/home_page.dart | 16 +++++++- lib/services/home_api.dart | 18 +++++--- 6 files changed, 57 insertions(+), 70 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 8eb6ce38..31ae414b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,6 @@ import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options_prod.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.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/create_routine_bloc/create_routine_bloc.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'; @@ -21,8 +20,10 @@ import 'package:syncrow_web/utils/theme/theme.dart'; Future main() async { try { - const environment = - String.fromEnvironment('FLAVOR', defaultValue: 'production'); + const environment = String.fromEnvironment( + 'FLAVOR', + defaultValue: 'production', + ); await dotenv.load(fileName: '.env.$environment'); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( @@ -40,7 +41,7 @@ class MyApp extends StatelessWidget { initialLocation: RoutesConst.auth, routes: AppRoutes.getRoutes(), redirect: (context, state) async { - String checkToken = await AuthBloc.getTokenAndValidate(); + final checkToken = await AuthBloc.getTokenAndValidate(); final loggedIn = checkToken == 'Success'; final goingToLogin = state.uri.toString() == RoutesConst.auth; @@ -58,8 +59,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => CreateRoutineBloc(), ), - BlocProvider( - create: (context) => HomeBloc()..add(const FetchUserInfo())), + BlocProvider(create: (context) => HomeBloc()), BlocProvider( create: (context) => VisitorPasswordBloc(), ), diff --git a/lib/main_dev.dart b/lib/main_dev.dart index 578b2c30..8813f6ec 100644 --- a/lib/main_dev.dart +++ b/lib/main_dev.dart @@ -7,7 +7,6 @@ import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options_dev.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.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/create_routine_bloc/create_routine_bloc.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'; @@ -21,7 +20,10 @@ import 'package:syncrow_web/utils/theme/theme.dart'; Future main() async { try { - const environment = String.fromEnvironment('FLAVOR', defaultValue: 'development'); + const environment = String.fromEnvironment( + 'FLAVOR', + defaultValue: 'development', + ); await dotenv.load(fileName: '.env.$environment'); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( @@ -39,7 +41,7 @@ class MyApp extends StatelessWidget { initialLocation: RoutesConst.auth, routes: AppRoutes.getRoutes(), redirect: (context, state) async { - String checkToken = await AuthBloc.getTokenAndValidate(); + final checkToken = await AuthBloc.getTokenAndValidate(); final loggedIn = checkToken == 'Success'; final goingToLogin = state.uri.toString() == RoutesConst.auth; @@ -57,7 +59,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => CreateRoutineBloc(), ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), + BlocProvider(create: (context) => HomeBloc()), BlocProvider( create: (context) => VisitorPasswordBloc(), ), diff --git a/lib/main_staging.dart b/lib/main_staging.dart index e7f95c57..d393eb7b 100644 --- a/lib/main_staging.dart +++ b/lib/main_staging.dart @@ -7,7 +7,6 @@ import 'package:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options_prod.dart'; import 'package:syncrow_web/pages/auth/bloc/auth_bloc.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/create_routine_bloc/create_routine_bloc.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'; @@ -39,7 +38,7 @@ class MyApp extends StatelessWidget { initialLocation: RoutesConst.auth, routes: AppRoutes.getRoutes(), redirect: (context, state) async { - String checkToken = await AuthBloc.getTokenAndValidate(); + final checkToken = await AuthBloc.getTokenAndValidate(); final loggedIn = checkToken == 'Success'; final goingToLogin = state.uri.toString() == RoutesConst.auth; @@ -57,7 +56,7 @@ class MyApp extends StatelessWidget { BlocProvider( create: (context) => CreateRoutineBloc(), ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), + BlocProvider(create: (context) => HomeBloc()), BlocProvider( create: (context) => VisitorPasswordBloc(), ), diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index ad6ed4d8..c1bcba6a 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -13,30 +13,32 @@ 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/constants/assets.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; class HomeBloc extends Bloc { UserModel? user; String terms = ''; String policy = ''; - HomeBloc() : super((HomeInitial())) { - // on(_createNode); + HomeBloc() : super(HomeInitial()) { on(_fetchUserInfo); on(_fetchTerms); on(_fetchPolicy); on(_confirmUserAgreement); } - Future _fetchUserInfo(FetchUserInfo event, Emitter emit) async { + Future _fetchUserInfo( + FetchUserInfo event, + Emitter emit, + ) async { try { - var uuid = + final uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); - user = await HomeApi().fetchUserInfo(uuid); + if (uuid != null) { + user = await HomeApi().fetchUserInfo(uuid); + } - if (user != null && user!.project != null) { + if (user != null && user?.project != null) { await ProjectManager.setProjectUUID(user!.project!.uuid); - } add(FetchTermEvent()); add(FetchPolicyEvent()); @@ -47,7 +49,7 @@ class HomeBloc extends Bloc { } } - Future _fetchTerms(FetchTermEvent event, Emitter emit) async { + Future _fetchTerms(FetchTermEvent event, Emitter emit) async { try { emit(LoadingHome()); terms = await HomeApi().fetchTerms(); @@ -57,22 +59,22 @@ class HomeBloc extends Bloc { } } - Future _fetchPolicy(FetchPolicyEvent event, Emitter emit) async { + Future _fetchPolicy(FetchPolicyEvent event, Emitter emit) async { try { emit(LoadingHome()); policy = await HomeApi().fetchPolicy(); emit(HomeInitial()); } catch (e) { - debugPrint("Error fetching policy: $e"); + debugPrint('Error fetching policy: $e'); return; } } - Future _confirmUserAgreement( + Future _confirmUserAgreement( ConfirmUserAgreementEvent event, Emitter emit) async { try { emit(LoadingHome()); - var uuid = + final uuid = await const FlutterSecureStorage().read(key: UserModel.userUuidKey); policy = await HomeApi().confirmUserAgreements(uuid); emit(PolicyAgreement()); @@ -81,7 +83,7 @@ class HomeBloc extends Bloc { } } - List homeItems = [ + final List homeItems = [ HomeItemModel( title: 'Access Management', icon: Assets.accessIcon, @@ -126,41 +128,5 @@ class HomeBloc extends Bloc { }, color: const Color(0xFF023DFE), ), - - // HomeItemModel( - // title: 'Move in', - // icon: Assets.moveinIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.primaryColor, - // ), - // HomeItemModel( - // title: 'Construction', - // icon: Assets.constructionIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.primaryColor, - // ), - // HomeItemModel( - // title: 'Energy', - // icon: Assets.energyIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), - // HomeItemModel( - // title: 'Integrations', - // icon: Assets.integrationsIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), - // HomeItemModel( - // title: 'Asset', - // icon: Assets.assetIcon, - // active: false, - // onPress: (context) {}, - // color: ColorsManager.slidingBlueColor.withOpacity(0.2), - // ), ]; } diff --git a/lib/pages/home/view/home_page.dart b/lib/pages/home/view/home_page.dart index 9159011f..9661cfd9 100644 --- a/lib/pages/home/view/home_page.dart +++ b/lib/pages/home/view/home_page.dart @@ -1,11 +1,25 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter_bloc/flutter_bloc.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/home/view/home_page_mobile.dart'; import 'package:syncrow_web/pages/home/view/home_page_web.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; -class HomePage extends StatelessWidget with HelperResponsiveLayout { +class HomePage extends StatefulWidget { const HomePage({super.key}); + @override + State createState() => _HomePageState(); +} + +class _HomePageState extends State with HelperResponsiveLayout{ + + @override + void initState() { + context.read().add(const FetchUserInfo()); + super.initState(); + } @override Widget build(BuildContext context) { final isSmallScreen = isSmallScreenSize(context); diff --git a/lib/services/home_api.dart b/lib/services/home_api.dart index c1e67add..40692a40 100644 --- a/lib/services/home_api.dart +++ b/lib/services/home_api.dart @@ -3,14 +3,20 @@ import 'package:syncrow_web/services/api/http_service.dart'; import 'package:syncrow_web/utils/constants/api_const.dart'; class HomeApi { - Future fetchUserInfo(userId) async { - final response = await HTTPService().get( - path: ApiEndpoints.getUser.replaceAll('{userUuid}', userId!), + Future fetchUserInfo(String userId) async { + try { + final response = await HTTPService().get( + path: ApiEndpoints.getUser.replaceAll('{userUuid}', userId), showServerMessage: true, expectedResponseModel: (json) { - return UserModel.fromJson(json); - }); - return response; + final user = UserModel.fromJson(json as Map); + return user; + }, + ); + return response; + } catch (e) { + return null; + } } Future fetchTerms() async { From 5d3380ef82e7b3eba08863c0f0cfdd4af6827a61 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Tue, 17 Jun 2025 14:30:34 +0300 Subject: [PATCH 2/2] fixed merge conflict. --- lib/pages/home/bloc/home_bloc.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/pages/home/bloc/home_bloc.dart b/lib/pages/home/bloc/home_bloc.dart index 7645b03c..c1bcba6a 100644 --- a/lib/pages/home/bloc/home_bloc.dart +++ b/lib/pages/home/bloc/home_bloc.dart @@ -19,11 +19,7 @@ class HomeBloc extends Bloc { String terms = ''; String policy = ''; -<<<<<<< SP-1737-FE-The-user-appears-as-Null-and-the-project-uuid-is-null-when-we-login-in-after-a-credentials-error HomeBloc() : super(HomeInitial()) { -======= - HomeBloc() : super((HomeInitial())) { ->>>>>>> dev on(_fetchUserInfo); on(_fetchTerms); on(_fetchPolicy);