import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:intl/intl.dart'; import '../../../core/api/api_client.dart'; import '../../../core/api/api_endpoints.dart'; import '../domain/booking.dart'; /// Fournisseur des réservations de l'utilisateur connecté. final bookingsProvider = FutureProvider>((ref) async { final response = await ref.watch(apiClientProvider).get(ApiEndpoints.bookings); final data = response.data; List list; if (data is List) { list = data; } else if (data is Map && data['data'] is List) { list = data['data'] as List; } else { list = []; } return list .map((json) => Booking.fromJson(json as Map)) .toList(); }); /// Écran listant les réservations de l'utilisateur. class BookingsScreen extends ConsumerWidget { const BookingsScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final bookingsAsync = ref.watch(bookingsProvider); return Scaffold( appBar: AppBar(title: const Text('Mes réservations')), body: bookingsAsync.when( loading: () => const Center(child: CircularProgressIndicator()), error: (error, _) => Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text('Erreur : $error'), const SizedBox(height: 12), ElevatedButton( onPressed: () => ref.invalidate(bookingsProvider), child: const Text('Réessayer'), ), ], ), ), data: (bookings) { if (bookings.isEmpty) { return const Center( child: Text('Aucune réservation.\nRéservez un créneau depuis une laverie.'), ); } return RefreshIndicator( onRefresh: () async => ref.invalidate(bookingsProvider), child: ListView.separated( padding: const EdgeInsets.all(16), itemCount: bookings.length, separatorBuilder: (_, __) => const SizedBox(height: 8), itemBuilder: (context, index) { final booking = bookings[index]; return Card( child: ListTile( leading: const Icon(Icons.event), title: Text(booking.machineName), subtitle: Text( booking.slotStart != null ? DateFormat('dd/MM/yyyy HH:mm').format(booking.slotStart!) : 'Créneau à confirmer', ), trailing: Chip(label: Text(booking.status)), ), ); }, ), ); }, ), ); } }