challenge_add_vm.dart 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // features/challenge/add/add_challenge_viewmodel.dart
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:japp_flutter/core/models/challenge_model.dart';
  4. import 'package:japp_flutter/core/proviers/repository_providers.dart';
  5. import 'package:japp_flutter/core/repositories/challenge_repository.dart';
  6. final addChallengeProvider =
  7. AsyncNotifierProvider<AddChallengeViewModel, ChallengeModel>(
  8. AddChallengeViewModel.new,
  9. );
  10. class AddChallengeViewModel extends AsyncNotifier<ChallengeModel> {
  11. ChallengeRepository get _repository => ref.read(challengeRepositoryProvider);
  12. @override
  13. Future<ChallengeModel> build() async {
  14. // 初始化为空挑战模板
  15. return ChallengeModel(
  16. id: null,
  17. title: '',
  18. description: '',
  19. startDate: DateTime.now(),
  20. endDate: DateTime.now().add(const Duration(days: 30)),
  21. actionType: 1,
  22. cover: '',
  23. sort: 200,
  24. status: 1,
  25. difficulty: 1,
  26. remark: '',
  27. finishDate: null,
  28. parentId: 1,
  29. planFinishDate: null
  30. );
  31. }
  32. /// 更新挑战标题
  33. void updateTitle(String title) {
  34. state = AsyncData(state.value!.copyWith(title: title));
  35. }
  36. /// 更新挑战描述
  37. void updateDescription(String description) {
  38. state = AsyncData(state.value!.copyWith(description: description));
  39. }
  40. /// 更新难度级别
  41. void updateDifficulty(int difficulty) {
  42. state = AsyncData(state.value!.copyWith(difficulty: difficulty));
  43. }
  44. /// 更新日期范围
  45. void updateDateRange(DateTime start, DateTime end) {
  46. state = AsyncData(state.value!.copyWith(startDate: start, endDate: end));
  47. }
  48. /// 提交新挑战
  49. Future<void> submitChallenge() async {
  50. if (state.value == null) return;
  51. state = const AsyncLoading();
  52. state = await AsyncValue.guard(
  53. () => _repository.addChallenge(state.value!),
  54. );
  55. }
  56. }