diff --git a/apps/mobile/apps/client/lib/main.dart b/apps/mobile/apps/client/lib/main.dart index 6eadf04d..131960fb 100644 --- a/apps/mobile/apps/client/lib/main.dart +++ b/apps/mobile/apps/client/lib/main.dart @@ -1,19 +1,20 @@ +import 'package:client_authentication/client_authentication.dart' + as client_authentication; +import 'package:client_create_order/client_create_order.dart' + as client_create_order; +import 'package:client_hubs/client_hubs.dart' as client_hubs; +import 'package:client_main/client_main.dart' as client_main; +import 'package:client_settings/client_settings.dart' as client_settings; import 'package:core_localization/core_localization.dart' as core_localization; import 'package:design_system/design_system.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_modular/flutter_modular.dart'; -import 'package:client_authentication/client_authentication.dart' - as client_authentication; -import 'package:client_main/client_main.dart' as client_main; -import 'package:client_settings/client_settings.dart' as client_settings; -import 'package:client_hubs/client_hubs.dart' as client_hubs; -import 'package:client_create_order/client_create_order.dart' - as client_create_order; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/foundation.dart'; import 'package:krow_core/core.dart'; + import 'firebase_options.dart'; void main() async { @@ -32,23 +33,23 @@ class AppModule extends Module { @override void routes(RouteManager r) { // Initial route points to the client authentication flow - r.module('/', module: client_authentication.ClientAuthenticationModule()); + r.module(ClientPaths.root, module: client_authentication.ClientAuthenticationModule()); // Client main shell with bottom navigation (includes home as a child) - r.module('/client-main', module: client_main.ClientMainModule()); + r.module(ClientPaths.main, module: client_main.ClientMainModule()); // Client settings route r.module( - '/client-settings', + ClientPaths.settings, module: client_settings.ClientSettingsModule(), ); // Client hubs route - r.module('/client-hubs', module: client_hubs.ClientHubsModule()); + r.module(ClientPaths.hubs, module: client_hubs.ClientHubsModule()); // Client create order route r.module( - '/create-order', + ClientPaths.createOrder, module: client_create_order.ClientCreateOrderModule(), ); } diff --git a/apps/mobile/packages/core/lib/src/routing/client/navigator.dart b/apps/mobile/packages/core/lib/src/routing/client/navigator.dart index da5d537e..024e4299 100644 --- a/apps/mobile/packages/core/lib/src/routing/client/navigator.dart +++ b/apps/mobile/packages/core/lib/src/routing/client/navigator.dart @@ -48,7 +48,7 @@ extension ClientNavigator on IModularNavigator { /// This is typically called after successful authentication or when /// returning to the main application from a deep feature. /// - /// Uses absolute navigation to ensure proper routing from any context. + /// Uses pushNamed to avoid trailing slash issues with navigate(). void toClientHome() { navigate(ClientPaths.home); } diff --git a/apps/mobile/packages/core/lib/src/routing/client/route_paths.dart b/apps/mobile/packages/core/lib/src/routing/client/route_paths.dart index 6c90b4c7..f7172e11 100644 --- a/apps/mobile/packages/core/lib/src/routing/client/route_paths.dart +++ b/apps/mobile/packages/core/lib/src/routing/client/route_paths.dart @@ -16,7 +16,21 @@ class ClientPaths { /// Generate child route based on the given route and parent route /// /// This is useful for creating nested routes within modules. - static String childRoute(String parent, String child) => child.replaceFirst(parent, ''); + static String childRoute(String parent, String child) { + final String childPath = child.replaceFirst(parent, ''); + + // check if the child path is empty + if (childPath.isEmpty) { + return '/'; + } + + // ensure the child path starts with a '/' + if (!childPath.startsWith('/')) { + return '/$childPath'; + } + + return childPath; + } // ========================================================================== // AUTHENTICATION diff --git a/apps/mobile/packages/core/lib/src/routing/staff/route_paths.dart b/apps/mobile/packages/core/lib/src/routing/staff/route_paths.dart index c4054c71..410ad4fd 100644 --- a/apps/mobile/packages/core/lib/src/routing/staff/route_paths.dart +++ b/apps/mobile/packages/core/lib/src/routing/staff/route_paths.dart @@ -16,8 +16,22 @@ class StaffPaths { /// Generate child route based on the given route and parent route /// /// This is useful for creating nested routes within modules. - static String childRoute(String parent, String child) => child.replaceFirst(parent, ''); + static String childRoute(String parent, String child) { + final String childPath = child.replaceFirst(parent, ''); + + // check if the child path is empty + if (childPath.isEmpty) { + return '/'; + } + + // ensure the child path starts with a '/' + if (!childPath.startsWith('/')) { + return '/$childPath'; + } + return childPath; + } + // ========================================================================== // AUTHENTICATION // ========================================================================== @@ -93,7 +107,8 @@ class StaffPaths { /// Personal information onboarding. /// /// Collect basic personal information during staff onboarding. - static const String onboardingPersonalInfo = '/worker-main/onboarding/personal-info'; + static const String onboardingPersonalInfo = + '/worker-main/onboarding/personal-info'; /// Emergency contact information. /// diff --git a/apps/mobile/packages/features/client/authentication/lib/src/presentation/pages/client_sign_in_page.dart b/apps/mobile/packages/features/client/authentication/lib/src/presentation/pages/client_sign_in_page.dart index e8d74a6f..64195172 100644 --- a/apps/mobile/packages/features/client/authentication/lib/src/presentation/pages/client_sign_in_page.dart +++ b/apps/mobile/packages/features/client/authentication/lib/src/presentation/pages/client_sign_in_page.dart @@ -37,7 +37,7 @@ class ClientSignInPage extends StatelessWidget { final TranslationsClientAuthenticationSignInPageEn i18n = t.client_authentication.sign_in_page; final ClientAuthBloc authBloc = Modular.get(); - return BlocProvider.value( + return BlocProvider.value( value: authBloc, child: BlocConsumer( listener: (BuildContext context, ClientAuthState state) { diff --git a/apps/mobile/packages/features/client/home/lib/client_home.dart b/apps/mobile/packages/features/client/home/lib/client_home.dart index 0e6f9dc7..37bc4bc0 100644 --- a/apps/mobile/packages/features/client/home/lib/client_home.dart +++ b/apps/mobile/packages/features/client/home/lib/client_home.dart @@ -47,6 +47,9 @@ class ClientHomeModule extends Module { @override void routes(RouteManager r) { - r.child(ClientPaths.childRoute(ClientPaths.home, ClientPaths.home), child: (_) => const ClientHomePage()); + r.child( + ClientPaths.childRoute(ClientPaths.home, ClientPaths.home), + child: (_) => const ClientHomePage(), + ); } }