/// Entité métier Message v4 /// /// Correspond au DTO backend : MessageResponse library message; import 'package:equatable/equatable.dart'; /// Message dans une conversation class Message extends Equatable { final String id; final String typeMessage; // TEXTE | VOCAL | IMAGE | SYSTEME final String? contenu; final String? urlFichier; final int? dureeAudio; final bool supprime; final String? expediteurId; final String? expediteurNom; final String? expediteurPrenom; final String? messageParentId; final String? messageParentApercu; final DateTime? dateEnvoi; const Message({ required this.id, required this.typeMessage, this.contenu, this.urlFichier, this.dureeAudio, this.supprime = false, this.expediteurId, this.expediteurNom, this.expediteurPrenom, this.messageParentId, this.messageParentApercu, this.dateEnvoi, }); String get expediteurNomComplet { if (expediteurPrenom != null && expediteurNom != null) { return '$expediteurPrenom $expediteurNom'; } if (expediteurPrenom != null) return expediteurPrenom!; if (expediteurNom != null) return expediteurNom!; return ''; } bool get isTexte => typeMessage == 'TEXTE'; bool get isVocal => typeMessage == 'VOCAL'; bool get isImage => typeMessage == 'IMAGE'; bool get isSysteme => typeMessage == 'SYSTEME'; bool get hasParent => messageParentId != null; /// Texte à afficher dans la liste (aperçu) String get apercu { if (supprime) return '🚫 Message supprimé'; if (isVocal) return '🎙️ Note vocale${dureeAudio != null ? ' (${dureeAudio}s)' : ''}'; if (isImage) return '📷 Image'; if (isSysteme) return contenu ?? '🔔 Notification système'; return contenu ?? ''; } @override List get props => [ id, typeMessage, contenu, urlFichier, dureeAudio, supprime, expediteurId, expediteurNom, expediteurPrenom, messageParentId, messageParentApercu, dateEnvoi, ]; }