refactor(staff_main): enforce strict architecture and clean code

- Added StaffMainRoutes constants to avoid magic strings
- Enhanced StaffMainNavigator with typed tab navigation
- Updated StaffMainCubit to use typed navigation
- Updated StaffMainModule to use route constants
This commit is contained in:
Achintha Isuru
2026-01-24 11:48:40 -05:00
parent cdc0344280
commit 24da0a4d04
4 changed files with 61 additions and 16 deletions

View File

@@ -1,6 +1,8 @@
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import 'package:staff_main/src/presentation/blocs/staff_main_state.dart'; import 'package:staff_main/src/presentation/blocs/staff_main_state.dart';
import 'package:staff_main/src/presentation/constants/staff_main_routes.dart';
import 'package:staff_main/src/presentation/navigation/staff_main_navigator.dart';
class StaffMainCubit extends Cubit<StaffMainState> implements Disposable { class StaffMainCubit extends Cubit<StaffMainState> implements Disposable {
StaffMainCubit() : super(const StaffMainState()) { StaffMainCubit() : super(const StaffMainState()) {
@@ -14,15 +16,15 @@ class StaffMainCubit extends Cubit<StaffMainState> implements Disposable {
// Detect which tab is active based on the route path // Detect which tab is active based on the route path
// Using contains() to handle child routes and trailing slashes // Using contains() to handle child routes and trailing slashes
if (path.contains('/staff-main/shifts')) { if (path.contains(StaffMainRoutes.shiftsFull)) {
newIndex = 0; newIndex = 0;
} else if (path.contains('/staff-main/payments')) { } else if (path.contains(StaffMainRoutes.paymentsFull)) {
newIndex = 1; newIndex = 1;
} else if (path.contains('/staff-main/home')) { } else if (path.contains(StaffMainRoutes.homeFull)) {
newIndex = 2; newIndex = 2;
} else if (path.contains('/staff-main/clock-in')) { } else if (path.contains(StaffMainRoutes.clockInFull)) {
newIndex = 3; newIndex = 3;
} else if (path.contains('/staff-main/profile')) { } else if (path.contains(StaffMainRoutes.profileFull)) {
newIndex = 4; newIndex = 4;
} }
@@ -36,19 +38,19 @@ class StaffMainCubit extends Cubit<StaffMainState> implements Disposable {
switch (index) { switch (index) {
case 0: case 0:
Modular.to.navigate('/staff-main/shifts'); Modular.to.navigateToShifts();
break; break;
case 1: case 1:
Modular.to.navigate('/staff-main/payments'); Modular.to.navigateToPayments();
break; break;
case 2: case 2:
Modular.to.navigate('/staff-main/home'); Modular.to.navigateToHome();
break; break;
case 3: case 3:
Modular.to.navigate('/staff-main/clock-in'); Modular.to.navigateToClockIn();
break; break;
case 4: case 4:
Modular.to.navigate('/staff-main/profile'); Modular.to.navigateToProfile();
break; break;
} }
// State update will happen via _onRouteChanged // State update will happen via _onRouteChanged

View File

@@ -0,0 +1,16 @@
abstract class StaffMainRoutes {
static const String modulePath = '/staff-main';
static const String shifts = '/shifts';
static const String payments = '/payments';
static const String home = '/home';
static const String clockIn = '/clock-in';
static const String profile = '/profile';
// Full paths
static const String shiftsFull = '$modulePath$shifts';
static const String paymentsFull = '$modulePath$payments';
static const String homeFull = '$modulePath$home';
static const String clockInFull = '$modulePath$clockIn';
static const String profileFull = '$modulePath$profile';
}

View File

@@ -1,10 +1,36 @@
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import '../constants/staff_main_routes.dart';
/// Extension to provide typed navigation for the Staff Main feature. /// Extension to provide typed navigation for the Staff Main feature.
extension StaffMainNavigator on IModularNavigator { extension StaffMainNavigator on IModularNavigator {
/// Navigates to the Staff Main Shell (Home). /// Navigates to the Staff Main Shell (Home).
/// This replaces the current navigation stack. /// This replaces the current navigation stack.
void navigateStaffMain() { void navigateStaffMain() {
navigate('/staff-main/'); navigate('${StaffMainRoutes.modulePath}/');
}
/// Navigates to the Shifts tab.
void navigateToShifts() {
navigate(StaffMainRoutes.shiftsFull);
}
/// Navigates to the Payments tab.
void navigateToPayments() {
navigate(StaffMainRoutes.paymentsFull);
}
/// Navigates to the Home tab.
void navigateToHome() {
navigate(StaffMainRoutes.homeFull);
}
/// Navigates to the Clock In tab.
void navigateToClockIn() {
navigate(StaffMainRoutes.clockInFull);
}
/// Navigates to the Profile tab.
void navigateToProfile() {
navigate(StaffMainRoutes.profileFull);
} }
} }

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_modular/flutter_modular.dart'; import 'package:flutter_modular/flutter_modular.dart';
import 'package:staff_main/src/presentation/blocs/staff_main_cubit.dart'; import 'package:staff_main/src/presentation/blocs/staff_main_cubit.dart';
import 'package:staff_main/src/presentation/constants/staff_main_routes.dart';
import 'package:staff_main/src/presentation/pages/placeholder_page.dart'; import 'package:staff_main/src/presentation/pages/placeholder_page.dart';
import 'package:staff_main/src/presentation/pages/staff_main_page.dart'; import 'package:staff_main/src/presentation/pages/staff_main_page.dart';
@@ -18,26 +19,26 @@ class StaffMainModule extends Module {
child: (BuildContext context) => const StaffMainPage(), child: (BuildContext context) => const StaffMainPage(),
children: <ParallelRoute<dynamic>>[ children: <ParallelRoute<dynamic>>[
ChildRoute<dynamic>( ChildRoute<dynamic>(
'/shifts', StaffMainRoutes.shifts,
child: (BuildContext context) => child: (BuildContext context) =>
const PlaceholderPage(title: 'Shifts'), const PlaceholderPage(title: 'Shifts'),
), ),
ChildRoute<dynamic>( ChildRoute<dynamic>(
'/payments', StaffMainRoutes.payments,
child: (BuildContext context) => child: (BuildContext context) =>
const PlaceholderPage(title: 'Payments'), const PlaceholderPage(title: 'Payments'),
), ),
ChildRoute<dynamic>( ChildRoute<dynamic>(
'/home', StaffMainRoutes.home,
child: (BuildContext context) => const PlaceholderPage(title: 'Home'), child: (BuildContext context) => const PlaceholderPage(title: 'Home'),
), ),
ChildRoute<dynamic>( ChildRoute<dynamic>(
'/clock-in', StaffMainRoutes.clockIn,
child: (BuildContext context) => child: (BuildContext context) =>
const PlaceholderPage(title: 'Clock In'), const PlaceholderPage(title: 'Clock In'),
), ),
ChildRoute<dynamic>( ChildRoute<dynamic>(
'/profile', StaffMainRoutes.profile,
child: (BuildContext context) => child: (BuildContext context) =>
const PlaceholderPage(title: 'Profile'), const PlaceholderPage(title: 'Profile'),
), ),