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_detail_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'; import 'package:real_estate_mobile/features/messaging/presentation/screens/conversations_screen.dart'; import 'package:real_estate_mobile/features/messaging/presentation/screens/chat_screen.dart'; import 'package:real_estate_mobile/features/messaging/presentation/screens/messaging_shell.dart'; import 'package:real_estate_mobile/features/contact/presentation/screens/contact_screen.dart'; import 'package:real_estate_mobile/features/profile/presentation/screens/profile_settings_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', '/agents/detail', '/faq', '/contact']; 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: '/agents/detail/:id', builder: (context, state) { final id = state.pathParameters['id']!; return AgentDetailScreen(agentId: id); }, ), ShellRoute( builder: (context, state, child) => MessagingShell(child: child), routes: [ GoRoute( path: '/messages', builder: (context, state) => const ConversationsScreen(), ), GoRoute( path: '/messages/chat/:id', builder: (context, state) { final id = state.pathParameters['id']!; return ChatScreen(conversationId: id); }, ), ], ), GoRoute( path: '/faq', builder: (context, state) => const FaqScreen(), ), GoRoute( path: '/contact', builder: (context, state) => const ContactScreen(), ), GoRoute( path: '/profile', builder: (context, state) => const ProfileSettingsScreen(), ), ], ); }); /// Notifier that triggers GoRouter refresh when auth state changes. class _AuthRefreshNotifier extends ChangeNotifier { void notify() { notifyListeners(); } }