Initialisation du projet geosector complet (web + flutter)

This commit is contained in:
d6soft
2025-05-01 18:59:27 +02:00
commit b5aafc424b
244 changed files with 37296 additions and 0 deletions

View File

@@ -0,0 +1,223 @@
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<SplashPage> createState() => _SplashPageState();
}
class _SplashPageState extends State<SplashPage>
with SingleTickerProviderStateMixin {
late AnimationController _animationController;
bool _isInitializing = true;
String _statusMessage = "Initialisation...";
double _progress = 0.0;
final List<String> _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<Color>(
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,
),
),
),
],
],
),
),
);
}
}