Files
AIOA/mobile/lib/features/requests/application/leave_request_controller.dart
T
2026-07-18 19:20:07 +08:00

81 lines
2.5 KiB
Dart

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<LeaveRequestRepository>(
(ref) => LeaveRequestRepository(
client: ref.watch(authenticatedHttpClientProvider),
baseUrl: RuntimeConfig.apiBaseUrl,
),
);
final leaveRequestListProvider =
AsyncNotifierProvider<LeaveRequestListController, List<LeaveRequestItem>>(
LeaveRequestListController.new,
);
class LeaveRequestListController extends AsyncNotifier<List<LeaveRequestItem>> {
@override
Future<List<LeaveRequestItem>> build() =>
ref.read(leaveRequestRepositoryProvider).list();
Future<void> 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<LeaveTimelineEvent> timeline;
}
final leaveRequestDetailProvider =
AsyncNotifierProvider.family<
LeaveRequestDetailController,
LeaveRequestDetail,
String
>((id) => LeaveRequestDetailController(id));
class LeaveRequestDetailController extends AsyncNotifier<LeaveRequestDetail> {
LeaveRequestDetailController(this.id);
final String id;
@override
Future<LeaveRequestDetail> 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<LeaveTimelineEvent>,
);
}
Future<String?> 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;
}
}
}