refactor: Optimisation de la gestion des événements dans le cache et suppression des appels API redondants

This commit is contained in:
ElPoyo
2026-02-18 15:22:14 +01:00
parent bc6d7d4542
commit 506225ac62
4 changed files with 71 additions and 40 deletions

View File

@@ -9,7 +9,6 @@ import 'package:em2rp/services/data_service.dart';
import 'package:em2rp/services/api_service.dart';
import 'package:provider/provider.dart';
import 'package:em2rp/providers/event_provider.dart';
import 'package:em2rp/providers/local_user_provider.dart';
class EventFormController extends ChangeNotifier {
// Controllers
@@ -365,15 +364,9 @@ class EventFormController extends ChangeNotifier {
await EventFormService.updateEvent(updatedEvent);
// Recharger les événements après modification
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
// Mettre à jour l'événement dans le cache (au lieu de tout recharger)
final eventProvider = Provider.of<EventProvider>(context, listen: false);
final userId = localUserProvider.uid;
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
if (userId != null) {
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
}
await eventProvider.updateEvent(updatedEvent);
_success = "Événement modifié avec succès !";
} else {
@@ -407,23 +400,22 @@ class EventFormController extends ChangeNotifier {
final eventId = await EventFormService.createEvent(newEvent);
// Créer l'événement avec l'ID retourné
EventModel createdEvent = newEvent.copyWith(id: eventId);
// Déplacer et mettre à jour les fichiers uniquement s'il y en a
if (_uploadedFiles.isNotEmpty) {
final newFiles = await EventFormService.moveFilesToEvent(_uploadedFiles, eventId);
if (newFiles.isNotEmpty) {
await EventFormService.updateEventDocuments(eventId, newFiles);
// Mettre à jour l'événement avec les nouvelles URLs
createdEvent = createdEvent.copyWith(documents: newFiles);
}
}
// Reload events
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
// Ajouter l'événement au cache
final eventProvider = Provider.of<EventProvider>(context, listen: false);
final userId = localUserProvider.uid;
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
if (userId != null) {
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
}
await eventProvider.addEvent(createdEvent);
_success = "Événement créé avec succès !";
}
@@ -448,19 +440,9 @@ class EventFormController extends ChangeNotifier {
notifyListeners();
try {
// Supprimer l'événement via l'API
final dataService = DataService(FirebaseFunctionsApiService());
await dataService.deleteEvent(eventId);
// Recharger la liste des événements
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
// Supprimer l'événement via le provider (qui appelle l'API et met à jour le cache)
final eventProvider = Provider.of<EventProvider>(context, listen: false);
final userId = localUserProvider.uid;
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
if (userId != null) {
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
}
await eventProvider.deleteEvent(eventId);
_success = "Événement supprimé avec succès !";
notifyListeners();

View File

@@ -237,8 +237,16 @@ class EventProvider with ChangeNotifier {
/// Ajouter un nouvel événement
Future<void> addEvent(EventModel event) async {
try {
// L'événement est créé via l'API dans le service
await refreshEvents(_lastUserId ?? '', canViewAllEvents: _lastCanViewAll);
// Ajouter l'événement localement dans _events
_events.add(event);
// Ajouter dans le cache par mois
final monthKey = '${event.startDateTime.year}-${event.startDateTime.month.toString().padLeft(2, '0')}';
if (_eventsByMonth.containsKey(monthKey)) {
_eventsByMonth[monthKey]!.add(event);
}
notifyListeners();
} catch (e) {
print('Error adding event: $e');
rethrow;
@@ -248,10 +256,34 @@ class EventProvider with ChangeNotifier {
/// Mettre à jour un événement
Future<void> updateEvent(EventModel event) async {
try {
// Mise à jour locale immédiate
// Mise à jour dans _events
final index = _events.indexWhere((e) => e.id == event.id);
if (index != -1) {
final oldEvent = _events[index];
_events[index] = event;
// Mettre à jour dans le cache par mois
final oldMonthKey = '${oldEvent.startDateTime.year}-${oldEvent.startDateTime.month.toString().padLeft(2, '0')}';
final newMonthKey = '${event.startDateTime.year}-${event.startDateTime.month.toString().padLeft(2, '0')}';
// Si le mois a changé, supprimer de l'ancien et ajouter au nouveau
if (oldMonthKey != newMonthKey) {
if (_eventsByMonth.containsKey(oldMonthKey)) {
_eventsByMonth[oldMonthKey]!.removeWhere((e) => e.id == event.id);
}
if (_eventsByMonth.containsKey(newMonthKey)) {
_eventsByMonth[newMonthKey]!.add(event);
}
} else {
// Même mois, juste mettre à jour
if (_eventsByMonth.containsKey(newMonthKey)) {
final monthIndex = _eventsByMonth[newMonthKey]!.indexWhere((e) => e.id == event.id);
if (monthIndex != -1) {
_eventsByMonth[newMonthKey]![monthIndex] = event;
}
}
}
notifyListeners();
}
} catch (e) {
@@ -264,7 +296,19 @@ class EventProvider with ChangeNotifier {
Future<void> deleteEvent(String eventId) async {
try {
await _dataService.deleteEvent(eventId);
// Trouver l'événement pour obtenir sa date avant de le supprimer
final eventToDelete = _events.firstWhere((e) => e.id == eventId);
final monthKey = '${eventToDelete.startDateTime.year}-${eventToDelete.startDateTime.month.toString().padLeft(2, '0')}';
// Supprimer de _events
_events.removeWhere((event) => event.id == eventId);
// Supprimer du cache par mois
if (_eventsByMonth.containsKey(monthKey)) {
_eventsByMonth[monthKey]!.removeWhere((event) => event.id == eventId);
}
notifyListeners();
} catch (e) {
print('Error deleting event: $e');

View File

@@ -1,14 +1,12 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:cloud_functions/cloud_functions.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:em2rp/models/event_model.dart';
import 'package:em2rp/models/equipment_model.dart';
import 'package:em2rp/models/container_model.dart';
import 'package:em2rp/providers/equipment_provider.dart';
import 'package:em2rp/providers/container_provider.dart';
import 'package:em2rp/providers/event_provider.dart';
import 'package:em2rp/providers/local_user_provider.dart';
import 'package:em2rp/services/data_service.dart';
import 'package:em2rp/services/api_service.dart';
import 'package:em2rp/services/qr_code_processing_service.dart';
@@ -449,10 +447,17 @@ class _EventPreparationPageState extends State<EventPreparationPage> with Single
// Recharger l'événement depuis le provider
final eventProvider = context.read<EventProvider>();
// Recharger la liste des événements pour rafraîchir les données
final userId = context.read<LocalUserProvider>().uid;
if (userId != null) {
await eventProvider.loadUserEvents(userId, canViewAllEvents: true);
// Recharger uniquement cet événement depuis l'API pour obtenir les dernières données
try {
final result = await _dataService.getEventWithDetails(_currentEvent.id);
final eventData = result['event'] as Map<String, dynamic>;
final updatedEvent = EventModel.fromMap(eventData, eventData['id'] as String);
// Mettre à jour dans le cache
await eventProvider.updateEvent(updatedEvent);
} catch (e) {
DebugLog.error('[EventPreparationPage] Erreur lors du rechargement de l\'événement', e);
}
setState(() => _showSuccessAnimation = true);