import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:geosector_app/core/repositories/user_repository.dart'; import 'package:geosector_app/core/theme/app_theme.dart'; import 'package:geosector_app/app.dart'; // Pour accéder aux instances globales import 'dart:async'; class SplashPage extends StatefulWidget { const SplashPage({super.key}); @override State createState() => _SplashPageState(); } class _SplashPageState extends State with SingleTickerProviderStateMixin { late AnimationController _animationController; bool _isInitializing = true; String _statusMessage = "Initialisation..."; double _progress = 0.0; final List _initializationSteps = [ "Initialisation des services...", "Vérification de l'authentification...", "Chargement des données...", "Préparation de l'interface...", "Démarrage de GeoSector..." ]; @override void initState() { super.initState(); _animationController = AnimationController( vsync: this, duration: const Duration(seconds: 2), ); // Simuler le processus d'initialisation _startInitialization(); } @override void dispose() { _animationController.dispose(); super.dispose(); } void _startInitialization() async { // Simuler les étapes d'initialisation for (int i = 0; i < _initializationSteps.length; i++) { if (mounted) { setState(() { _statusMessage = _initializationSteps[i]; _progress = (i + 1) / _initializationSteps.length; }); } // Attendre pour simuler le chargement await Future.delayed(const Duration(milliseconds: 800)); } if (mounted) { setState(() { _isInitializing = false; }); // Lancer l'animation finale _animationController.forward(); // Attendre la fin de l'animation avant de rediriger Timer(const Duration(milliseconds: 1500), () { _redirectToAppropriateScreen(); }); } } void _redirectToAppropriateScreen() { if (!mounted) return; // Utiliser l'instance globale de userRepository définie dans app.dart if (userRepository.isLoggedIn) { if (userRepository.isAdmin()) { context.go('/admin'); } else { context.go('/user'); } } else { context.go('/public'); } } @override Widget build(BuildContext context) { final theme = Theme.of(context); final size = MediaQuery.of(context).size; return Scaffold( body: Container( width: double.infinity, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ theme.colorScheme.primary, theme.colorScheme.primary.withOpacity(0.8), theme.colorScheme.secondary, ], ), ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // Logo animé AnimatedContainer( duration: const Duration(milliseconds: 500), height: _isInitializing ? size.height * 0.3 : size.height * 0.35, child: AnimatedOpacity( opacity: _isInitializing ? 0.8 : 1.0, duration: const Duration(milliseconds: 500), child: AnimatedScale( scale: _isInitializing ? 0.9 : 1.0, duration: const Duration(milliseconds: 800), curve: Curves.elasticOut, child: Image.asset( 'assets/images/geosector-logo-200.png', width: 150, height: 150, fit: BoxFit.contain, ), ), ), ), const SizedBox(height: 24), // Titre avec animation fade-in AnimatedOpacity( opacity: _isInitializing ? 0.9 : 1.0, duration: const Duration(milliseconds: 500), child: Text( 'GeoSector', style: theme.textTheme.headlineLarge?.copyWith( color: Colors.white, fontWeight: FontWeight.bold, letterSpacing: 1.5, shadows: [ Shadow( color: Colors.black.withOpacity(0.3), offset: const Offset(2, 2), blurRadius: 4, ), ], ), ), ), const SizedBox(height: 16), // Message de bienvenue AnimatedOpacity( opacity: _isInitializing ? 0.8 : 1.0, duration: const Duration(milliseconds: 500), child: Text( 'Bienvenue sur GEOSECTOR', textAlign: TextAlign.center, style: theme.textTheme.titleMedium?.copyWith( color: Colors.white, fontWeight: FontWeight.w500, ), ), ), const SizedBox(height: 40), // Indicateur de chargement if (_isInitializing) ...[ Padding( padding: const EdgeInsets.symmetric(horizontal: 40), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: LinearProgressIndicator( value: _progress, backgroundColor: Colors.white.withOpacity(0.3), valueColor: AlwaysStoppedAnimation( theme.colorScheme.tertiary, ), minHeight: 6, ), ), ), const SizedBox(height: 16), Text( _statusMessage, style: theme.textTheme.bodyLarge?.copyWith( color: Colors.white.withOpacity(0.9), ), ), ] else ...[ // Animation de succès quand l'initialisation est terminée ScaleTransition( scale: CurvedAnimation( parent: _animationController, curve: Curves.elasticOut), child: Container( width: 80, height: 80, decoration: BoxDecoration( color: theme.colorScheme.tertiary, shape: BoxShape.circle, ), child: const Icon( Icons.check, color: Colors.white, size: 40, ), ), ), ], ], ), ), ); } }