refactor: Optimisation de la gestion des événements dans le cache et suppression des appels API redondants
This commit is contained in:
@@ -9,7 +9,6 @@ import 'package:em2rp/services/data_service.dart';
|
|||||||
import 'package:em2rp/services/api_service.dart';
|
import 'package:em2rp/services/api_service.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:em2rp/providers/event_provider.dart';
|
import 'package:em2rp/providers/event_provider.dart';
|
||||||
import 'package:em2rp/providers/local_user_provider.dart';
|
|
||||||
|
|
||||||
class EventFormController extends ChangeNotifier {
|
class EventFormController extends ChangeNotifier {
|
||||||
// Controllers
|
// Controllers
|
||||||
@@ -365,15 +364,9 @@ class EventFormController extends ChangeNotifier {
|
|||||||
|
|
||||||
await EventFormService.updateEvent(updatedEvent);
|
await EventFormService.updateEvent(updatedEvent);
|
||||||
|
|
||||||
// Recharger les événements après modification
|
// Mettre à jour l'événement dans le cache (au lieu de tout recharger)
|
||||||
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
|
|
||||||
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
||||||
final userId = localUserProvider.uid;
|
await eventProvider.updateEvent(updatedEvent);
|
||||||
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
|
|
||||||
|
|
||||||
if (userId != null) {
|
|
||||||
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
|
|
||||||
}
|
|
||||||
|
|
||||||
_success = "Événement modifié avec succès !";
|
_success = "Événement modifié avec succès !";
|
||||||
} else {
|
} else {
|
||||||
@@ -407,23 +400,22 @@ class EventFormController extends ChangeNotifier {
|
|||||||
|
|
||||||
final eventId = await EventFormService.createEvent(newEvent);
|
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
|
// Déplacer et mettre à jour les fichiers uniquement s'il y en a
|
||||||
if (_uploadedFiles.isNotEmpty) {
|
if (_uploadedFiles.isNotEmpty) {
|
||||||
final newFiles = await EventFormService.moveFilesToEvent(_uploadedFiles, eventId);
|
final newFiles = await EventFormService.moveFilesToEvent(_uploadedFiles, eventId);
|
||||||
if (newFiles.isNotEmpty) {
|
if (newFiles.isNotEmpty) {
|
||||||
await EventFormService.updateEventDocuments(eventId, newFiles);
|
await EventFormService.updateEventDocuments(eventId, newFiles);
|
||||||
|
// Mettre à jour l'événement avec les nouvelles URLs
|
||||||
|
createdEvent = createdEvent.copyWith(documents: newFiles);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reload events
|
// Ajouter l'événement au cache
|
||||||
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
|
|
||||||
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
||||||
final userId = localUserProvider.uid;
|
await eventProvider.addEvent(createdEvent);
|
||||||
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
|
|
||||||
|
|
||||||
if (userId != null) {
|
|
||||||
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
|
|
||||||
}
|
|
||||||
|
|
||||||
_success = "Événement créé avec succès !";
|
_success = "Événement créé avec succès !";
|
||||||
}
|
}
|
||||||
@@ -448,19 +440,9 @@ class EventFormController extends ChangeNotifier {
|
|||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Supprimer l'événement via l'API
|
// Supprimer l'événement via le provider (qui appelle l'API et met à jour le cache)
|
||||||
final dataService = DataService(FirebaseFunctionsApiService());
|
|
||||||
await dataService.deleteEvent(eventId);
|
|
||||||
|
|
||||||
// Recharger la liste des événements
|
|
||||||
final localUserProvider = Provider.of<LocalUserProvider>(context, listen: false);
|
|
||||||
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
final eventProvider = Provider.of<EventProvider>(context, listen: false);
|
||||||
final userId = localUserProvider.uid;
|
await eventProvider.deleteEvent(eventId);
|
||||||
final canViewAllEvents = localUserProvider.hasPermission('view_all_events');
|
|
||||||
|
|
||||||
if (userId != null) {
|
|
||||||
await eventProvider.loadUserEvents(userId, canViewAllEvents: canViewAllEvents);
|
|
||||||
}
|
|
||||||
|
|
||||||
_success = "Événement supprimé avec succès !";
|
_success = "Événement supprimé avec succès !";
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
|||||||
@@ -237,8 +237,16 @@ class EventProvider with ChangeNotifier {
|
|||||||
/// Ajouter un nouvel événement
|
/// Ajouter un nouvel événement
|
||||||
Future<void> addEvent(EventModel event) async {
|
Future<void> addEvent(EventModel event) async {
|
||||||
try {
|
try {
|
||||||
// L'événement est créé via l'API dans le service
|
// Ajouter l'événement localement dans _events
|
||||||
await refreshEvents(_lastUserId ?? '', canViewAllEvents: _lastCanViewAll);
|
_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) {
|
} catch (e) {
|
||||||
print('Error adding event: $e');
|
print('Error adding event: $e');
|
||||||
rethrow;
|
rethrow;
|
||||||
@@ -248,10 +256,34 @@ class EventProvider with ChangeNotifier {
|
|||||||
/// Mettre à jour un événement
|
/// Mettre à jour un événement
|
||||||
Future<void> updateEvent(EventModel event) async {
|
Future<void> updateEvent(EventModel event) async {
|
||||||
try {
|
try {
|
||||||
// Mise à jour locale immédiate
|
// Mise à jour dans _events
|
||||||
final index = _events.indexWhere((e) => e.id == event.id);
|
final index = _events.indexWhere((e) => e.id == event.id);
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
|
final oldEvent = _events[index];
|
||||||
_events[index] = event;
|
_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();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@@ -264,7 +296,19 @@ class EventProvider with ChangeNotifier {
|
|||||||
Future<void> deleteEvent(String eventId) async {
|
Future<void> deleteEvent(String eventId) async {
|
||||||
try {
|
try {
|
||||||
await _dataService.deleteEvent(eventId);
|
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);
|
_events.removeWhere((event) => event.id == eventId);
|
||||||
|
|
||||||
|
// Supprimer du cache par mois
|
||||||
|
if (_eventsByMonth.containsKey(monthKey)) {
|
||||||
|
_eventsByMonth[monthKey]!.removeWhere((event) => event.id == eventId);
|
||||||
|
}
|
||||||
|
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Error deleting event: $e');
|
print('Error deleting event: $e');
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:cloud_functions/cloud_functions.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/event_model.dart';
|
||||||
import 'package:em2rp/models/equipment_model.dart';
|
import 'package:em2rp/models/equipment_model.dart';
|
||||||
import 'package:em2rp/models/container_model.dart';
|
import 'package:em2rp/models/container_model.dart';
|
||||||
import 'package:em2rp/providers/equipment_provider.dart';
|
import 'package:em2rp/providers/equipment_provider.dart';
|
||||||
import 'package:em2rp/providers/container_provider.dart';
|
import 'package:em2rp/providers/container_provider.dart';
|
||||||
import 'package:em2rp/providers/event_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/data_service.dart';
|
||||||
import 'package:em2rp/services/api_service.dart';
|
import 'package:em2rp/services/api_service.dart';
|
||||||
import 'package:em2rp/services/qr_code_processing_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
|
// Recharger l'événement depuis le provider
|
||||||
final eventProvider = context.read<EventProvider>();
|
final eventProvider = context.read<EventProvider>();
|
||||||
// Recharger la liste des événements pour rafraîchir les données
|
|
||||||
final userId = context.read<LocalUserProvider>().uid;
|
// Recharger uniquement cet événement depuis l'API pour obtenir les dernières données
|
||||||
if (userId != null) {
|
try {
|
||||||
await eventProvider.loadUserEvents(userId, canViewAllEvents: true);
|
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);
|
setState(() => _showSuccessAnimation = true);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": "1.1.4",
|
"version": "1.1.5",
|
||||||
"updateUrl": "https://app.em2events.fr",
|
"updateUrl": "https://app.em2events.fr",
|
||||||
"forceUpdate": true,
|
"forceUpdate": true,
|
||||||
"releaseNotes": "Cette version apporte des outils majeurs pour faciliter la gestion de votre parc et de vos événements :\r\n\r\n* **Scanner QR Code :** Retrouvez instantanément la fiche d'un équipement ou d'un conteneur en scannant son code directement depuis l'application. La génération des codes a également été rendue plus fluide.\r\n* **Centre de Notifications & Alertes :** Ne ratez plus rien ! Un nouveau système d'alertes (dans l'app et par email) vous prévient des maintenances, équipements manquants ou conflits. Vous pouvez configurer vos préférences d'envoi.",
|
"releaseNotes": "Cette version apporte des outils majeurs pour faciliter la gestion de votre parc et de vos événements :\r\n\r\n* **Scanner QR Code :** Retrouvez instantanément la fiche d'un équipement ou d'un conteneur en scannant son code directement depuis l'application. La génération des codes a également été rendue plus fluide.\r\n* **Centre de Notifications & Alertes :** Ne ratez plus rien ! Un nouveau système d'alertes (dans l'app et par email) vous prévient des maintenances, équipements manquants ou conflits. Vous pouvez configurer vos préférences d'envoi.",
|
||||||
"timestamp": "2026-02-13T17:07:39.024Z"
|
"timestamp": "2026-02-18T12:43:19.791Z"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user