Files
geo/app/lib/chat/services/chat_info_service.dart
Pierre 5ab03751e1 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>
2025-08-19 19:38:03 +02:00

112 lines
3.3 KiB
Dart

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)';
}
}