Files
mobile/lib/features/machines/data/machine_repository.dart
T

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);
});