feat: Release version 3.1.4 - Mode terrain et génération PDF
✨ Nouvelles fonctionnalités: - Ajout du mode terrain pour utilisation mobile hors connexion - Génération automatique de reçus PDF avec template personnalisé - Révision complète du système de cartes avec amélioration des performances 🔧 Améliorations techniques: - Refactoring du module chat avec architecture simplifiée - Optimisation du système de sécurité NIST SP 800-63B - Amélioration de la gestion des secteurs géographiques - Support UTF-8 étendu pour les noms d'utilisateurs 📱 Application mobile: - Nouveau mode terrain dans user_field_mode_page - Interface utilisateur adaptative pour conditions difficiles - Synchronisation offline améliorée 🗺️ Cartographie: - Optimisation des performances MapBox - Meilleure gestion des tuiles hors ligne - Amélioration de l'affichage des secteurs 📄 Documentation: - Ajout guide Android (ANDROID-GUIDE.md) - Documentation sécurité API (API-SECURITY.md) - Guide module chat (CHAT_MODULE.md) 🐛 Corrections: - Résolution des erreurs 400 lors de la création d'utilisateurs - Correction de la validation des noms d'utilisateurs - Fix des problèmes de synchronisation chat 🤖 Generated with Claude Code (https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
112
app/lib/chat/services/chat_info_service.dart
Normal file
112
app/lib/chat/services/chat_info_service.dart
Normal file
@@ -0,0 +1,112 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
/// Service pour gérer les informations globales du chat (badges, stats)
|
||||
/// Récupère les infos depuis l'API au login et les maintient à jour
|
||||
class ChatInfoService extends ChangeNotifier {
|
||||
static ChatInfoService? _instance;
|
||||
static ChatInfoService get instance => _instance ??= ChatInfoService._();
|
||||
|
||||
ChatInfoService._();
|
||||
|
||||
// Stats du chat
|
||||
int _totalRooms = 0;
|
||||
int _unreadMessages = 0;
|
||||
DateTime? _lastUpdate;
|
||||
|
||||
// Getters
|
||||
int get totalRooms => _totalRooms;
|
||||
int get unreadMessages => _unreadMessages;
|
||||
DateTime? get lastUpdate => _lastUpdate;
|
||||
bool get hasUnread => _unreadMessages > 0;
|
||||
|
||||
/// Met à jour les infos depuis la réponse de login
|
||||
/// Attend une structure : { "chat": { "total_rooms": 5, "unread_messages": 12 } }
|
||||
void updateFromLogin(Map<String, dynamic> loginData) {
|
||||
debugPrint('📊 ChatInfoService: Mise à jour depuis login');
|
||||
|
||||
final chatData = loginData['chat'];
|
||||
if (chatData != null && chatData is Map<String, dynamic>) {
|
||||
_totalRooms = chatData['total_rooms'] ?? 0;
|
||||
_unreadMessages = chatData['unread_messages'] ?? 0;
|
||||
_lastUpdate = DateTime.now();
|
||||
|
||||
debugPrint('💬 Chat stats - Rooms: $_totalRooms, Non lus: $_unreadMessages');
|
||||
notifyListeners();
|
||||
} else {
|
||||
debugPrint('⚠️ Pas de données chat dans la réponse login');
|
||||
}
|
||||
}
|
||||
|
||||
/// Met à jour directement les stats
|
||||
void updateStats({int? totalRooms, int? unreadMessages}) {
|
||||
bool hasChanged = false;
|
||||
|
||||
if (totalRooms != null && totalRooms != _totalRooms) {
|
||||
_totalRooms = totalRooms;
|
||||
hasChanged = true;
|
||||
}
|
||||
|
||||
if (unreadMessages != null && unreadMessages != _unreadMessages) {
|
||||
_unreadMessages = unreadMessages;
|
||||
hasChanged = true;
|
||||
}
|
||||
|
||||
if (hasChanged) {
|
||||
_lastUpdate = DateTime.now();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
/// Décrémente le nombre de messages non lus
|
||||
void decrementUnread(int count) {
|
||||
if (count > 0) {
|
||||
_unreadMessages = (_unreadMessages - count).clamp(0, 999);
|
||||
_lastUpdate = DateTime.now();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
/// Marque tous les messages d'une room comme lus
|
||||
void markRoomAsRead(int messagesCount) {
|
||||
if (messagesCount > 0) {
|
||||
decrementUnread(messagesCount);
|
||||
}
|
||||
}
|
||||
|
||||
/// Incrémente le nombre de messages non lus (nouveau message reçu)
|
||||
void incrementUnread(int count) {
|
||||
if (count > 0) {
|
||||
_unreadMessages = (_unreadMessages + count).clamp(0, 999);
|
||||
_lastUpdate = DateTime.now();
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
/// Réinitialise les stats (au logout)
|
||||
void reset() {
|
||||
_totalRooms = 0;
|
||||
_unreadMessages = 0;
|
||||
_lastUpdate = null;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// Force un refresh des stats depuis l'API
|
||||
Future<void> refreshFromApi() async {
|
||||
// Cette méthode pourrait appeler directement l'API
|
||||
// Pour l'instant on la laisse vide, elle sera utile plus tard
|
||||
debugPrint('📊 ChatInfoService: Refresh depuis API demandé');
|
||||
}
|
||||
|
||||
/// Retourne un label formaté pour le badge
|
||||
String get badgeLabel {
|
||||
if (_unreadMessages == 0) return '';
|
||||
if (_unreadMessages > 99) return '99+';
|
||||
return _unreadMessages.toString();
|
||||
}
|
||||
|
||||
/// Debug info
|
||||
@override
|
||||
String toString() {
|
||||
return 'ChatInfoService(rooms: $_totalRooms, unread: $_unreadMessages, lastUpdate: $_lastUpdate)';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user