// import 'package:firebase_app_check/firebase_app_check.dart'; // import 'package:firebase_core/firebase_core.dart'; // import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:nhance_app_pwa/customAppBar/toastHelper.dart'; import 'package:nhance_app_pwa/pages/changePassword.dart'; import 'package:nhance_app_pwa/pages/email_verify.dart'; import 'package:nhance_app_pwa/pages/enrollment/addons.dart'; import 'package:nhance_app_pwa/pages/enrollment/empDetails.dart'; import 'package:nhance_app_pwa/pages/enrollment/empReview.dart'; import 'package:nhance_app_pwa/pages/login.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/AddPolicyScreen.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/botman_chat.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/claimprocess.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/claims.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/faqs.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/generalexclusionsdeductibles.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/help.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/home.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/planclaimsform.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/policies.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/privacypolicy.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/profile.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/raisedTicketList.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/retailClaimForm.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/service/api_service.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/termsofuse.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/tickets.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/tickettracklist.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/wellness.dart'; import 'package:nhance_app_pwa/pages/postEnrollment/wellness_web_view.dart'; import 'package:nhance_app_pwa/pages/service/SessionManager.dart'; import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:nhance_app_pwa/pages/service/data_manager.dart'; import 'package:nhance_app_pwa/pages/session/SetPinBiometric.dart'; import 'package:nhance_app_pwa/pages/session/changePin.dart'; import 'package:nhance_app_pwa/pages/session/settingUpPinAndBiometric.dart'; import 'package:nhance_app_pwa/pages/setPassword.dart'; import 'package:nhance_app_pwa/pages/verify.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'config/environment.dart'; // import 'dart:html' as html; // === Splash (only for mobile) === class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State createState() => _SplashScreenState(); } class _SplashScreenState extends State { @override void initState() { super.initState(); _navigate(); } Future _navigate() async { await Future.delayed(const Duration(seconds: 3)); final prefs = await SharedPreferences.getInstance(); final isMpinSkipped = prefs.getString('is_mpin_skipped'); if (isMpinSkipped == '0') { if (mounted) context.go('/pinPage'); } else { if (mounted) context.go('/login'); } } @override Widget build(BuildContext context) { return Scaffold( body: Container( color: const Color(0x98FFFCE5), child: Center( child: Image.asset('assets/nhance-loader.gif', height: 60, width: 60), ), ), ); } } /// Middleware logic for tokens + mpin Future tokenRedirectLogic( BuildContext context, GoRouterState state) async { print('ABCDEFGH'); const guestRoutes = [ '/login', '/verify', '/mailVerify', '/pinPage', '/splash', ]; final hasToken = await TokenService.hasValidToken(); print('hasToken : $hasToken'); final location = state.matchedLocation; // ✅ If user is already logged in, never allow returning to OTP/login screens. if (hasToken && guestRoutes.contains(location)) { return '/home'; } // ✅ If not logged in and trying to access a protected route, force login. if (!hasToken && !guestRoutes.contains(location)) { print('!!!!hasToken : $hasToken'); await SessionManager().clear(); // Show toast once WidgetsBinding.instance.addPostFrameCallback((_) { ToastHelper.showErrorToast( context, 'Session expired. Please login again.'); }); return '/login'; } // ✅ Restore session (decode JWT etc.) await SessionManager().restoreSession(); return null; // no redirect } Future startApp() async { WidgetsFlutterBinding.ensureInitialized(); // await dotenv.load(fileName: Environment.fileName); // Initialize prefs before router final prefs = await SharedPreferences.getInstance(); // ✅ Initial route for mobile vs web final initialLocation = kIsWeb ? '/login' : '/splash'; // === GoRouter Setup === final router = GoRouter( initialLocation: initialLocation, routes: [ GoRoute( path: '/splash', builder: (context, state) => const SplashScreen()), GoRoute(path: '/login', builder: (context, state) => login()), GoRoute( path: '/mailVerify', builder: (context, state) { final data = state.extra as Map; final type = data['type'] as String; final value = data['value'] as String; return MyEmailVerify(type: type, value: value); }, ), GoRoute(path: '/pinPage', builder: (context, state) => pinPage()), GoRoute( path: '/pinSettingPage', builder: (context, state) => pinSettingPage()), GoRoute( path: '/changePin', builder: (context, state) => changePin(), ), GoRoute(path: '/home', builder: (context, state) => Home()), GoRoute(path: '/profile', builder: (context, state) => profile()), GoRoute(path: '/help', builder: (context, state) => help()), GoRoute( path: '/claimprocess', builder: (context, state) => claimprocess()), GoRoute(path: '/wellness', builder: (context, state) => wellness()), GoRoute( path: '/privacypolicy', builder: (context, state) => privacypolicy()), GoRoute(path: '/termsofuse', builder: (context, state) => termsofuse()), GoRoute( path: '/generalExclusionsDeductibles', builder: (context, state) => generalExclusionsDeductibles()), GoRoute(path: '/tickets', builder: (context, state) => tickets()), GoRoute( path: '/policies', builder: (context, state) { final arguments = state.extra as Map?; // 👈 receive here return policies(arguments: arguments); }, ), GoRoute( path: '/claims', builder: (context, state) { final int tabIndex = state.extra as int? ?? 0; // default to 0 return claims(initialTab: tabIndex); }, ), GoRoute( path: '/planclaimsform', builder: (context, state) { final details = state.extra as Map?; return planclaimsform(details: details); }, ), GoRoute( path: '/retailClaimForm', builder: (context, state) { final details = state.extra as Map?; return retailClaimForm(details: details); }, ), GoRoute( path: '/raisedTicketHistory', builder: (context, state) => raisedTicketHistory()), GoRoute( path: '/tickettracklist/:ticketID', builder: (context, state) { final ticketID = state.pathParameters['ticketID']!; return tickettracklist(ticketID: ticketID); }, ), // GoRoute( // path: '/tickettracklist', // builder: (context, state) { // final ticketID = state.extra as String; // cast to correct type // return tickettracklist(ticketID: ticketID); // }, // ), GoRoute( path: '/empDetails', builder: (context, state) => empDetails(), ), GoRoute( path: '/faqs', builder: (context, state) => faqs(), ), GoRoute( path: '/addOnsDetails', builder: (context, state) => addOnsDetails()), GoRoute( path: '/empReviewDetails', builder: (context, state) => empReviewDetails()), GoRoute( path: '/AddPolicyScreen', builder: (context, state) => AddPolicyScreen()), GoRoute( path: '/changePassword', name: 'changePassword', builder: (context, state) { final email = state.uri.queryParameters['email'] ?? ''; final clientId = state.uri.queryParameters['client_id'] ?? ''; return changesPassword( email: email, client_id: clientId, ); }, ), GoRoute( path: '/setPassword', name: 'setPassword', builder: (context, state) { final email = state.uri.queryParameters['email'] ?? ''; final clientId = state.uri.queryParameters['client_id'] ?? ''; final route = state.uri.queryParameters['route'] ?? ''; return setPassword( email: email, client_id: clientId, route: route, ); }, ), GoRoute( path: '/wellnessWebView', builder: (context, state) { final url = state.extra as String; // receiving URL return WellnessWebView(url: url); }, ), ], // ✅ Middleware hook redirect: (context, state) async => await tokenRedirectLogic(context, state), ); runApp(MyApp(router: router)); } class MyApp extends StatefulWidget { final GoRouter router; // ✅ define router as a field const MyApp({super.key, required this.router}); @override State createState() => _MyAppState(); } class _MyAppState extends State { @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { final apiService = ApiService(context); DataManager().init(apiService); // DataManager().loadAdvertisementImages(); }); } @override Widget build(BuildContext context) { return MaterialApp.router( routerConfig: widget.router, // ✅ this now works debugShowCheckedModeBanner: false, ); } }