refactoring and checkpoint

This commit is contained in:
DahoudG
2024-09-24 00:32:20 +00:00
parent dc73ba7dcc
commit 6b12cfeb41
159 changed files with 8119 additions and 1535 deletions

View File

@@ -1,19 +1,17 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:afterwork/data/models/event_model.dart';
import 'package:afterwork/data/datasources/event_remote_data_source.dart';
import 'event_card.dart';
import 'package:afterwork/presentation/screens/event/event_card.dart';
import '../../state_management/event_bloc.dart';
import '../dialogs/add_event_dialog.dart';
/// Écran principal pour afficher les événements.
class EventScreen extends StatefulWidget {
final EventRemoteDataSource eventRemoteDataSource;
final String userId;
final String userName; // Nom de l'utilisateur
final String userLastName; // Prénom de l'utilisateur
final String userName;
final String userLastName;
const EventScreen({
Key? key,
required this.eventRemoteDataSource,
required this.userId,
required this.userName,
required this.userLastName,
@@ -24,13 +22,11 @@ class EventScreen extends StatefulWidget {
}
class _EventScreenState extends State<EventScreen> {
late Future<List<EventModel>> _eventsFuture;
@override
void initState() {
super.initState();
// Récupérer la liste des événements à partir de la source de données distante
_eventsFuture = widget.eventRemoteDataSource.getAllEvents();
// Charger les événements lors de l'initialisation
context.read<EventBloc>().add(LoadEvents(widget.userId));
}
@override
@@ -60,161 +56,98 @@ class _EventScreenState extends State<EventScreen> {
);
if (eventData != null) {
try {
print('Tentative de création d\'un nouvel événement par l\'utilisateur ${widget.userId}');
await widget.eventRemoteDataSource.createEvent(eventData as EventModel);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Événement ajouté avec succès !')),
);
// Réactualiser la liste des événements après création
setState(() {
_eventsFuture = widget.eventRemoteDataSource.getAllEvents();
});
} catch (e) {
print('Erreur lors de la création de l\'événement: $e');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Erreur : $e')),
);
}
// Ajouter l'événement en appelant l'API via le bloc
context.read<EventBloc>().add(AddEvent(EventModel.fromJson(eventData)));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Événement ajouté avec succès !')),
);
}
},
),
],
),
body: FutureBuilder<List<EventModel>>(
future: _eventsFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
body: BlocBuilder<EventBloc, EventState>(
builder: (context, state) {
if (state is EventLoading) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
print('Erreur lors de la récupération des événements: ${snapshot.error}');
return Center(child: Text('Erreur: ${snapshot.error}'));
} else if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(child: Text('Aucun événement trouvé.'));
} else if (state is EventLoaded) {
final events = state.events;
if (events.isEmpty) {
return const Center(child: Text('Aucun événement disponible.'));
}
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemCount: events.length,
itemBuilder: (context, index) {
final event = events[index];
return EventCard(
key: ValueKey(event.id),
event: event,
userId: widget.userId,
userName: widget.userName,
userLastName: widget.userLastName,
onReact: () => _onReact(event.id),
onComment: () => _onComment(event.id),
onShare: () => _onShare(event.id),
onParticipate: () => _onParticipate(event.id),
onCloseEvent: () => _onCloseEvent(event.id),
onReopenEvent: () => _onReopenEvent(event.id),
);
},
);
} else if (state is EventError) {
return Center(child: Text('Erreur: ${state.message}'));
}
final events = snapshot.data!;
print('Nombre d\'événements récupérés: ${events.length}');
return ListView.builder(
padding: const EdgeInsets.all(16.0),
itemCount: events.length,
itemBuilder: (context, index) {
final event = events[index];
print('Affichage de l\'événement ${event.id}');
return EventCard(
key: ValueKey(event.id),
eventRemoteDataSource: widget.eventRemoteDataSource,
userId: widget.userId,
eventId: event.id,
userName: widget.userName,
userLastName: widget.userLastName,
profileImage: 'lib/assets/images/profile_picture.png',
name: '${widget.userName} ${widget.userLastName}',
eventCategory: event.category,
datePosted: event.date,
eventTitle: event.title,
eventDescription: event.description,
eventImageUrl: event.imageUrl ?? 'lib/assets/images/placeholder.png',
eventStatus: event.status,
reactionsCount: 120, // Exemple de valeur
commentsCount: 45, // Exemple de valeur
sharesCount: 30, // Exemple de valeur
onReact: () {
print('Réaction à l\'événement ${event.id}');
},
onComment: () {
print('Commentaire sur l\'événement ${event.id}');
},
onShare: () {
print('Partage de l\'événement ${event.id}');
},
onParticipate: () {
print('Participation à l\'événement ${event.id}');
},
onCloseEvent: () => _onCloseEvent(context, event.id, index),
onMoreOptions: () {
print('Affichage des options pour l\'événement ${event.id}');
},
onReopenEvent: () => _onReopenEvent(context, event.id, index),
);
},
);
return const Center(child: Text('Aucun événement disponible.'));
},
),
backgroundColor: const Color(0xFF1E1E2C),
floatingActionButton: FloatingActionButton(
onPressed: () {
// Recharger les événements
context.read<EventBloc>().add(LoadEvents(widget.userId));
},
backgroundColor: const Color(0xFF1DBF73),
child: const Icon(Icons.refresh),
),
);
}
/// Logique pour fermer un événement
void _onCloseEvent(BuildContext context, String eventId, int index) async {
try {
print('Tentative de fermeture de l\'événement $eventId');
// Appeler l'API pour fermer l'événement
await widget.eventRemoteDataSource.closeEvent(eventId);
print('Événement fermé avec succès');
// Montrer un message de succès AVANT de supprimer l'événement de la liste
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('L\'événement a été fermé avec succès.')),
);
// Supprimez l'événement de la liste après avoir affiché le SnackBar
setState(() {
_eventsFuture = _eventsFuture.then((events) {
events.removeAt(index);
return events;
});
});
} catch (e) {
print('Erreur lors de la fermeture de l\'événement: $e');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Erreur lors de la fermeture de l\'événement : $e')),
);
}
void _onReact(String eventId) {
print('Réaction à l\'événement $eventId');
// Implémentez la logique pour réagir à un événement ici
}
/// Logique pour rouvrir un événement
void _onReopenEvent(BuildContext context, String eventId, int index) async {
try {
print('Tentative de réouverture de l\'événement $eventId');
await widget.eventRemoteDataSource.reopenEvent(eventId);
print('Événement rouvert avec succès');
void _onComment(String eventId) {
print('Commentaire sur l\'événement $eventId');
// Implémentez la logique pour commenter un événement ici
}
// Montrer un message de succès
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('L\'événement a été rouvert avec succès.')),
);
void _onShare(String eventId) {
print('Partage de l\'événement $eventId');
// Implémentez la logique pour partager un événement ici
}
// Mettre à jour le statut de l'événement dans la liste des événements
setState(() {
_eventsFuture = _eventsFuture.then((events) {
final updatedEvent = EventModel(
id: events[index].id,
title: events[index].title,
description: events[index].description,
date: events[index].date,
location: events[index].location,
category: events[index].category,
link: events[index].link,
imageUrl: events[index].imageUrl,
creator: events[index].creator,
participants: events[index].participants,
status: 'OPEN', // Mettre à jour le statut à 'OPEN'
);
void _onParticipate(String eventId) {
print('Participation à l\'événement $eventId');
// Implémentez la logique pour participer à un événement ici
}
// Remplacer l'événement dans la liste
events[index] = updatedEvent;
return events;
});
});
} catch (e) {
print('Erreur lors de la réouverture de l\'événement: $e');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Erreur lors de la réouverture de l\'événement : $e')),
);
}
void _onCloseEvent(String eventId) {
print('Fermeture de l\'événement $eventId');
// Appeler le bloc pour fermer l'événement
context.read<EventBloc>().add(CloseEvent(eventId));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('L\'événement a été fermé avec succès.')),
);
}
void _onReopenEvent(String eventId) {
print('Réouverture de l\'événement $eventId');
// Appeler le bloc pour rouvrir l'événement
context.read<EventBloc>().add(ReopenEvent(eventId));
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('L\'événement a été rouvert avec succès.')),
);
}
}