From fa6fa90bb85b9496c81c61c3a23250b04c8ea4ca Mon Sep 17 00:00:00 2001 From: Achintha Isuru Date: Wed, 4 Feb 2026 17:13:55 -0500 Subject: [PATCH] feat: implement child route management for client and staff modules; enhance routing structure for better navigation --- .../lib/src/routing/client/route_paths.dart | 8 +++++++ .../lib/src/routing/staff/route_paths.dart | 8 +++++++ .../billing/lib/src/billing_module.dart | 3 ++- .../lib/src/coverage_module.dart | 4 +++- .../lib/src/client_main_module.dart | 23 +++++++++++++++---- .../presentation/blocs/client_main_cubit.dart | 4 ++-- .../lib/src/create_order_module.dart | 8 +++---- .../features/client/home/lib/client_home.dart | 4 +++- .../features/client/hubs/lib/client_hubs.dart | 3 ++- .../client/settings/lib/client_settings.dart | 6 ++++- 10 files changed, 55 insertions(+), 16 deletions(-) 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 a47922d1..6c90b4c7 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 @@ -10,6 +10,14 @@ class ClientPaths { ClientPaths._(); + // ========================================================================== + // CHILD ROUTE MANAGEMENT + // ========================================================================== + /// 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, ''); + // ========================================================================== // 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 23a5f11b..c4054c71 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 @@ -10,6 +10,14 @@ class StaffPaths { StaffPaths._(); + // ========================================================================== + // CHILD ROUTE MANAGEMENT + // ========================================================================== + /// 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, ''); + // ========================================================================== // AUTHENTICATION // ========================================================================== diff --git a/apps/mobile/packages/features/client/billing/lib/src/billing_module.dart b/apps/mobile/packages/features/client/billing/lib/src/billing_module.dart index 2a7f9677..2db654ae 100644 --- a/apps/mobile/packages/features/client/billing/lib/src/billing_module.dart +++ b/apps/mobile/packages/features/client/billing/lib/src/billing_module.dart @@ -1,4 +1,5 @@ import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_data_connect/krow_data_connect.dart'; import 'data/repositories_impl/billing_repository_impl.dart'; @@ -47,6 +48,6 @@ class BillingModule extends Module { @override void routes(RouteManager r) { - r.child('/', child: (_) => const BillingPage()); + r.child(ClientPaths.childRoute(ClientPaths.billing, ClientPaths.billing), child: (_) => const BillingPage()); } } diff --git a/apps/mobile/packages/features/client/client_coverage/lib/src/coverage_module.dart b/apps/mobile/packages/features/client/client_coverage/lib/src/coverage_module.dart index 19e3bd5a..c0cc1258 100644 --- a/apps/mobile/packages/features/client/client_coverage/lib/src/coverage_module.dart +++ b/apps/mobile/packages/features/client/client_coverage/lib/src/coverage_module.dart @@ -1,4 +1,5 @@ import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_data_connect/krow_data_connect.dart'; import 'data/repositories_impl/coverage_repository_impl.dart'; import 'domain/repositories/coverage_repository.dart'; @@ -31,6 +32,7 @@ class CoverageModule extends Module { @override void routes(RouteManager r) { - r.child('/', child: (_) => const CoveragePage()); + r.child(ClientPaths.childRoute(ClientPaths.coverage, ClientPaths.coverage), + child: (_) => const CoveragePage()); } } diff --git a/apps/mobile/packages/features/client/client_main/lib/src/client_main_module.dart b/apps/mobile/packages/features/client/client_main/lib/src/client_main_module.dart index 9b4d7a67..78af8afa 100644 --- a/apps/mobile/packages/features/client/client_main/lib/src/client_main_module.dart +++ b/apps/mobile/packages/features/client/client_main/lib/src/client_main_module.dart @@ -3,6 +3,7 @@ import 'package:client_home/client_home.dart'; import 'package:client_coverage/client_coverage.dart'; import 'package:flutter/material.dart'; import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:view_orders/view_orders.dart'; import 'presentation/blocs/client_main_cubit.dart'; @@ -21,12 +22,24 @@ class ClientMainModule extends Module { '/', child: (BuildContext context) => const ClientMainPage(), children: >[ - ModuleRoute('/home', module: ClientHomeModule()), - ModuleRoute('/coverage', module: CoverageModule()), - ModuleRoute('/billing', module: BillingModule()), - ModuleRoute('/orders', module: ViewOrdersModule()), + ModuleRoute( + ClientPaths.childRoute(ClientPaths.main, ClientPaths.home), + module: ClientHomeModule(), + ), + ModuleRoute( + ClientPaths.childRoute(ClientPaths.main, ClientPaths.coverage), + module: CoverageModule(), + ), + ModuleRoute( + ClientPaths.childRoute(ClientPaths.main, ClientPaths.billing), + module: BillingModule(), + ), + ModuleRoute( + ClientPaths.childRoute(ClientPaths.main, ClientPaths.orders), + module: ViewOrdersModule(), + ), ChildRoute( - '/reports', + ClientPaths.childRoute(ClientPaths.main, ClientPaths.reports), child: (BuildContext context) => const PlaceholderPage(title: 'Reports'), ), diff --git a/apps/mobile/packages/features/client/client_main/lib/src/presentation/blocs/client_main_cubit.dart b/apps/mobile/packages/features/client/client_main/lib/src/presentation/blocs/client_main_cubit.dart index fb86b725..9729a66d 100644 --- a/apps/mobile/packages/features/client/client_main/lib/src/presentation/blocs/client_main_cubit.dart +++ b/apps/mobile/packages/features/client/client_main/lib/src/presentation/blocs/client_main_cubit.dart @@ -21,7 +21,7 @@ class ClientMainCubit extends Cubit implements Disposable { newIndex = 1; } else if (path.contains(ClientPaths.home)) { newIndex = 2; - } else if (path.contains(ClientPaths.viewOrders)) { + } else if (path.contains(ClientPaths.orders)) { newIndex = 3; } else if (path.contains(ClientPaths.reports)) { newIndex = 4; @@ -46,7 +46,7 @@ class ClientMainCubit extends Cubit implements Disposable { Modular.to.navigate(ClientPaths.home); break; case 3: - Modular.to.navigate(ClientPaths.viewOrders); + Modular.to.navigate(ClientPaths.orders); break; case 4: Modular.to.navigate(ClientPaths.reports); diff --git a/apps/mobile/packages/features/client/create_order/lib/src/create_order_module.dart b/apps/mobile/packages/features/client/create_order/lib/src/create_order_module.dart index 251b7a47..db759e08 100644 --- a/apps/mobile/packages/features/client/create_order/lib/src/create_order_module.dart +++ b/apps/mobile/packages/features/client/create_order/lib/src/create_order_module.dart @@ -59,19 +59,19 @@ class ClientCreateOrderModule extends Module { child: (BuildContext context) => const ClientCreateOrderPage(), ); r.child( - ClientPaths.createOrderRapid.replaceFirst(ClientPaths.createOrder, ''), + ClientPaths.childRoute(ClientPaths.createOrder, ClientPaths.createOrderRapid), child: (BuildContext context) => const RapidOrderPage(), ); r.child( - ClientPaths.createOrderOneTime.replaceFirst(ClientPaths.createOrder, ''), + ClientPaths.childRoute(ClientPaths.createOrder, ClientPaths.createOrderOneTime), child: (BuildContext context) => const OneTimeOrderPage(), ); r.child( - ClientPaths.createOrderRecurring.replaceFirst(ClientPaths.createOrder, ''), + ClientPaths.childRoute(ClientPaths.createOrder, ClientPaths.createOrderRecurring), child: (BuildContext context) => const RecurringOrderPage(), ); r.child( - ClientPaths.createOrderPermanent.replaceFirst(ClientPaths.createOrder, ''), + ClientPaths.childRoute(ClientPaths.createOrder, ClientPaths.createOrderPermanent), child: (BuildContext context) => const PermanentOrderPage(), ); } 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 94507f8d..0e6f9dc7 100644 --- a/apps/mobile/packages/features/client/home/lib/client_home.dart +++ b/apps/mobile/packages/features/client/home/lib/client_home.dart @@ -1,5 +1,7 @@ import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_data_connect/krow_data_connect.dart'; + import 'src/data/repositories_impl/home_repository_impl.dart'; import 'src/domain/repositories/home_repository_interface.dart'; import 'src/domain/usecases/get_dashboard_data_usecase.dart'; @@ -45,6 +47,6 @@ class ClientHomeModule extends Module { @override void routes(RouteManager r) { - r.child('/', child: (_) => const ClientHomePage()); + r.child(ClientPaths.childRoute(ClientPaths.home, ClientPaths.home), child: (_) => const ClientHomePage()); } } diff --git a/apps/mobile/packages/features/client/hubs/lib/client_hubs.dart b/apps/mobile/packages/features/client/hubs/lib/client_hubs.dart index 6a427c37..b3422228 100644 --- a/apps/mobile/packages/features/client/hubs/lib/client_hubs.dart +++ b/apps/mobile/packages/features/client/hubs/lib/client_hubs.dart @@ -1,6 +1,7 @@ library client_hubs; import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'package:krow_data_connect/krow_data_connect.dart'; import 'package:firebase_auth/firebase_auth.dart' as firebase; import 'src/data/repositories_impl/hub_repository_impl.dart'; @@ -48,6 +49,6 @@ class ClientHubsModule extends Module { @override void routes(RouteManager r) { - r.child('/', child: (_) => const ClientHubsPage()); + r.child(ClientPaths.childRoute(ClientPaths.hubs, ClientPaths.hubs), child: (_) => const ClientHubsPage()); } } diff --git a/apps/mobile/packages/features/client/settings/lib/client_settings.dart b/apps/mobile/packages/features/client/settings/lib/client_settings.dart index d5506dc9..1af20a06 100644 --- a/apps/mobile/packages/features/client/settings/lib/client_settings.dart +++ b/apps/mobile/packages/features/client/settings/lib/client_settings.dart @@ -1,5 +1,6 @@ import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_modular/flutter_modular.dart'; +import 'package:krow_core/core.dart'; import 'src/data/repositories_impl/settings_repository_impl.dart'; import 'src/domain/repositories/settings_repository_interface.dart'; import 'src/domain/usecases/sign_out_usecase.dart'; @@ -26,6 +27,9 @@ class ClientSettingsModule extends Module { @override void routes(RouteManager r) { - r.child('/', child: (_) => const ClientSettingsPage()); + r.child( + ClientPaths.childRoute(ClientPaths.settings, ClientPaths.settings), + child: (_) => const ClientSettingsPage(), + ); } }