From 6bdd28ec575b73d6cf2f8af447363117e5a04712 Mon Sep 17 00:00:00 2001 From: Faris Armoush Date: Mon, 21 Jul 2025 14:50:29 +0300 Subject: [PATCH] Refactor main entry points to utilize SyncrowApp, removing legacy MyApp implementation and associated dependencies, since there was too much duplicated code. --- lib/main.dart | 71 ++---------------------------------- lib/main_dev.dart | 71 ++---------------------------------- lib/main_staging.dart | 76 ++++----------------------------------- lib/services/locator.dart | 4 +-- lib/syncrow_app.dart | 53 +++++++++++++++++++++++++++ lib/utils/app_routes.dart | 24 ++++++++++--- 6 files changed, 83 insertions(+), 216 deletions(-) create mode 100644 lib/syncrow_app.dart diff --git a/lib/main.dart b/lib/main.dart index a50d2615..071c7433 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,22 +1,9 @@ import 'package:firebase_core/firebase_core.dart'; -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:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.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'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { @@ -33,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/main_dev.dart b/lib/main_dev.dart index 284e2f30..49df196f 100644 --- a/lib/main_dev.dart +++ b/lib/main_dev.dart @@ -1,22 +1,9 @@ import 'package:firebase_core/firebase_core.dart'; -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:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.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'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { @@ -33,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/main_staging.dart b/lib/main_staging.dart index 6389c53a..6e0de3e1 100644 --- a/lib/main_staging.dart +++ b/lib/main_staging.dart @@ -1,26 +1,16 @@ import 'package:firebase_core/firebase_core.dart'; -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:go_router/go_router.dart'; import 'package:syncrow_web/firebase_options.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'; -import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; import 'package:syncrow_web/services/locator.dart'; -import 'package:syncrow_web/utils/app_routes.dart'; -import 'package:syncrow_web/utils/constants/routes_const.dart'; -import 'package:syncrow_web/utils/navigation_service.dart'; -import 'package:syncrow_web/utils/theme/theme.dart'; +import 'package:syncrow_web/syncrow_app.dart'; Future main() async { try { - const environment = String.fromEnvironment('FLAVOR', defaultValue: 'staging'); + const environment = String.fromEnvironment( + 'FLAVOR', + defaultValue: 'staging', + ); await dotenv.load(fileName: '.env.$environment'); WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( @@ -30,59 +20,5 @@ Future main() async { ); initialSetup(); } catch (_) {} - runApp(MyApp()); -} - -class MyApp extends StatelessWidget { - MyApp({super.key}); - - final GoRouter _router = GoRouter( - initialLocation: RoutesConst.auth, - routes: AppRoutes.getRoutes(), - redirect: (context, state) async { - final checkToken = await AuthBloc.getTokenAndValidate(); - final loggedIn = checkToken == 'Success'; - final goingToLogin = state.uri.toString() == RoutesConst.auth; - - if (!loggedIn && !goingToLogin) return RoutesConst.auth; - if (loggedIn && goingToLogin) return RoutesConst.home; - - return null; - }, - ); - - @override - Widget build(BuildContext context) { - return MultiBlocProvider( - providers: [ - BlocProvider( - create: (context) => CreateRoutineBloc(), - ), - BlocProvider(create: (context) => HomeBloc()..add(const FetchUserInfo())), - BlocProvider( - create: (context) => VisitorPasswordBloc(), - ), - BlocProvider( - create: (context) => RoutineBloc(), - ), - BlocProvider( - create: (context) => SpaceTreeBloc(), - ), - ], - child: MaterialApp.router( - debugShowCheckedModeBanner: false, - scrollBehavior: const MaterialScrollBehavior().copyWith( - dragDevices: { - PointerDeviceKind.mouse, - PointerDeviceKind.touch, - PointerDeviceKind.stylus, - PointerDeviceKind.unknown, - }, - ), - key: NavigationService.navigatorKey, - // scaffoldMessengerKey: NavigationService.snackbarKey, - theme: myTheme, - routerConfig: _router, - )); - } + runApp(const SyncrowApp()); } diff --git a/lib/services/locator.dart b/lib/services/locator.dart index 055deb05..83fa5f56 100644 --- a/lib/services/locator.dart +++ b/lib/services/locator.dart @@ -4,9 +4,7 @@ import 'package:syncrow_web/services/api/http_interceptor.dart'; import 'package:syncrow_web/services/api/http_service.dart'; final GetIt serviceLocator = GetIt.instance; -//setupLocator() // to search for dependency injection in flutter -initialSetup() { +void initialSetup() { serviceLocator.registerSingleton(HTTPInterceptor()); - //Base classes serviceLocator.registerSingleton(HTTPService.setupDioClient()); } diff --git a/lib/syncrow_app.dart b/lib/syncrow_app.dart new file mode 100644 index 00000000..54df3351 --- /dev/null +++ b/lib/syncrow_app.dart @@ -0,0 +1,53 @@ +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.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/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'; +import 'package:syncrow_web/pages/visitor_password/bloc/visitor_password_bloc.dart'; +import 'package:syncrow_web/utils/app_routes.dart'; +import 'package:syncrow_web/utils/navigation_service.dart'; +import 'package:syncrow_web/utils/theme/theme.dart'; + +class SyncrowApp extends StatelessWidget { + const SyncrowApp({super.key}); + + @override + Widget build(BuildContext context) { + return MultiBlocProvider( + providers: [ + BlocProvider( + create: (context) => CreateRoutineBloc(), + ), + BlocProvider( + create: (context) => HomeBloc()..add(const FetchUserInfo()), + ), + BlocProvider( + create: (context) => VisitorPasswordBloc(), + ), + BlocProvider( + create: (context) => RoutineBloc(), + ), + BlocProvider( + create: (context) => SpaceTreeBloc(), + ), + ], + child: MaterialApp.router( + debugShowCheckedModeBanner: false, + scrollBehavior: const MaterialScrollBehavior().copyWith( + dragDevices: { + PointerDeviceKind.mouse, + PointerDeviceKind.touch, + PointerDeviceKind.stylus, + PointerDeviceKind.unknown, + }, + ), + key: NavigationService.navigatorKey, + theme: myTheme, + routerConfig: AppRoutes.router, + ), + ); + } +} diff --git a/lib/utils/app_routes.dart b/lib/utils/app_routes.dart index 7663a3f3..aea52478 100644 --- a/lib/utils/app_routes.dart +++ b/lib/utils/app_routes.dart @@ -1,6 +1,7 @@ import 'package:go_router/go_router.dart'; import 'package:syncrow_web/pages/access_management/view/access_management.dart'; import 'package:syncrow_web/pages/analytics/modules/analytics/views/analytics_page.dart'; +import 'package:syncrow_web/pages/auth/bloc/auth_bloc.dart'; import 'package:syncrow_web/pages/auth/view/login_page.dart'; import 'package:syncrow_web/pages/device_managment/all_devices/view/device_managment_page.dart'; import 'package:syncrow_web/pages/home/view/home_page.dart'; @@ -9,9 +10,22 @@ import 'package:syncrow_web/pages/space_management_v2/main_module/views/space_ma import 'package:syncrow_web/pages/visitor_password/view/visitor_password_dialog.dart'; import 'package:syncrow_web/utils/constants/routes_const.dart'; -class AppRoutes { - static List getRoutes() { - return [ +abstract final class AppRoutes { + const AppRoutes._(); + + static final GoRouter router = GoRouter( + initialLocation: RoutesConst.auth, + redirect: (context, state) async { + final checkToken = await AuthBloc.getTokenAndValidate(); + final loggedIn = checkToken == 'Success'; + final goingToLogin = state.uri.toString() == RoutesConst.auth; + + if (!loggedIn && !goingToLogin) return RoutesConst.auth; + if (loggedIn && goingToLogin) return RoutesConst.home; + + return null; + }, + routes: [ GoRoute( path: RoutesConst.auth, builder: (context, state) => const LoginPage(), @@ -43,6 +57,6 @@ class AppRoutes { name: 'analytics', builder: (context, state) => const AnalyticsPage(), ), - ]; - } + ], + ); }