import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/theme/app_theme.dart'; import '../../core/widgets/app_widgets.dart'; import '../notifications/notification_service.dart'; import '../alerts/alerts_provider.dart'; import 'citizen_home_screen.dart'; import '../alerts/alerts_screen.dart'; import 'house_screen.dart'; import '../profile/profile_screen.dart'; class MainShell extends ConsumerStatefulWidget { const MainShell({super.key}); @override ConsumerState createState() => _MainShellState(); } class _MainShellState extends ConsumerState { int _currentIndex = 0; static const List _screens = [ CitizenHomeScreen(), AlertsScreen(), MyHouseScreen(), ProfileScreen(), ]; @override void initState() { super.initState(); NotificationService.onFcmMessage.addListener(_onGlobalPush); } @override void dispose() { NotificationService.onFcmMessage.removeListener(_onGlobalPush); super.dispose(); } void _onGlobalPush() { final msg = NotificationService.onFcmMessage.lastMessage; if (msg?.notification != null) { final title = msg!.notification!.title ?? 'Nueva Alerta'; final body = msg.notification!.body ?? ''; ref.read(alertsProvider.notifier).addAlert(title, body); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( backgroundColor: AppTheme.primaryDark, behavior: SnackBarBehavior.floating, margin: const EdgeInsets.all(16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), duration: const Duration(seconds: 5), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ const Icon( Icons.notifications_active, color: Colors.white, size: 20, ), const SizedBox(width: 8), Expanded( child: Text( title, style: const TextStyle( fontWeight: FontWeight.bold, color: Colors.white, ), ), ), ], ), const SizedBox(height: 4), Text( body, style: const TextStyle(color: Colors.white70, fontSize: 13), ), ], ), action: SnackBarAction( label: 'VER', textColor: AppTheme.primaryLight, onPressed: () => setState(() => _currentIndex = 1), ), ), ); } } } @override Widget build(BuildContext context) { return Scaffold( // Renderiza únicamente la pantalla activa para desmontar vistas nativas // (p. ej. FlutterMap) cuando la pestaña no está activa, evitando que // queden superpuestas sobre la UI de otras pestañas. body: _screens[_currentIndex], bottomNavigationBar: AppBottomNav( currentIndex: _currentIndex, onTap: (i) => setState(() => _currentIndex = i), ), ); } }