Files
mih-project/Frontend/lib/mih_config/mih_routeGenerator.dart

359 lines
13 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_print_prevew.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_objects/arguments.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/Example/package_test.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_notification_message.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/about_mih.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/mih_policy_tos_ext/mih_privacy_polocy_external.dart';
import 'package:mzansi_innovation_hub/mih_packages/about_mih/mih_policy_tos_ext/mih_terms_of_service_external.dart';
import 'package:mzansi_innovation_hub/mih_packages/access_review/mih_access.dart';
import 'package:mzansi_innovation_hub/mih_packages/authentication/auth_check.dart';
import 'package:mzansi_innovation_hub/mih_packages/authentication/forgot_password.dart';
import 'package:mzansi_innovation_hub/mih_packages/authentication/reset_password.dart';
import 'package:mzansi_innovation_hub/mih_packages/calculator/mih_calculator.dart';
import 'package:mzansi_innovation_hub/mih_packages/calendar/mzansi_calendar.dart';
import 'package:mzansi_innovation_hub/mih_packages/mih_authentication/mih_authentication.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/mzansi_ai.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/mzansi_directory.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/mzansi_business_profile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/mzansi_business_profile_view.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/business_profile/profile_business_add.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/mzansi_profile.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_profile/personal_profile/mzansi_profile_view.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/components/mih_barcode_scanner.dart';
import 'package:mzansi_innovation_hub/mih_packages/mzansi_wallet/mih_wallet.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_manager/pat_manager.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/add_or_view_patient.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/components/full_screen_file.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_add.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_edit.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/patient_profile.dart';
// 1. Define Route Names as Constants
// This prevents typos and allows for easier refactoring.
// Consider moving this to a separate `lib/constants/app_routes.dart` file
// if your project grows larger.
class AppRoutes {
// External
static const String resetPasswordExternal = '/auth/reset-password';
static const String privacyPolicyExternal = '/privacy-policy';
static const String termsOfServiceExternal = '/terms-of-service';
// Internal
static const String authCheck = '/';
static const String mihAuthentication = '/mih-authentication';
static const String notifications = '/notifications';
static const String forgotPassword = '/forgot-password';
static const String aboutMih = '/about';
static const String mzansiProfile = '/mzansi-profile';
static const String mzansiProfileView = '/mzansi-profile/view';
static const String businessProfileSetup = '/business-profile/set-up';
static const String businessProfileManage = '/business-profile/manage';
static const String businessProfileView = '/business-profile/view';
static const String patientProfile = '/patient-profile';
static const String patientProfileSetup = '/patient-profile/set-up';
static const String patientProfileEdit = '/patient-profile/edit';
static const String mzansiWallet = '/mzansi-wallet';
static const String mzansiDirectory = '/mzansi-directory';
static const String mihAccess = '/mih-access';
static const String calendar = '/calendar';
static const String appointments = '/appointments';
static const String patientManager = '/patient-manager';
static const String patientManagerPatient = '/patient-manager/patient';
static const String fileViewer = '/file-veiwer';
static const String printPreview = '/file-veiwer/print-preview';
static const String barcodeScanner = '/scanner';
static const String calculator = '/calculator';
static const String mzansiAi = '/mzansi-ai';
static const String packageDevTest = '/package-dev';
}
class RouteGenerator {
static Route<dynamic> generateRoute(RouteSettings settings) {
final args = settings.arguments;
final extPath =
Uri.base.path; // Moved outside the internal switch for clarity
// 2. Prioritize External Links
// Using an if-else if chain for external routes might be slightly
// more performant than a switch if there are many external routes,
// as it avoids string hashing for each case. For a small number,
// a switch is also fine.
if (extPath == AppRoutes.resetPasswordExternal) {
return MaterialPageRoute(
settings: settings,
builder: (_) => ResetPassword(token: Uri.base.queryParameters['token']),
);
} else if (extPath == AppRoutes.privacyPolicyExternal) {
return MaterialPageRoute(
settings: settings,
builder: (_) => const MIHPrivacyPolocyExternal(),
);
} else if (extPath == AppRoutes.termsOfServiceExternal) {
return MaterialPageRoute(
settings: settings,
builder: (_) => const MIHTermsOfServiceExternal(),
);
}
// 3. Handle Internal Navigation with a Switch Statement
// This switch now only deals with internal app routes, making it cleaner.
switch (settings.name) {
case AppRoutes.authCheck:
if (args is AuthArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => AuthCheck(
personalSelected: args.personalSelected,
firstBoot: args.firstBoot,
),
);
}
break; // Use break and fall through to _errorRoute if argument type is wrong
case AppRoutes.mihAuthentication:
// if (args is AuthArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MihAuthentication(),
);
// }
// break; // Use break and fall through to _errorRoute if argument type is wrong
case AppRoutes.mzansiDirectory:
if (args is MzansiDirectoryArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiDirectory(arguments: args),
);
}
break;
case AppRoutes.notifications:
if (args is NotificationArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MIHNotificationMessage(arguments: args),
);
}
break;
case AppRoutes.forgotPassword:
return MaterialPageRoute(
settings: settings, builder: (_) => const ForgotPassword());
case AppRoutes.aboutMih:
if (args is int) {
return MaterialPageRoute(
settings: settings,
builder: (_) => AboutMih(packageIndex: args),
);
} else {
return MaterialPageRoute(
settings: settings,
builder: (_) => AboutMih(),
);
}
case AppRoutes.mzansiProfile:
if (args is AppProfileUpdateArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiProfile(arguments: args),
);
}
break;
case AppRoutes.mzansiProfileView:
if (args is AppUser) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiProfileView(user: args),
);
}
break;
case AppRoutes.businessProfileSetup:
if (args is AppUser) {
return MaterialPageRoute(
settings: settings,
builder: (_) => ProfileBusinessAdd(signedInUser: args),
);
}
break;
case AppRoutes.businessProfileManage:
if (args is BusinessArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiBusinessProfile(arguments: args),
);
}
break;
case AppRoutes.businessProfileView:
if (args is BusinessViewArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiBusinessProfileView(arguments: args),
);
}
break;
case AppRoutes.patientProfile:
if (args is PatientViewArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => AddOrViewPatient(arguments: args),
);
}
break;
case AppRoutes.patientProfileSetup:
if (args is AppUser) {
return MaterialPageRoute(
settings: settings,
builder: (_) => AddPatient(signedInUser: args),
);
}
break;
case AppRoutes.patientProfileEdit:
if (args is PatientEditArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => EditPatient(
signedInUser: args.signedInUser,
selectedPatient: args.selectedPatient,
),
);
}
break;
case AppRoutes.mzansiWallet:
if (args is WalletArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MihWallet(arguments: args),
);
}
break;
case AppRoutes.mihAccess:
if (args is AppUser) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MihAccess(signedInUser: args),
);
}
break;
// 4. Handle Calendar/Appointments - Unified to one case or keep separate as needed
case AppRoutes.calendar:
case AppRoutes
.appointments: // Fall-through if both lead to the same screen
if (args is CalendarArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiCalendar(arguments: args),
);
}
break;
case AppRoutes.patientManager:
if (args is PatManagerArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => PatManager(arguments: args),
);
}
break;
case AppRoutes.patientManagerPatient:
if (args is PatientViewArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => PatientProfile(arguments: args),
);
}
break;
case AppRoutes.fileViewer:
if (args is FileViewArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => FullScreenFileViewer(arguments: args),
);
}
break;
case AppRoutes.printPreview:
if (args is PrintPreviewArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MIHPrintPreview(arguments: args),
);
}
break;
case AppRoutes.barcodeScanner:
if (args is TextEditingController) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MihBarcodeScanner(cardNumberController: args),
);
}
break;
case AppRoutes.calculator:
if (args is bool) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MIHCalculator(personalSelected: args),
);
}
break;
case AppRoutes.mzansiAi:
if (args is MzansiAiArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => MzansiAi(arguments: args),
);
}
break;
case AppRoutes.packageDevTest:
if (args is TestArguments) {
return MaterialPageRoute(
settings: settings,
builder: (_) => PackageTest(arguments: args),
);
}
break;
default:
// If no match is found, fall through to the error route
break;
}
// 5. Consolidated Error Route Call
// If any of the internal cases fail (e.g., wrong argument type or no matching route),
// it will fall through here.
return _errorRoute();
}
// 6. Refined Error Route
// Providing a simple, clear error message or redirection.
static Route<dynamic> _errorRoute() {
debugPrint(
"Invalid Route or Missing/Incorrect Arguments"); // Use debugPrint for development logs
return MaterialPageRoute(
settings: const RouteSettings(name: AppRoutes.authCheck),
builder: (_) => const AuthCheck(
personalSelected: true,
firstBoot: true,
),
);
}
}