import 'package:aioa_mobile/core/auth/authenticated_http_client.dart'; import 'package:aioa_mobile/core/config/runtime_config.dart'; import 'package:aioa_mobile/features/requests/data/leave_request_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; final leaveRequestRepositoryProvider = Provider( (ref) => LeaveRequestRepository( client: ref.watch(authenticatedHttpClientProvider), baseUrl: RuntimeConfig.apiBaseUrl, ), ); final leaveRequestListProvider = AsyncNotifierProvider>( LeaveRequestListController.new, ); class LeaveRequestListController extends AsyncNotifier> { @override Future> build() => ref.read(leaveRequestRepositoryProvider).list(); Future refresh() async { state = const AsyncLoading(); state = await AsyncValue.guard( () => ref.read(leaveRequestRepositoryProvider).list(), ); } } class LeaveRequestDetail { const LeaveRequestDetail({required this.request, required this.timeline}); final LeaveRequestItem request; final List timeline; } final leaveRequestDetailProvider = AsyncNotifierProvider.family< LeaveRequestDetailController, LeaveRequestDetail, String >((id) => LeaveRequestDetailController(id)); class LeaveRequestDetailController extends AsyncNotifier { LeaveRequestDetailController(this.id); final String id; @override Future build() async { final repository = ref.read(leaveRequestRepositoryProvider); final results = await Future.wait([ repository.get(id), repository.timeline(id), ]); return LeaveRequestDetail( request: results[0] as LeaveRequestItem, timeline: results[1] as List, ); } Future transition(String action) async { final current = state.value; if (current == null) return '申请尚未加载完成'; try { final updated = await ref .read(leaveRequestRepositoryProvider) .transition(current.request, action); final timeline = await ref .read(leaveRequestRepositoryProvider) .timeline(id); state = AsyncData( LeaveRequestDetail(request: updated, timeline: timeline), ); ref.invalidate(leaveRequestListProvider); return null; } on LeaveRequestException catch (error) { return error.message; } } }