import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../../providers/auth_provider.dart'; import '../../features/authentication/presentation/pages/login_page.dart'; import '../../features/authentication/presentation/pages/signup_page.dart'; import '../../features/home/presentation/pages/home_page.dart'; import '../../features/authentication/presentation/pages/splash_page.dart'; /// Application router configuration /// /// Handles navigation with authentication state awareness and protected routes class AppRouter { static GoRouter _router({required WidgetRef ref}) { return GoRouter( initialLocation: '/', debugLogDiagnostics: true, redirect: (context, state) { // For now, use Supabase directly for auth state checking // This will be improved when auth provider integration is complete final currentUser = Supabase.instance.client.auth.currentUser; // Allow splash page regardless of auth state if (state.location == '/splash') { return null; } // If not authenticated and trying to access protected route, redirect to login if (currentUser == null && !state.location.startsWith('/login') && !state.location.startsWith('/signup')) { return '/login'; } // If authenticated and on auth pages, redirect to home if (currentUser != null && (state.location.startsWith('/login') || state.location.startsWith('/signup'))) { return '/home'; } return null; }, routes: [ // Splash route - initial loading screen GoRoute( path: '/splash', builder: (context, state) => const SplashPage(), ), // Authentication routes (public) GoRoute( path: '/login', builder: (context, state) => const LoginPage(), ), GoRoute( path: '/signup', builder: (context, state) => const SignupPage(), ), // Protected routes (require authentication) GoRoute( path: '/home', builder: (context, state) => const HomePage(), ), // Root route - redirects based on auth state GoRoute( path: '/', redirect: (context, state) { final currentUser = Supabase.instance.client.auth.currentUser; return currentUser != null ? '/home' : '/splash'; }, ), // Additional routes will be added here // Example: // GoRoute( // path: '/inventory', // builder: (context, state) => const InventoryPage(), // ), ], errorBuilder: (context, state) => Scaffold( appBar: AppBar( title: const Text('Error'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon( Icons.error_outline, size: 64, color: Colors.red, ), const SizedBox(height: 16), Text( 'Page not found', style: Theme.of(context).textTheme.headlineSmall, ), const SizedBox(height: 8), Text( 'Could not find: ${state.location}', style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Colors.grey[600], ), ), const SizedBox(height: 24), ElevatedButton( onPressed: () { // Navigate to home or login based on auth state final currentUser = Supabase.instance.client.auth.currentUser; if (currentUser != null) { context.go('/home'); } else { context.go('/login'); } }, child: const Text('Go Home'), ), ], ), ), ), ); /// Get the router instance static GoRouter router({required WidgetRef ref}) => _router(ref: ref); } /// Router provider for Riverpod integration final routerProvider = Provider((ref) { return AppRouter.router(ref: ref); });