Files
unionflow-server-api/unionflow-mobile-apps/lib/features/organisations/bloc/organisations_state.dart

283 lines
7.3 KiB
Dart

/// É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<Object?> 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<OrganisationModel> currentOrganisations;
const OrganisationsLoadingMore(this.currentOrganisations);
@override
List<Object?> get props => [currentOrganisations];
}
/// État de succès avec données
class OrganisationsLoaded extends OrganisationsState {
final List<OrganisationModel> organisations;
final List<OrganisationModel> filteredOrganisations;
final bool hasReachedMax;
final int currentPage;
final String? currentSearch;
final StatutOrganisation? statusFilter;
final TypeOrganisation? typeFilter;
final OrganisationSortType? sortType;
final bool sortAscending;
final Map<String, dynamic>? 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<OrganisationModel>? organisations,
List<OrganisationModel>? filteredOrganisations,
bool? hasReachedMax,
int? currentPage,
String? currentSearch,
StatutOrganisation? statusFilter,
TypeOrganisation? typeFilter,
OrganisationSortType? sortType,
bool? sortAscending,
Map<String, dynamic>? 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<String, int> get quickStats {
final actives = organisations.where((org) => org.statut == StatutOrganisation.active).length;
final inactives = organisations.length - actives;
final totalMembres = organisations.fold<int>(0, (sum, org) => sum + org.nombreMembres);
return {
'total': organisations.length,
'actives': actives,
'inactives': inactives,
'totalMembres': totalMembres,
};
}
@override
List<Object?> 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<OrganisationModel>? previousOrganisations;
const OrganisationsError(
this.message, {
this.details,
this.previousOrganisations,
});
@override
List<Object?> 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<Object?> get props => [id];
}
/// État d'organisation chargée
class OrganisationLoaded extends OrganisationsState {
final OrganisationModel organisation;
const OrganisationLoaded(this.organisation);
@override
List<Object?> 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<Object?> 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<Object?> get props => [organisation];
}
/// État de mise à jour d'organisation
class OrganisationUpdating extends OrganisationsState {
final String id;
const OrganisationUpdating(this.id);
@override
List<Object?> get props => [id];
}
/// État de succès de mise à jour
class OrganisationUpdated extends OrganisationsState {
final OrganisationModel organisation;
const OrganisationUpdated(this.organisation);
@override
List<Object?> get props => [organisation];
}
/// État de suppression d'organisation
class OrganisationDeleting extends OrganisationsState {
final String id;
const OrganisationDeleting(this.id);
@override
List<Object?> get props => [id];
}
/// État de succès de suppression
class OrganisationDeleted extends OrganisationsState {
final String id;
const OrganisationDeleted(this.id);
@override
List<Object?> get props => [id];
}
/// État d'activation d'organisation
class OrganisationActivating extends OrganisationsState {
final String id;
const OrganisationActivating(this.id);
@override
List<Object?> get props => [id];
}
/// État de succès d'activation
class OrganisationActivated extends OrganisationsState {
final OrganisationModel organisation;
const OrganisationActivated(this.organisation);
@override
List<Object?> 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<String, dynamic> stats;
const OrganisationsStatsLoaded(this.stats);
@override
List<Object?> get props => [stats];
}
/// État d'erreur des statistiques
class OrganisationsStatsError extends OrganisationsState {
final String message;
const OrganisationsStatsError(this.message);
@override
List<Object?> get props => [message];
}