import 'package:flutter/material.dart'; import '../services/auth/auth.dart'; import '../pages/home.dart'; import '../pages/splash.dart'; import '../pages/login.dart'; class ReflexRouterDelegate extends RouterDelegate with ChangeNotifier, PopNavigatorRouterDelegateMixin { @override GlobalKey get navigatorKey => _navigatorKey; final GlobalKey _navigatorKey; bool? _loggedIn; bool? get loggedIn => _loggedIn; set loggedIn(value) { _loggedIn = value; notifyListeners(); } final AuthService authService; ReflexRouterDelegate(this.authService) : _navigatorKey = GlobalKey() { _init(); } _init() async { try { await authService.init(); bool isAuthenticated = await authService.isLoggedIn(); // If the access token check failed but we have a refresh token, // try to silently renew before forcing the user back to the login screen. if (!isAuthenticated && authService.refreshToken != null && authService.refreshToken!.isNotEmpty) { try { await authService.doRefreshToken(); authService.tokenRefresher = TokenRefresher(authService, refreshInterval: const Duration(seconds: 60)); authService.tokenRefresher!.start(); isAuthenticated = await authService.isLoggedIn(); } catch (_) { // Refresh token is expired or invalid — full re-login required. } } loggedIn = isAuthenticated; } catch (e) { loggedIn = false; } } @override Widget build(BuildContext context) { List stack; if (loggedIn == null) { stack = _splashStack; } else if (loggedIn!) { stack = _loggedInStack; } else { stack = _loggedOutStack; } return WillPopScope( onWillPop: () async => !await navigatorKey.currentState!.maybePop(), child: Navigator( key: navigatorKey, pages: stack, onPopPage: (route, result) { if (!route.didPop(result)) return false; return true; }, )); } List get _splashStack => [const SplashPage()]; List get _loggedOutStack => [ LoginPage(onLogin: () { loggedIn = true; }) ]; List get _loggedInStack { return [ HomePage(onLogout: () { loggedIn = false; }), ]; } @override Future setNewRoutePath(configuration) async {/* Do Nothing */} }