/// États pour le BLoC des organisations library organisations_state; import 'package:equatable/equatable.dart'; import '../data/models/organisation_model.dart'; import 'organisations_event.dart'; /// Classe de base pour tous les états des organisations abstract class OrganisationsState extends Equatable { const OrganisationsState(); @override List get props => []; } /// État initial class OrganisationsInitial extends OrganisationsState { const OrganisationsInitial(); } /// État de chargement class OrganisationsLoading extends OrganisationsState { const OrganisationsLoading(); } /// État de chargement de plus d'éléments (pagination) class OrganisationsLoadingMore extends OrganisationsState { final List currentOrganisations; const OrganisationsLoadingMore(this.currentOrganisations); @override List get props => [currentOrganisations]; } /// État de succès avec données class OrganisationsLoaded extends OrganisationsState { final List organisations; final List filteredOrganisations; final bool hasReachedMax; final int currentPage; final String? currentSearch; final StatutOrganisation? statusFilter; final TypeOrganisation? typeFilter; final OrganisationSortType? sortType; final bool sortAscending; final Map? stats; const OrganisationsLoaded({ required this.organisations, required this.filteredOrganisations, this.hasReachedMax = false, this.currentPage = 0, this.currentSearch, this.statusFilter, this.typeFilter, this.sortType, this.sortAscending = true, this.stats, }); /// Copie avec modifications OrganisationsLoaded copyWith({ List? organisations, List? filteredOrganisations, bool? hasReachedMax, int? currentPage, String? currentSearch, StatutOrganisation? statusFilter, TypeOrganisation? typeFilter, OrganisationSortType? sortType, bool? sortAscending, Map? stats, bool clearSearch = false, bool clearStatusFilter = false, bool clearTypeFilter = false, bool clearSort = false, }) { return OrganisationsLoaded( organisations: organisations ?? this.organisations, filteredOrganisations: filteredOrganisations ?? this.filteredOrganisations, hasReachedMax: hasReachedMax ?? this.hasReachedMax, currentPage: currentPage ?? this.currentPage, currentSearch: clearSearch ? null : (currentSearch ?? this.currentSearch), statusFilter: clearStatusFilter ? null : (statusFilter ?? this.statusFilter), typeFilter: clearTypeFilter ? null : (typeFilter ?? this.typeFilter), sortType: clearSort ? null : (sortType ?? this.sortType), sortAscending: sortAscending ?? this.sortAscending, stats: stats ?? this.stats, ); } /// Nombre total d'organisations int get totalCount => organisations.length; /// Nombre d'organisations filtrées int get filteredCount => filteredOrganisations.length; /// Indique si des filtres sont appliqués bool get hasFilters => currentSearch?.isNotEmpty == true || statusFilter != null || typeFilter != null; /// Indique si un tri est appliqué bool get hasSorting => sortType != null; /// Statistiques rapides Map get quickStats { final actives = organisations.where((org) => org.statut == StatutOrganisation.active).length; final inactives = organisations.length - actives; final totalMembres = organisations.fold(0, (sum, org) => sum + org.nombreMembres); return { 'total': organisations.length, 'actives': actives, 'inactives': inactives, 'totalMembres': totalMembres, }; } @override List get props => [ organisations, filteredOrganisations, hasReachedMax, currentPage, currentSearch, statusFilter, typeFilter, sortType, sortAscending, stats, ]; } /// État d'erreur class OrganisationsError extends OrganisationsState { final String message; final String? details; final List? previousOrganisations; const OrganisationsError( this.message, { this.details, this.previousOrganisations, }); @override List get props => [message, details, previousOrganisations]; } /// État de chargement d'une organisation spécifique class OrganisationLoading extends OrganisationsState { final String id; const OrganisationLoading(this.id); @override List get props => [id]; } /// État d'organisation chargée class OrganisationLoaded extends OrganisationsState { final OrganisationModel organisation; const OrganisationLoaded(this.organisation); @override List get props => [organisation]; } /// État d'erreur pour une organisation spécifique class OrganisationError extends OrganisationsState { final String message; final String? organisationId; const OrganisationError(this.message, {this.organisationId}); @override List get props => [message, organisationId]; } /// État de création d'organisation class OrganisationCreating extends OrganisationsState { const OrganisationCreating(); } /// État de succès de création class OrganisationCreated extends OrganisationsState { final OrganisationModel organisation; const OrganisationCreated(this.organisation); @override List get props => [organisation]; } /// État de mise à jour d'organisation class OrganisationUpdating extends OrganisationsState { final String id; const OrganisationUpdating(this.id); @override List get props => [id]; } /// État de succès de mise à jour class OrganisationUpdated extends OrganisationsState { final OrganisationModel organisation; const OrganisationUpdated(this.organisation); @override List get props => [organisation]; } /// État de suppression d'organisation class OrganisationDeleting extends OrganisationsState { final String id; const OrganisationDeleting(this.id); @override List get props => [id]; } /// État de succès de suppression class OrganisationDeleted extends OrganisationsState { final String id; const OrganisationDeleted(this.id); @override List get props => [id]; } /// État d'activation d'organisation class OrganisationActivating extends OrganisationsState { final String id; const OrganisationActivating(this.id); @override List get props => [id]; } /// État de succès d'activation class OrganisationActivated extends OrganisationsState { final OrganisationModel organisation; const OrganisationActivated(this.organisation); @override List get props => [organisation]; } /// État de chargement des statistiques class OrganisationsStatsLoading extends OrganisationsState { const OrganisationsStatsLoading(); } /// État des statistiques chargées class OrganisationsStatsLoaded extends OrganisationsState { final Map stats; const OrganisationsStatsLoaded(this.stats); @override List get props => [stats]; } /// État d'erreur des statistiques class OrganisationsStatsError extends OrganisationsState { final String message; const OrganisationsStatsError(this.message); @override List get props => [message]; }