feat: synchronisation mode deconnecte fin chat et stats
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user