/// Entités métier Conversation v4 /// /// Correspond aux DTOs backend : ConversationSummaryResponse et ConversationResponse library conversation; import 'package:equatable/equatable.dart'; import 'message.dart'; // ── Résumé de conversation (liste) ─────────────────────────────────────────── /// Résumé d'une conversation pour l'affichage en liste class ConversationSummary extends Equatable { final String id; final String typeConversation; // DIRECTE | ROLE_CANAL | GROUPE final String titre; final String statut; // ACTIVE | ARCHIVEE final String? dernierMessageApercu; final String? dernierMessageType; final DateTime? dernierMessageAt; final int nonLus; final String? organisationId; const ConversationSummary({ required this.id, required this.typeConversation, required this.titre, required this.statut, this.dernierMessageApercu, this.dernierMessageType, this.dernierMessageAt, this.nonLus = 0, this.organisationId, }); bool get hasUnread => nonLus > 0; bool get isDirecte => typeConversation == 'DIRECTE'; bool get isRoleCanal => typeConversation == 'ROLE_CANAL'; bool get isGroupe => typeConversation == 'GROUPE'; bool get isActive => statut == 'ACTIVE'; @override List get props => [ id, typeConversation, titre, statut, dernierMessageApercu, dernierMessageType, dernierMessageAt, nonLus, organisationId, ]; } // ── Participant ─────────────────────────────────────────────────────────────── /// Participant dans une conversation class ConversationParticipant extends Equatable { final String membreId; final String? prenom; final String? nom; final String? roleDansConversation; final DateTime? luJusqua; const ConversationParticipant({ required this.membreId, this.prenom, this.nom, this.roleDansConversation, this.luJusqua, }); String get nomComplet { if (prenom != null && nom != null) return '$prenom $nom'; if (prenom != null) return prenom!; if (nom != null) return nom!; return membreId; } @override List get props => [membreId, prenom, nom, roleDansConversation, luJusqua]; } // ── Conversation complète (détail) ─────────────────────────────────────────── /// Conversation complète avec participants et messages class Conversation extends Equatable { final String id; final String typeConversation; final String titre; final String statut; final String? organisationId; final String? organisationNom; final DateTime? dateCreation; final int nombreMessages; final List participants; final List messages; final int nonLus; final String? roleCible; const Conversation({ required this.id, required this.typeConversation, required this.titre, required this.statut, this.organisationId, this.organisationNom, this.dateCreation, this.nombreMessages = 0, this.participants = const [], this.messages = const [], this.nonLus = 0, this.roleCible, }); bool get isDirecte => typeConversation == 'DIRECTE'; bool get isRoleCanal => typeConversation == 'ROLE_CANAL'; bool get isGroupe => typeConversation == 'GROUPE'; bool get isActive => statut == 'ACTIVE'; @override List get props => [ id, typeConversation, titre, statut, organisationId, organisationNom, dateCreation, nombreMessages, participants, messages, nonLus, roleCible, ]; }