import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'auth_provider.dart'; import '../services/health_service.dart'; import '../services/admin_service.dart'; import '../services/in_app_notification_service.dart'; final exerciseServiceProvider = Provider((ref) { return ExerciseService(ref.watch(apiClientProvider)); }); /// 健康数据服务 final healthServiceProvider = Provider((ref) { return HealthService(ref.watch(apiClientProvider)); }); final userServiceProvider = Provider((ref) { return UserService(ref.watch(apiClientProvider)); }); final medicationServiceProvider = Provider((ref) { return MedicationService(ref.watch(apiClientProvider)); }); final dietServiceProvider = Provider((ref) { return DietService(ref.watch(apiClientProvider)); }); final followUpServiceProvider = Provider((ref) { return FollowUpService(ref.watch(apiClientProvider)); }); final consultationServiceProvider = Provider((ref) { return ConsultationService(ref.watch(apiClientProvider)); }); final adminServiceProvider = Provider((ref) { return AdminService(ref.watch(apiClientProvider)); }); final inAppNotificationServiceProvider = Provider(( ref, ) { return InAppNotificationService(ref.watch(apiClientProvider)); }); final notificationUnreadCountProvider = FutureProvider((ref) async { ref.watch(userSessionIdentityProvider); final history = await ref .watch(inAppNotificationServiceProvider) .getHistory(); return history.unreadCount; }); /// 最新健康数据 Provider final latestHealthProvider = FutureProvider>((ref) async { ref.watch(userSessionIdentityProvider); final service = ref.watch(healthServiceProvider); return service.getLatest(); }); /// 用药列表 Provider final medicationListProvider = FutureProvider>>(( ref, ) async { ref.watch(userSessionIdentityProvider); final service = ref.watch(medicationServiceProvider); return service.getList(); }); final exercisePlansProvider = FutureProvider>>(( ref, ) async { ref.watch(userSessionIdentityProvider); return ref.watch(exerciseServiceProvider).getPlans(); }); final followUpListProvider = FutureProvider>>(( ref, ) async { ref.watch(userSessionIdentityProvider); return ref.watch(followUpServiceProvider).getList(); }); final dietRecordsProvider = FutureProvider>>(( ref, ) async { ref.watch(userSessionIdentityProvider); return ref.watch(dietServiceProvider).getRecords(); }); final medicationReminderProvider = FutureProvider>>(( ref, ) async { ref.watch(userSessionIdentityProvider); final service = ref.watch(medicationServiceProvider); return service.getReminders(); }); /// 医生列表 Provider final doctorListProvider = FutureProvider.autoDispose>>((ref) async { ref.watch(userSessionIdentityProvider); final service = ref.watch(consultationServiceProvider); return service.getDoctors().timeout(const Duration(seconds: 8)); }); /// 当前运动计划 Provider final currentExercisePlanProvider = FutureProvider?>(( ref, ) async { ref.watch(userSessionIdentityProvider); final service = ref.watch(exerciseServiceProvider); return service.getCurrentPlan().timeout(const Duration(seconds: 8)); }); typedef TodayHealthSnapshot = ({ Map health, List> reminders, Map? exercisePlan, }); /// 首页今日健康一次性快照。依赖项即使先后返回,也只在全部完成后整体更新。 final todayHealthSnapshotProvider = FutureProvider(( ref, ) async { final values = await Future.wait([ ref.watch(latestHealthProvider.future), ref.watch(medicationReminderProvider.future), ref.watch(currentExercisePlanProvider.future), ]); return ( health: values[0] as Map, reminders: values[1] as List>, exercisePlan: values[2] as Map?, ); }); /// 拍照/相册直接触发(无需跳转页面) final cameraActionProvider = NotifierProvider( CameraActionNotifier.new, ); class CameraActionNotifier extends Notifier { @override String? build() => null; void trigger(String action) => state = action; void clear() => state = null; } /// 拍饮食动作触发(不用跳多余页面) final dietActionProvider = NotifierProvider( DietActionNotifier.new, ); class DietActionNotifier extends Notifier { @override String? build() => null; void trigger(String action) => state = action; void clear() => state = null; }