feat: synchronisation mode deconnecte fin chat et stats

This commit is contained in:
2025-08-31 18:21:20 +02:00
parent 41a4505b4b
commit 604294af96
149 changed files with 285769 additions and 250633 deletions

View File

@@ -15,7 +15,9 @@ import 'package:geosector_app/core/data/models/sector_model.dart';
import 'package:geosector_app/core/data/models/passage_model.dart';
import 'package:geosector_app/core/data/models/membre_model.dart';
import 'package:geosector_app/core/data/models/user_sector_model.dart';
// Chat imports removed - using new simplified chat module
import 'package:geosector_app/core/data/models/pending_request.dart';
import 'package:geosector_app/chat/models/room.dart';
import 'package:geosector_app/chat/models/message.dart';
/// Service singleton centralisé pour la gestion complète des Box Hive
/// Utilisé par main.dart pour l'initialisation et par logout pour le nettoyage
@@ -34,7 +36,13 @@ class HiveService {
HiveBoxConfig<PassageModel>(AppKeys.passagesBoxName, 'PassageModel'),
HiveBoxConfig<MembreModel>(AppKeys.membresBoxName, 'MembreModel'),
HiveBoxConfig<UserSectorModel>(AppKeys.userSectorBoxName, 'UserSectorModel'),
// Chat boxes removed - handled by new chat module
// Chat boxes
HiveBoxConfig<Room>(AppKeys.chatRoomsBoxName, 'Room'),
HiveBoxConfig<Message>(AppKeys.chatMessagesBoxName, 'Message'),
// Queue offline boxes
HiveBoxConfig<PendingRequest>(AppKeys.pendingRequestsBoxName, 'PendingRequest'),
HiveBoxConfig<dynamic>(AppKeys.tempEntitiesBoxName, 'TempEntities'),
// Dynamic boxes
HiveBoxConfig<dynamic>(AppKeys.settingsBoxName, 'Settings'),
HiveBoxConfig<dynamic>(AppKeys.regionsBoxName, 'Regions'),
];
@@ -149,6 +157,16 @@ class HiveService {
try {
debugPrint('💥 Destruction complète des données Hive...');
// PROTECTION CRITIQUE : Vérifier la box pending_requests
if (Hive.isBoxOpen(AppKeys.pendingRequestsBoxName)) {
final pendingBox = Hive.box(AppKeys.pendingRequestsBoxName);
if (pendingBox.isNotEmpty) {
debugPrint('⚠️ ATTENTION: ${pendingBox.length} requêtes en attente trouvées dans pending_requests');
debugPrint('⚠️ Cette box NE SERA PAS supprimée pour préserver les données');
// On ne supprime PAS cette box si elle contient des données
}
}
// 1. Fermer toutes les Box ouvertes
await _closeAllOpenBoxes();
@@ -333,6 +351,17 @@ class HiveService {
for (final config in _boxConfigs) {
try {
// PROTECTION : Ne pas supprimer pending_requests si elle contient des données
if (config.name == AppKeys.pendingRequestsBoxName) {
if (Hive.isBoxOpen(AppKeys.pendingRequestsBoxName)) {
final box = Hive.box(AppKeys.pendingRequestsBoxName);
if (box.isNotEmpty) {
debugPrint('⏭️ Box ${config.name} ignorée (contient ${box.length} requêtes en attente)');
continue;
}
}
}
await Hive.deleteBoxFromDisk(config.name);
debugPrint('🗑️ Box fallback ${config.name} supprimée');
} catch (e) {
@@ -401,7 +430,19 @@ class HiveService {
case 'UserSectorModel':
await Hive.openBox<UserSectorModel>(config.name);
break;
// Chat boxes removed - handled by new chat module
case 'Room':
await Hive.openBox<Room>(config.name);
break;
case 'Message':
await Hive.openBox<Message>(config.name);
break;
case 'PendingRequest':
await Hive.openBox<PendingRequest>(config.name);
break;
case 'TempEntities':
// Box dynamique pour stocker les entités temporaires
await Hive.openBox(config.name);
break;
default:
// Pour Settings, Regions, etc.
await Hive.openBox(config.name);
@@ -426,7 +467,61 @@ class HiveService {
Future<void> _clearSingleBox(String boxName) async {
try {
if (Hive.isBoxOpen(boxName)) {
await Hive.box(boxName).clear();
// Récupérer la configuration pour connaître le type
final config = _boxConfigs.firstWhere(
(c) => c.name == boxName,
orElse: () => HiveBoxConfig(boxName, 'dynamic'),
);
// Utiliser la box typée selon le modèle
switch (config.type) {
case 'UserModel':
await Hive.box<UserModel>(boxName).clear();
break;
case 'AmicaleModel':
await Hive.box<AmicaleModel>(boxName).clear();
break;
case 'ClientModel':
await Hive.box<ClientModel>(boxName).clear();
break;
case 'OperationModel':
await Hive.box<OperationModel>(boxName).clear();
break;
case 'SectorModel':
await Hive.box<SectorModel>(boxName).clear();
break;
case 'PassageModel':
await Hive.box<PassageModel>(boxName).clear();
break;
case 'MembreModel':
await Hive.box<MembreModel>(boxName).clear();
break;
case 'UserSectorModel':
await Hive.box<UserSectorModel>(boxName).clear();
break;
case 'Room':
await Hive.box<Room>(boxName).clear();
break;
case 'Message':
await Hive.box<Message>(boxName).clear();
break;
case 'PendingRequest':
// ATTENTION : Ne jamais vider pending_requests si elle contient des données critiques
final pendingBox = Hive.box<PendingRequest>(boxName);
if (pendingBox.isNotEmpty) {
debugPrint('⚠️ ATTENTION: Box $boxName contient ${pendingBox.length} requêtes - Vidage ignoré');
return; // Ne pas vider cette box
}
await pendingBox.clear();
break;
case 'TempEntities':
await Hive.box(boxName).clear();
break;
default:
// Pour les box non typées (settings, regions, etc.)
await Hive.box(boxName).clear();
break;
}
debugPrint('🧹 Box $boxName vidée');
} else {
debugPrint(' Box $boxName n\'est pas ouverte, impossible de la vider');