import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:real_estate_mobile/features/auth/presentation/providers/auth_provider.dart'; import 'package:real_estate_mobile/features/auth/presentation/screens/login_screen.dart'; import 'package:real_estate_mobile/features/auth/presentation/screens/signup_screen.dart'; import 'package:real_estate_mobile/features/agents/presentation/screens/agent_search_screen.dart'; import 'package:real_estate_mobile/features/faq/presentation/screens/faq_screen.dart'; import 'package:real_estate_mobile/features/home/presentation/screens/home_screen.dart'; final routerProvider = Provider((ref) { final authRefreshNotifier = _AuthRefreshNotifier(); ref.listen(authProvider, (_, __) { authRefreshNotifier.notify(); }); ref.onDispose(() { authRefreshNotifier.dispose(); }); // Public routes accessible without authentication (matching web middleware) const publicRoutes = ['/home', '/agents/search', '/faq']; const authRoutes = ['/login', '/signup']; return GoRouter( initialLocation: '/home', refreshListenable: authRefreshNotifier, redirect: (context, state) { final authState = ref.read(authProvider); final isAuthenticated = authState.status == AuthStatus.authenticated; final isLoading = authState.status == AuthStatus.loading; final location = state.matchedLocation; final isAuthRoute = authRoutes.contains(location); final isPublicRoute = publicRoutes.any( (route) => location == route || location.startsWith('$route/'), ); // While checking auth status, don't redirect if (isLoading) return null; // If authenticated and on auth page (login/signup), go to home if (isAuthenticated && isAuthRoute) return '/home'; // Public routes are always accessible if (isPublicRoute || isAuthRoute) return null; // Protected routes require authentication — redirect to login if (!isAuthenticated) return '/login'; return null; }, routes: [ GoRoute( path: '/login', builder: (context, state) => const LoginScreen(), ), GoRoute( path: '/signup', builder: (context, state) => const SignupScreen(), ), GoRoute( path: '/home', builder: (context, state) => const HomeScreen(), ), GoRoute( path: '/agents/search', builder: (context, state) { final query = state.uri.queryParameters['q']; return AgentSearchScreen(initialQuery: query); }, ), GoRoute( path: '/faq', builder: (context, state) => const FaqScreen(), ), ], ); }); /// Notifier that triggers GoRouter refresh when auth state changes. class _AuthRefreshNotifier extends ChangeNotifier { void notify() { notifyListeners(); } }