import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../models/writing_task.dart'; import '../models/writing_submission.dart'; import '../services/writing_service.dart'; /// 写作任务状态 class WritingTasksState { final List tasks; final bool isLoading; final String? error; WritingTasksState({ this.tasks = const [], this.isLoading = false, this.error, }); WritingTasksState copyWith({ List? tasks, bool? isLoading, String? error, }) { return WritingTasksState( tasks: tasks ?? this.tasks, isLoading: isLoading ?? this.isLoading, error: error, ); } } /// 写作任务 Notifier class WritingTasksNotifier extends StateNotifier { final WritingService _writingService; WritingTasksNotifier(this._writingService) : super(WritingTasksState()); /// 加载写作任务列表 Future loadTasks({ WritingType? type, WritingDifficulty? difficulty, int page = 1, bool forceRefresh = false, }) async { state = state.copyWith(isLoading: true, error: null); try { final tasks = await _writingService.getWritingTasks( type: type, difficulty: difficulty, page: page, forceRefresh: forceRefresh, ); state = state.copyWith(tasks: tasks, isLoading: false); } catch (e) { state = state.copyWith( isLoading: false, error: e.toString(), ); } } /// 获取推荐任务 Future loadRecommendedTasks(String userId, {bool forceRefresh = false}) async { state = state.copyWith(isLoading: true, error: null); try { final tasks = await _writingService.getRecommendedWritingTasks( userId: userId, limit: 5, forceRefresh: forceRefresh, ); state = state.copyWith(tasks: tasks, isLoading: false); } catch (e) { state = state.copyWith( isLoading: false, error: e.toString(), ); } } } /// 写作服务 Provider final writingServiceProvider = Provider((ref) { return WritingService(); }); /// 写作任务列表 Provider final writingTasksProvider = StateNotifierProvider((ref) { final service = ref.watch(writingServiceProvider); return WritingTasksNotifier(service); }); /// 按考试类型获取写作任务 final examWritingTasksProvider = FutureProvider.family, ExamType>((ref, examType) async { final service = ref.watch(writingServiceProvider); try { // 从后端获取所有任务,然后在前端过滤 final tasks = await service.getWritingTasks(limit: 100); return tasks.where((task) => task.examType == examType).toList(); } catch (e) { return []; } }); /// 用户写作历史 Provider final userWritingHistoryProvider = FutureProvider.family, String>((ref, userId) async { final service = ref.watch(writingServiceProvider); try { return await service.getUserWritingHistory(userId: userId, limit: 3); } catch (e) { return []; } });