Amélioration de la splash_page et du login
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
||||
import 'package:flutter/foundation.dart' show kIsWeb;
|
||||
import 'package:flutter_web_plugins/url_strategy.dart';
|
||||
import 'package:geosector_app/core/services/app_info_service.dart';
|
||||
import 'package:geosector_app/app.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:geosector_app/core/data/models/user_model.dart';
|
||||
@@ -13,88 +15,167 @@ import 'package:geosector_app/core/data/models/membre_model.dart';
|
||||
import 'package:geosector_app/core/data/models/user_sector_model.dart';
|
||||
import 'package:geosector_app/core/data/models/region_model.dart';
|
||||
import 'package:geosector_app/core/constants/app_keys.dart';
|
||||
import 'package:geosector_app/core/services/hive_reset_service.dart';
|
||||
import 'package:geosector_app/core/services/hive_reset_state_service.dart';
|
||||
// Import centralisé pour les modèles chat
|
||||
import 'package:geosector_app/chat/models/chat_adapters.dart';
|
||||
|
||||
void main() async {
|
||||
// IMPORTANT: Configurer l'URL strategy pour éviter les # dans les URLs
|
||||
usePathUrlStrategy();
|
||||
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
// Configurer le routage par chemin (URLs sans #)
|
||||
setUrlStrategy(PathUrlStrategy());
|
||||
// Initialiser les services essentiels
|
||||
await _initializeServices();
|
||||
|
||||
// Initialiser Hive avec gestion des erreurs
|
||||
bool hiveInitialized = false;
|
||||
final hiveInitialized = await _initializeHive();
|
||||
|
||||
// TEMPORAIREMENT: Ne pas marquer l'erreur pour éviter la redirection
|
||||
// if (!hiveInitialized) {
|
||||
// debugPrint('Incompatibilité détectée dans les données Hive. Marquage pour affichage du dialogue...');
|
||||
// hiveResetStateService.markAsReset();
|
||||
// }
|
||||
|
||||
// Configurer l'orientation de l'application (mobile uniquement)
|
||||
if (!kIsWeb) {
|
||||
await SystemChrome.setPreferredOrientations([
|
||||
DeviceOrientation.portraitUp,
|
||||
DeviceOrientation.portraitDown,
|
||||
]);
|
||||
}
|
||||
|
||||
// Lancer l'application
|
||||
runApp(const GeosectorApp());
|
||||
}
|
||||
|
||||
/// Initialise les services essentiels
|
||||
Future<void> _initializeServices() async {
|
||||
try {
|
||||
await AppInfoService.initialize();
|
||||
debugPrint('Services initialisés avec succès');
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de l\'initialisation des services: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// Initialise Hive et les adaptateurs
|
||||
Future<bool> _initializeHive() async {
|
||||
try {
|
||||
// Initialiser Hive
|
||||
await Hive.initFlutter();
|
||||
|
||||
// Enregistrer les adaptateurs Hive pour les modèles principaux
|
||||
Hive.registerAdapter(UserModelAdapter());
|
||||
Hive.registerAdapter(AmicaleModelAdapter());
|
||||
Hive.registerAdapter(ClientModelAdapter());
|
||||
Hive.registerAdapter(OperationModelAdapter());
|
||||
Hive.registerAdapter(SectorModelAdapter());
|
||||
Hive.registerAdapter(PassageModelAdapter());
|
||||
Hive.registerAdapter(MembreModelAdapter());
|
||||
Hive.registerAdapter(UserSectorModelAdapter());
|
||||
// TODO: Décommenter après avoir généré le fichier region_model.g.dart
|
||||
// Hive.registerAdapter(RegionModelAdapter());
|
||||
|
||||
// Enregistrer les adaptateurs Hive pour le chat
|
||||
Hive.registerAdapter(ConversationModelAdapter());
|
||||
Hive.registerAdapter(MessageModelAdapter());
|
||||
Hive.registerAdapter(ParticipantModelAdapter());
|
||||
Hive.registerAdapter(AnonymousUserModelAdapter());
|
||||
Hive.registerAdapter(AudienceTargetModelAdapter());
|
||||
Hive.registerAdapter(NotificationSettingsAdapter());
|
||||
_registerHiveAdapters();
|
||||
|
||||
// Ouvrir uniquement les boîtes essentielles au démarrage
|
||||
try {
|
||||
// La boîte des utilisateurs est nécessaire pour vérifier si un utilisateur est déjà connecté
|
||||
await Hive.openBox<UserModel>(AppKeys.usersBoxName);
|
||||
// Boîte pour les amicales
|
||||
await Hive.openBox<AmicaleModel>(AppKeys.amicaleBoxName);
|
||||
// Boîte pour les clients
|
||||
await Hive.openBox<ClientModel>(AppKeys.clientsBoxName);
|
||||
// Boîte pour les préférences utilisateur générales
|
||||
await Hive.openBox(AppKeys.settingsBoxName);
|
||||
await _openEssentialHiveBoxes();
|
||||
|
||||
// Ouvrir les boîtes de chat également au démarrage pour le cache local
|
||||
await Hive.openBox<ConversationModel>(AppKeys.chatConversationsBoxName);
|
||||
await Hive.openBox<MessageModel>(AppKeys.chatMessagesBoxName);
|
||||
|
||||
hiveInitialized = true;
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de l\'ouverture des boîtes Hive: $e');
|
||||
// Une erreur s'est produite lors de l'ouverture des boîtes, probablement due à une incompatibilité
|
||||
// Nous allons réinitialiser Hive
|
||||
hiveInitialized = false;
|
||||
}
|
||||
debugPrint('Hive initialisé avec succès');
|
||||
return true;
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de l\'initialisation de Hive: $e');
|
||||
hiveInitialized = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// Enregistre tous les adaptateurs Hive
|
||||
void _registerHiveAdapters() {
|
||||
// Vérifier si les adaptateurs sont déjà enregistrés pour éviter les doublons
|
||||
if (!Hive.isAdapterRegistered(0)) {
|
||||
Hive.registerAdapter(UserModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(1)) {
|
||||
Hive.registerAdapter(AmicaleModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(2)) {
|
||||
Hive.registerAdapter(ClientModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(3)) {
|
||||
Hive.registerAdapter(OperationModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(4)) {
|
||||
Hive.registerAdapter(SectorModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(5)) {
|
||||
Hive.registerAdapter(PassageModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(6)) {
|
||||
Hive.registerAdapter(MembreModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(7)) {
|
||||
Hive.registerAdapter(UserSectorModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(8)) {
|
||||
Hive.registerAdapter(RegionModelAdapter());
|
||||
}
|
||||
|
||||
// Modèles de chat
|
||||
if (!Hive.isAdapterRegistered(9)) {
|
||||
Hive.registerAdapter(ConversationModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(10)) {
|
||||
Hive.registerAdapter(MessageModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(11)) {
|
||||
Hive.registerAdapter(ParticipantModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(12)) {
|
||||
Hive.registerAdapter(AnonymousUserModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(13)) {
|
||||
Hive.registerAdapter(AudienceTargetModelAdapter());
|
||||
}
|
||||
if (!Hive.isAdapterRegistered(14)) {
|
||||
Hive.registerAdapter(NotificationSettingsAdapter());
|
||||
}
|
||||
}
|
||||
|
||||
/// Ouvre les boîtes Hive essentielles
|
||||
Future<void> _openEssentialHiveBoxes() async {
|
||||
final boxesToOpen = [
|
||||
{'name': AppKeys.usersBoxName, 'type': 'UserModel'},
|
||||
{'name': AppKeys.amicaleBoxName, 'type': 'AmicaleModel'},
|
||||
{'name': AppKeys.clientsBoxName, 'type': 'ClientModel'},
|
||||
{'name': AppKeys.settingsBoxName, 'type': 'dynamic'},
|
||||
{'name': AppKeys.chatConversationsBoxName, 'type': 'ConversationModel'},
|
||||
{'name': AppKeys.chatMessagesBoxName, 'type': 'MessageModel'},
|
||||
];
|
||||
|
||||
for (final box in boxesToOpen) {
|
||||
try {
|
||||
final boxName = box['name'] as String;
|
||||
final boxType = box['type'] as String;
|
||||
|
||||
// Vérifier si la boîte est déjà ouverte
|
||||
if (Hive.isBoxOpen(boxName)) {
|
||||
debugPrint('Boîte $boxName déjà ouverte');
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (boxType) {
|
||||
case 'UserModel':
|
||||
await Hive.openBox<UserModel>(boxName);
|
||||
break;
|
||||
case 'AmicaleModel':
|
||||
await Hive.openBox<AmicaleModel>(boxName);
|
||||
break;
|
||||
case 'ClientModel':
|
||||
await Hive.openBox<ClientModel>(boxName);
|
||||
break;
|
||||
case 'ConversationModel':
|
||||
await Hive.openBox<ConversationModel>(boxName);
|
||||
break;
|
||||
case 'MessageModel':
|
||||
await Hive.openBox<MessageModel>(boxName);
|
||||
break;
|
||||
default:
|
||||
await Hive.openBox(boxName);
|
||||
}
|
||||
|
||||
debugPrint('Boîte $boxName ouverte avec succès');
|
||||
} catch (e) {
|
||||
debugPrint('Erreur lors de l\'ouverture de la boîte ${box['name']}: $e');
|
||||
// Ne pas lancer d'erreur, continuer avec les autres boîtes
|
||||
}
|
||||
}
|
||||
|
||||
// Si Hive n'a pas été initialisé correctement, marquer l'état pour afficher le dialogue
|
||||
if (!hiveInitialized) {
|
||||
debugPrint(
|
||||
'Incompatibilité détectée dans les données Hive. Marquage pour affichage du dialogue...');
|
||||
// Marquer Hive comme ayant été réinitialisé pour afficher le dialogue plus tard
|
||||
hiveResetStateService.markAsReset();
|
||||
}
|
||||
|
||||
// Les autres boîtes (operations, sectors, passages, user_sector) seront ouvertes après connexion
|
||||
// dans UserRepository.login() via la méthode _ensureBoxIsOpen()
|
||||
|
||||
// Définir l'orientation de l'application
|
||||
await SystemChrome.setPreferredOrientations([
|
||||
DeviceOrientation.portraitUp,
|
||||
DeviceOrientation.portraitDown,
|
||||
]);
|
||||
|
||||
// Lancer l'application directement sans AppProviders
|
||||
runApp(const GeoSectorApp());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user