refactoring

This commit is contained in:
dahoud
2026-03-31 09:14:47 +00:00
parent 9bfffeeebe
commit 5383df6dcb
200 changed files with 11192 additions and 7063 deletions

View File

@@ -81,14 +81,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
totalPages: result.totalPages,
));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur inattendue lors du chargement des événements: $e',
message: 'Erreur lors du chargement des événements. Veuillez réessayer.',
error: e,
));
}
@@ -113,14 +115,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
));
}
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement de l\'événement: $e',
message: 'Erreur lors du chargement de l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -138,6 +142,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementCreated(evenement));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
if (e.response?.statusCode == 400) {
final errors = _extractValidationErrors(e.response?.data);
emit(EvenementsValidationError(
@@ -153,8 +158,9 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
));
}
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors de la création de l\'événement: $e',
message: 'Erreur lors de la création de l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -172,6 +178,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementUpdated(evenement));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
if (e.response?.statusCode == 400) {
final errors = _extractValidationErrors(e.response?.data);
emit(EvenementsValidationError(
@@ -187,8 +194,9 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
));
}
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors de la mise à jour de l\'événement: $e',
message: 'Erreur lors de la mise à jour de l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -206,14 +214,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementDeleted(event.id));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors de la suppression de l\'événement: $e',
message: 'Erreur lors de la suppression de l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -240,14 +250,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
totalPages: result.totalPages,
));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement des événements à venir: $e',
message: 'Erreur lors du chargement des événements à venir. Veuillez réessayer.',
error: e,
));
}
@@ -274,14 +286,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
totalPages: result.totalPages,
));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement des événements en cours: $e',
message: 'Erreur lors du chargement des événements en cours. Veuillez réessayer.',
error: e,
));
}
@@ -308,14 +322,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
totalPages: result.totalPages,
));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement des événements passés: $e',
message: 'Erreur lors du chargement des événements passés. Veuillez réessayer.',
error: e,
));
}
@@ -333,14 +349,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementInscrit(event.evenementId));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors de l\'inscription à l\'événement: $e',
message: 'Erreur lors de l\'inscription à l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -358,14 +376,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementDesinscrit(event.evenementId));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors de la désinscription de l\'événement: $e',
message: 'Erreur lors de la désinscription de l\'événement. Veuillez réessayer.',
error: e,
));
}
@@ -386,14 +406,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
participants: participants,
));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement des participants: $e',
message: 'Erreur lors du chargement des participants. Veuillez réessayer.',
error: e,
));
}
@@ -411,14 +433,16 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(EvenementsStatsLoaded(stats));
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) return;
emit(EvenementsNetworkError(
message: _getNetworkErrorMessage(e),
code: e.response?.statusCode.toString(),
error: e,
));
} catch (e) {
if (e is DioException && e.type == DioExceptionType.cancel) return;
emit(EvenementsError(
message: 'Erreur lors du chargement des statistiques: $e',
message: 'Erreur lors du chargement des statistiques. Veuillez réessayer.',
error: e,
));
}

View File

@@ -119,14 +119,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des événements: ${response.statusCode}');
}
} on DioException catch (e) {
if (e.response != null) {
throw Exception('Erreur HTTP ${e.response!.statusCode}: ${e.response!.data}');
} else {
throw Exception('Erreur réseau: ${e.type} - ${e.message ?? e.error}');
}
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des événements: $e');
rethrow;
}
}
@@ -143,12 +139,13 @@ class EvenementRepositoryImpl implements IEvenementRepository {
throw Exception('Erreur lors de la récupération de l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) rethrow;
if (e.response?.statusCode == 404) {
return null;
}
throw Exception('Erreur réseau lors de la récupération de l\'événement: ${e.message}');
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération de l\'événement: $e');
rethrow;
}
}
@@ -165,10 +162,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la création de l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la création de l\'événement: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la création de l\'événement: $e');
rethrow;
}
}
@@ -185,10 +182,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la mise à jour de l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la mise à jour de l\'événement: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la mise à jour de l\'événement: $e');
rethrow;
}
}
@@ -200,10 +197,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
if (response.statusCode != 204 && response.statusCode != 200) {
throw Exception('Erreur lors de la suppression de l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la suppression de l\'événement: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la suppression de l\'événement: $e');
rethrow;
}
}
@@ -220,10 +217,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des événements à venir: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des événements à venir: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des événements à venir: $e');
rethrow;
}
}
@@ -240,10 +237,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des événements en cours: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des événements en cours: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des événements en cours: $e');
rethrow;
}
}
@@ -260,10 +257,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des événements passés: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des événements passés: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des événements passés: $e');
rethrow;
}
}
@@ -275,10 +272,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
if (response.statusCode != 200 && response.statusCode != 201) {
throw Exception('Erreur lors de l\'inscription à l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de l\'inscription à l\'événement: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de l\'inscription à l\'événement: $e');
rethrow;
}
}
@@ -290,10 +287,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
if (response.statusCode != 200 && response.statusCode != 204) {
throw Exception('Erreur lors de la désinscription de l\'événement: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la désinscription de l\'événement: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la désinscription de l\'événement: $e');
rethrow;
}
}
@@ -309,10 +306,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des participants: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des participants: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des participants: $e');
rethrow;
}
}
@@ -325,7 +322,8 @@ class EvenementRepositoryImpl implements IEvenementRepository {
return data['inscrit'] == true;
}
return false;
} on DioException catch (_) {
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) rethrow;
return false;
} catch (_) {
return false;
@@ -342,10 +340,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des statistiques: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des statistiques: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des statistiques: $e');
rethrow;
}
}
@@ -368,14 +366,15 @@ class EvenementRepositoryImpl implements IEvenementRepository {
throw Exception('Erreur lors de la soumission du feedback: ${response.statusCode}');
}
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) rethrow;
if (e.response?.statusCode == 400) {
// Erreur métier (déjà soumis, pas participant, etc.)
final errorMsg = e.response?.data['error'] ?? 'Erreur lors de la soumission du feedback';
throw Exception(errorMsg);
}
throw Exception('Erreur réseau lors de la soumission du feedback: ${e.message}');
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la soumission du feedback: $e');
rethrow;
}
}
@@ -389,10 +388,10 @@ class EvenementRepositoryImpl implements IEvenementRepository {
} else {
throw Exception('Erreur lors de la récupération des feedbacks: ${response.statusCode}');
}
} on DioException catch (e) {
throw Exception('Erreur réseau lors de la récupération des feedbacks: ${e.message}');
} on DioException {
rethrow;
} catch (e) {
throw Exception('Erreur inattendue lors de la récupération des feedbacks: $e');
rethrow;
}
}
}

View File

@@ -2,6 +2,7 @@
library event_detail_page;
import 'package:flutter/material.dart';
import '../../../../shared/design_system/tokens/app_colors.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../core/di/injection.dart';
import '../../bloc/evenements_bloc.dart';
@@ -52,7 +53,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
return Scaffold(
appBar: AppBar(
title: const Text('Détails de l\'événement'),
backgroundColor: const Color(0xFF3B82F6),
backgroundColor: AppColors.primaryGreen,
foregroundColor: Colors.white,
actions: [
IconButton(
@@ -85,12 +86,12 @@ class _EventDetailPageState extends State<EventDetailPage> {
Widget _buildHeader() {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
const Color(0xFF3B82F6),
const Color(0xFF3B82F6).withOpacity(0.8),
AppColors.primaryGreen,
AppColors.primaryGreen.withOpacity(0.8),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
@@ -100,10 +101,10 @@ class _EventDetailPageState extends State<EventDetailPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.2),
borderRadius: BorderRadius.circular(20),
borderRadius: BorderRadius.circular(12),
),
child: Text(
_getTypeLabel(widget.evenement.type),
@@ -150,7 +151,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
Widget _buildInfoSection() {
return Container(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(10),
child: Column(
children: [
_buildInfoRow(
@@ -190,7 +191,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
children: [
Icon(icon, color: const Color(0xFF3B82F6), size: 20),
Icon(icon, color: AppColors.primaryGreen, size: 20),
const SizedBox(width: 12),
Expanded(
child: Column(
@@ -223,14 +224,14 @@ class _EventDetailPageState extends State<EventDetailPage> {
if (widget.evenement.description == null) return const SizedBox.shrink();
return Container(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Description',
style: TextStyle(
fontSize: 18,
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
@@ -246,21 +247,21 @@ class _EventDetailPageState extends State<EventDetailPage> {
Widget _buildLocationSection() {
return Container(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Lieu',
style: TextStyle(
fontSize: 18,
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
Row(
children: [
const Icon(Icons.location_on, color: Color(0xFF3B82F6)),
const Icon(Icons.location_on, color: AppColors.primaryGreen),
const SizedBox(width: 8),
Expanded(
child: Text(
@@ -277,7 +278,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
Widget _buildParticipantsSection() {
return Container(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -287,7 +288,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
const Text(
'Participants',
style: TextStyle(
fontSize: 18,
fontSize: 14,
fontWeight: FontWeight.bold,
),
),
@@ -334,7 +335,7 @@ class _EventDetailPageState extends State<EventDetailPage> {
if (!isComplet) {
return FloatingActionButton.extended(
onPressed: () => _showInscriptionDialog(context, isInscrit),
backgroundColor: const Color(0xFF3B82F6),
backgroundColor: AppColors.primaryGreen,
icon: const Icon(Icons.check),
label: const Text('S\'inscrire'),
);
@@ -424,17 +425,17 @@ class _EventDetailPageState extends State<EventDetailPage> {
Color _getStatutColor(StatutEvenement statut) {
switch (statut) {
case StatutEvenement.planifie:
return Colors.blue;
return AppColors.info;
case StatutEvenement.confirme:
return Colors.green;
return AppColors.success;
case StatutEvenement.enCours:
return Colors.orange;
return AppColors.warning;
case StatutEvenement.termine:
return Colors.grey;
return AppColors.textSecondaryLight;
case StatutEvenement.annule:
return Colors.red;
return AppColors.error;
case StatutEvenement.reporte:
return Colors.purple;
return AppColors.brandGreen;
}
}
}

View File

@@ -114,7 +114,7 @@ class _EventsPageWithDataState extends State<EventsPageWithData> with TickerProv
final total = widget.totalCount;
return Container(
padding: const EdgeInsets.all(20),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: UnionFlowColors.surface,
border: Border(bottom: BorderSide(color: UnionFlowColors.border.withOpacity(0.5), width: 1)),
@@ -224,9 +224,9 @@ class _EventsPageWithDataState extends State<EventsPageWithData> with TickerProv
onRefresh: () async => context.read<EvenementsBloc>().add(const LoadEvenements()),
color: UnionFlowColors.unionGreen,
child: ListView.separated(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.all(12),
itemCount: filtered.length,
separatorBuilder: (_, __) => const SizedBox(height: 12),
separatorBuilder: (_, __) => const SizedBox(height: 6),
itemBuilder: (context, index) => _buildEventCard(filtered[index]),
),
);
@@ -238,11 +238,10 @@ class _EventsPageWithDataState extends State<EventsPageWithData> with TickerProv
return GestureDetector(
onTap: () => _showEventDetails(event),
child: Container(
padding: const EdgeInsets.all(16),
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 7),
decoration: BoxDecoration(
color: UnionFlowColors.surface,
borderRadius: BorderRadius.circular(16),
boxShadow: UnionFlowColors.softShadow,
borderRadius: BorderRadius.circular(10),
border: Border(left: BorderSide(color: _getStatutColor(event.statut), width: 4)),
),
child: Column(
@@ -331,11 +330,11 @@ class _EventsPageWithDataState extends State<EventsPageWithData> with TickerProv
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.all(24),
padding: const EdgeInsets.all(16),
decoration: const BoxDecoration(color: UnionFlowColors.goldPale, shape: BoxShape.circle),
child: const Icon(Icons.event_busy, size: 64, color: UnionFlowColors.gold),
child: const Icon(Icons.event_busy, size: 40, color: UnionFlowColors.gold),
),
const SizedBox(height: 24),
const SizedBox(height: 12),
Text('Aucun événement $type', style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w700, color: UnionFlowColors.textPrimary)),
const SizedBox(height: 8),
Text(_searchQuery.isEmpty ? 'La liste est vide pour le moment' : 'Essayez une autre recherche', style: const TextStyle(fontSize: 13, color: UnionFlowColors.textSecondary)),