From b8d7cfcb8d351e2ccc4e976c95749196bfcd48bf Mon Sep 17 00:00:00 2001 From: DahoudG Date: Sun, 1 Sep 2024 05:07:43 +0000 Subject: [PATCH] =?UTF-8?q?Refactoring=20:=20Fonctionnalit=C3=A9=20de=20Cr?= =?UTF-8?q?=C3=A9ation=20d'un=20=C3=A9v=C3=A8nement=20est=20OK.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasources/event_remote_data_source.dart | 1 + lib/data/models/event_model.dart | 8 +- .../screens/dialogs/add_event_dialog.dart | 43 +++++++---- .../state_management/event_bloc.dart | 73 +++++++++++++++++++ 4 files changed, 105 insertions(+), 20 deletions(-) diff --git a/lib/data/datasources/event_remote_data_source.dart b/lib/data/datasources/event_remote_data_source.dart index 33a41ee..66864f3 100644 --- a/lib/data/datasources/event_remote_data_source.dart +++ b/lib/data/datasources/event_remote_data_source.dart @@ -4,6 +4,7 @@ import 'package:afterwork/data/models/event_model.dart'; import 'package:http/http.dart' as http; import '../../core/errors/exceptions.dart'; +/// Source de données pour les événements distants. class EventRemoteDataSource { final http.Client client; diff --git a/lib/data/models/event_model.dart b/lib/data/models/event_model.dart index d733a9d..3d7a6dc 100644 --- a/lib/data/models/event_model.dart +++ b/lib/data/models/event_model.dart @@ -22,7 +22,7 @@ class EventModel { required this.location, required this.category, required this.link, - required this.imageUrl, + this.imageUrl, required this.creator, required this.participants, }); @@ -36,14 +36,14 @@ class EventModel { date: json['date'], location: json['location'], category: json['category'], - link: json['link'], - imageUrl: json['imageUrl'], + link: json['link'] ?? '', // Assure qu'il ne soit pas null + imageUrl: json['imageUrl'] ?? '', // Assure qu'il ne soit pas null creator: UserModel.fromJson(json['creator']), participants: json['participants'] != null ? (json['participants'] as List) .map((user) => UserModel.fromJson(user)) .toList() - : [], + : [], // Si participants est null, retourne une liste vide ); } diff --git a/lib/presentation/screens/dialogs/add_event_dialog.dart b/lib/presentation/screens/dialogs/add_event_dialog.dart index 6932cbb..a1b945a 100644 --- a/lib/presentation/screens/dialogs/add_event_dialog.dart +++ b/lib/presentation/screens/dialogs/add_event_dialog.dart @@ -2,14 +2,13 @@ import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; -import 'package:afterwork/data/models/creator_model.dart'; import 'package:afterwork/data/models/event_model.dart'; -import 'package:afterwork/data/models/participant_model.dart'; -import 'package:provider/provider.dart'; -import 'package:afterwork/data/providers/user_provider.dart'; +import 'package:afterwork/data/models/user_model.dart'; import 'package:afterwork/core/constants/urls.dart'; import '../location/location_picker_screen.dart'; +/// Classe représentant la boîte de dialogue pour ajouter un nouvel événement. +/// Cette boîte de dialogue permet à l'utilisateur de remplir les détails d'un nouvel événement. class AddEventDialog extends StatefulWidget { final String userId; final String userName; @@ -27,15 +26,15 @@ class AddEventDialog extends StatefulWidget { } class _AddEventDialogState extends State { - final _formKey = GlobalKey(); + final _formKey = GlobalKey(); // Clé globale pour valider le formulaire String _title = ''; String _description = ''; DateTime? _selectedDate; String? _imagePath; - String _location = 'Abidjan'; // Par défaut à Cocody, Abidjan + String _location = 'Abidjan'; // Par défaut à Cocody, Abidjan String _category = ''; String _link = ''; - LatLng? _selectedLatLng = const LatLng(5.348722, -3.985038); // Par défaut à Cocody, Abidjan + LatLng? _selectedLatLng = const LatLng(5.348722, -3.985038); // Par défaut à Cocody, Abidjan @override Widget build(BuildContext context) { @@ -48,7 +47,7 @@ class _AddEventDialogState extends State { child: Padding( padding: const EdgeInsets.all(16.0), child: Form( - key: _formKey, + key: _formKey, // Formulaire clé pour valider l'entrée des utilisateurs child: Column( mainAxisSize: MainAxisSize.min, children: [ @@ -75,6 +74,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de saisie du titre de l'événement. Widget _buildTitleField() { return TextFormField( decoration: InputDecoration( @@ -103,6 +103,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de saisie de la description de l'événement. Widget _buildDescriptionField() { return TextFormField( decoration: InputDecoration( @@ -132,6 +133,7 @@ class _AddEventDialogState extends State { ); } + /// Widget pour le sélecteur de date pour l'événement. Widget _buildDatePicker() { return GestureDetector( onTap: () async { @@ -172,6 +174,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de localisation pour l'événement. Widget _buildLocationField(BuildContext context) { return GestureDetector( onTap: () async { @@ -213,6 +216,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de saisie de la catégorie de l'événement. Widget _buildCategoryField() { return TextFormField( decoration: InputDecoration( @@ -234,6 +238,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de sélection d'image pour l'événement. Widget _buildImagePicker() { return GestureDetector( onTap: () { @@ -262,6 +267,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du champ de saisie du lien associé à l'événement. Widget _buildLinkField() { return TextFormField( decoration: InputDecoration( @@ -283,6 +289,7 @@ class _AddEventDialogState extends State { ); } + /// Construction du bouton de soumission pour ajouter l'événement. Widget _buildSubmitButton() { return ElevatedButton( onPressed: () async { @@ -292,6 +299,7 @@ class _AddEventDialogState extends State { // Créer l'événement en utilisant l'ID réel de l'utilisateur pour le créateur et les participants EventModel newEvent = EventModel( + id: '', title: _title, description: _description, date: _selectedDate?.toIso8601String() ?? '', @@ -299,19 +307,22 @@ class _AddEventDialogState extends State { category: _category, link: _link, imageUrl: _imagePath ?? '', - creator: CreatorModel( - id: widget.userId, + creator: UserModel( + userId: widget.userId, nom: widget.userName, prenoms: widget.userLastName, + email: '', + motDePasse: '', ), participants: [ - ParticipantModel( - id: widget.userId, + UserModel( + userId: widget.userId, nom: widget.userName, prenoms: widget.userLastName, + email: '', + motDePasse: '', ) ], - id: '', ); // Convertir l'événement en JSON @@ -331,7 +342,7 @@ class _AddEventDialogState extends State { if (response.statusCode == 201) { // Création réussie print('Événement créé avec succès'); - Navigator.of(context).pop(true); + Navigator.of(context).pop(); // Ne passez pas de valeur ici } else { // Gérer l'erreur print('Erreur lors de la création de l\'événement: ${response.reasonPhrase}'); @@ -351,8 +362,8 @@ class _AddEventDialogState extends State { padding: const EdgeInsets.symmetric(vertical: 12.0), minimumSize: const Size(double.infinity, 40), ), - child: const Text('Ajouter l\'événement', - style: TextStyle(color: Colors.white)), + child: const Text('Ajouter l\'événement', style: TextStyle(color: Colors.white)), ); } + } diff --git a/lib/presentation/state_management/event_bloc.dart b/lib/presentation/state_management/event_bloc.dart index e69de29..c1de968 100644 --- a/lib/presentation/state_management/event_bloc.dart +++ b/lib/presentation/state_management/event_bloc.dart @@ -0,0 +1,73 @@ +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:meta/meta.dart'; +import 'package:afterwork/data/models/event_model.dart'; +import 'package:afterwork/data/datasources/event_remote_data_source.dart'; + +// Déclaration des événements +@immutable +abstract class EventEvent {} + +class LoadEvents extends EventEvent {} + +class AddEvent extends EventEvent { + final EventModel event; + + AddEvent(this.event); +} + +// Déclaration des états +@immutable +abstract class EventState {} + +class EventInitial extends EventState {} + +class EventLoading extends EventState {} + +class EventLoaded extends EventState { + final List events; + + EventLoaded(this.events); +} + +class EventError extends EventState { + final String message; + + EventError(this.message); +} + +// Bloc principal pour gérer la logique des événements +class EventBloc extends Bloc { + final EventRemoteDataSource remoteDataSource; + + EventBloc({required this.remoteDataSource}) : super(EventInitial()) { + on(_onLoadEvents); + on(_onAddEvent); + } + + // Gestion de l'événement LoadEvents + Future _onLoadEvents(LoadEvents event, Emitter emit) async { + emit(EventLoading()); + try { + final events = await remoteDataSource.getAllEvents(); + emit(EventLoaded(events)); + print('Événements chargés avec succès.'); + } catch (e) { + emit(EventError('Erreur lors du chargement des événements.')); + print('Erreur lors du chargement des événements: $e'); + } + } + + // Gestion de l'événement AddEvent + Future _onAddEvent(AddEvent event, Emitter emit) async { + emit(EventLoading()); + try { + await remoteDataSource.createEvent(event.event); + final events = await remoteDataSource.getAllEvents(); + emit(EventLoaded(events)); + print('Événement ajouté avec succès.'); + } catch (e) { + emit(EventError('Erreur lors de l\'ajout de l\'événement.')); + print('Erreur lors de l\'ajout de l\'événement: $e'); + } + } +}