52 lines
1.9 KiB
Dart
52 lines
1.9 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../../../core/api/api_client.dart';
|
|
import '../../../core/api/api_endpoints.dart';
|
|
import '../../../core/api/api_response.dart';
|
|
import '../domain/machine_detail.dart';
|
|
|
|
/// Dépôt de données machines (lookup, détail, créneaux).
|
|
class MachineRepository {
|
|
MachineRepository(this._apiClient);
|
|
|
|
final ApiClient _apiClient;
|
|
|
|
Future<MachineDetail> lookup({String? qrCode, String? machineUuid}) async {
|
|
final response = await _apiClient.get(
|
|
ApiEndpoints.machineLookup,
|
|
queryParameters: {
|
|
if (qrCode != null) 'qr_code': qrCode,
|
|
if (machineUuid != null) 'machine_uuid': machineUuid,
|
|
},
|
|
);
|
|
return MachineDetail.fromJson(ApiResponse.payload(response.data));
|
|
}
|
|
|
|
Future<MachineDetail> fetchDetail(String uuid) async {
|
|
final response = await _apiClient.get(ApiEndpoints.machine(uuid));
|
|
return MachineDetail.fromJson(ApiResponse.payload(response.data));
|
|
}
|
|
|
|
Future<List<TimeSlot>> fetchAvailability(String uuid, DateTime date) async {
|
|
final response = await _apiClient.get(
|
|
ApiEndpoints.machineAvailability(uuid),
|
|
queryParameters: {'date': date.toIso8601String().split('T').first},
|
|
);
|
|
final slots = ApiResponse.payload(response.data)['slots'] as List<dynamic>? ?? [];
|
|
return slots.map((s) => TimeSlot.fromJson(s as Map<String, dynamic>)).toList();
|
|
}
|
|
}
|
|
|
|
final machineRepositoryProvider = Provider<MachineRepository>((ref) {
|
|
return MachineRepository(ref.watch(apiClientProvider));
|
|
});
|
|
|
|
final machineDetailProvider = FutureProvider.family<MachineDetail, String>((ref, uuid) async {
|
|
return ref.watch(machineRepositoryProvider).fetchDetail(uuid);
|
|
});
|
|
|
|
final machineAvailabilityProvider =
|
|
FutureProvider.family<List<TimeSlot>, ({String uuid, DateTime date})>((ref, params) async {
|
|
return ref.watch(machineRepositoryProvider).fetchAvailability(params.uuid, params.date);
|
|
});
|