import 'dart:async'; import 'package:flutter_application_1/features/auth/presentation/screens/register_screen.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import '../../features/auth/presentation/bloc/auth_bloc.dart'; import '../../features/auth/presentation/bloc/auth_state.dart'; import '../../features/auth/presentation/screens/login_screen.dart'; import '../../features/auth/presentation/screens/home_screen_placeholder.dart'; /// Rutas nombradas de la aplicación. abstract final class AppRoutes { static const String splash = '/'; static const String login = '/login'; static const String home = '/home'; } /// Configuración central de navegación con go_router. /// /// La redirección basada en estado de autenticación garantiza que /// rutas protegidas sean inaccesibles sin sesión válida. GoRouter createRouter(AuthBloc authBloc) { return GoRouter( initialLocation: AppRoutes.splash, refreshListenable: GoRouterAuthNotifier(authBloc), redirect: (BuildContext context, GoRouterState state) { final authState = authBloc.state; final isAuthenticated = authState is AuthAuthenticated; final isCheckingSession = authState is AuthCheckingSession || authState is AuthInitial; final currentLocation = state.uri.path; // Mientras se verifica la sesión, mostrar splash. if (isCheckingSession) { return currentLocation == AppRoutes.splash ? null : AppRoutes.splash; } // Si no está autenticado, ir a login. if (!isAuthenticated) { return currentLocation == AppRoutes.login ? null : AppRoutes.login; } // Si está autenticado y en splash o login, ir a home. if (isAuthenticated && (currentLocation == AppRoutes.login || currentLocation == AppRoutes.splash)) { return AppRoutes.home; } return null; // Sin redirección. }, routes: [ GoRoute( path: AppRoutes.splash, builder: (context, state) => const _SplashScreen(), ), GoRoute( path: AppRoutes.login, builder: (context, state) => const LoginScreen(), ), GoRoute( path: AppRoutes.home, builder: (context, state) => const HomeScreenPlaceholder(), ), // 📍 Agrega el import arriba si te lo pide: // import 'package:flutter_application_1/features/auth/presentation/screens/register_screen.dart'; GoRoute( path: AppRoutes.home, builder: (context, state) => const HomeScreenPlaceholder(), ), // 📍 CORRECCIÓN: Usamos la constante oficial del proyecto en lugar del texto a mano GoRoute( path: '/register', // 📍 CORRECCIÓN: Texto plano limpio entre comillas builder: (context, state) => const RegisterScreen(), ), // GoRoute ], ); } /// Pantalla de splash mínima mientras se verifica la sesión. class _SplashScreen extends StatelessWidget { const _SplashScreen(); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: const Color(0xFF2E7D32), body: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ const Icon( Icons.recycling_rounded, size: 72, color: Colors.white, ), const SizedBox(height: 24), Text( 'WasteNotify', style: Theme.of(context).textTheme.headlineMedium?.copyWith( color: Colors.white, fontWeight: FontWeight.bold, letterSpacing: 1.2, ), ), const SizedBox(height: 48), const CircularProgressIndicator( valueColor: AlwaysStoppedAnimation(Colors.white70), ), ], ), ), ); } } /// Notificador que conecta el estado del BLoC con go_router. /// Permite que el router reaccione automáticamente a cambios de sesión. class GoRouterAuthNotifier extends ChangeNotifier { final AuthBloc _authBloc; late final StreamSubscription _subscription; GoRouterAuthNotifier(this._authBloc) { _subscription = _authBloc.stream.listen((_) => notifyListeners()); } @override void dispose() { _subscription.cancel(); super.dispose(); } }