import 'package:flutter/material.dart'; class EventCard extends StatelessWidget { final String profileImage; final String name; final String datePosted; final String eventTitle; final String eventDescription; final String eventImageUrl; final int reactionsCount; final int commentsCount; final int sharesCount; final VoidCallback onReact; final VoidCallback onComment; final VoidCallback onShare; final VoidCallback onParticipate; final VoidCallback onCloseEvent; final VoidCallback onMoreOptions; const EventCard({ Key? key, required this.profileImage, required this.name, required this.datePosted, required this.eventTitle, required this.eventDescription, required this.eventImageUrl, required this.reactionsCount, required this.commentsCount, required this.sharesCount, required this.onReact, required this.onComment, required this.onShare, required this.onParticipate, required this.onCloseEvent, required this.onMoreOptions, required String assetImage, }) : super(key: key); @override Widget build(BuildContext context) { return Card( color: const Color(0xFF2C2C3E), margin: const EdgeInsets.symmetric(vertical: 10.0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(15.0), ), child: Padding( padding: const EdgeInsets.all(12.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildHeader(), const SizedBox(height: 10), _buildEventDetails(), const SizedBox(height: 10), _buildEventImage(), const SizedBox(height: 10), Divider(color: Colors.white.withOpacity(0.2)), _buildInteractionRow(), const SizedBox(height: 10), _buildParticipateButton(), ], ), ), ); } Widget _buildHeader() { return Row( children: [ CircleAvatar( backgroundImage: AssetImage(profileImage), radius: 25, ), const SizedBox(width: 10), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( name, style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), ), Text( datePosted, style: const TextStyle(color: Colors.white70, fontSize: 14), ), ], ), ), IconButton( icon: const Icon(Icons.more_vert, color: Colors.white), onPressed: onMoreOptions, ), IconButton( icon: const Icon(Icons.close, color: Colors.white), onPressed: onCloseEvent, ), ], ); } Widget _buildEventDetails() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( eventTitle, style: const TextStyle( color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold, ), ), const SizedBox(height: 5), Text( eventDescription, style: const TextStyle(color: Colors.white70, fontSize: 14), ), ], ); } Widget _buildEventImage() { return ClipRRect( borderRadius: BorderRadius.circular(10.0), child: Image.network( eventImageUrl, height: 180, width: double.infinity, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { return Image.asset( 'lib/assets/images/placeholder.png', height: 180, width: double.infinity, fit: BoxFit.cover, ); }, ), ); } Widget _buildInteractionRow() { return Padding( padding: const EdgeInsets.symmetric(vertical: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ _buildIconButton( icon: Icons.thumb_up_alt_outlined, label: 'Réagir', count: reactionsCount, onPressed: onReact, ), _buildIconButton( icon: Icons.comment_outlined, label: 'Commenter', count: commentsCount, onPressed: onComment, ), _buildIconButton( icon: Icons.share_outlined, label: 'Partager', count: sharesCount, onPressed: onShare, ), ], ), ); } Widget _buildIconButton({ required IconData icon, required String label, required int count, required VoidCallback onPressed, }) { return Expanded( child: TextButton.icon( onPressed: onPressed, icon: Icon(icon, color: const Color(0xFF1DBF73), size: 20), label: Text( '$label ($count)', style: const TextStyle(color: Colors.white70, fontSize: 12), ), ), ); } Widget _buildParticipateButton() { return ElevatedButton( onPressed: onParticipate, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF1DBF73), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8.0), ), padding: const EdgeInsets.symmetric(vertical: 12.0), minimumSize: const Size(double.infinity, 40), ), child: const Text('Participer', style: TextStyle(color: Colors.white)), ); } }