/// ============================================================ /// 【课堂习题 · 收藏 / 错题本】(1:1 迁移 Vue exerciseCollect.js) /// /// type=1 收藏;type=2 错题(仅 view 模式可用)。 /// ============================================================ library; import 'package:new_learn/core/api/conquerPackage/classExercises/api.dart'; import 'package:new_learn/features/conquerPackage/classExercises/controllers/exercise_session.dart'; import 'package:new_learn/features/conquerPackage/classExercises/models/question_model.dart'; class ExerciseCollectHandlers { ExerciseCollectHandlers({ required this.session, required this.bridge, }); final ExerciseSession session; final ExerciseUiBridge bridge; final ClassExercisesApi _api = ClassExercisesApi.instance; dynamic _field(dynamic resp, String key) { if (resp is Map) { if (resp[key] != null) return resp[key]; final data = resp['data']; if (data is Map && data[key] != null) return data[key]; } return null; } /// type:1=收藏,2=错题本 Future onClickAddUserCollect(int type) async { // 错题仅查看模式可用 if (type == 2 && !session.isView) return; final info = session.currentQuestion; if (info == null) return; final selected = type == 1 ? info.isCollect : info.isWrongCollect; try { if (selected) { final id = type == 1 ? info.collectId : info.wrongCollectId; await _api.cancleCollect({ 'type': type, 'id': id ?? 0, }); _syncCollectState(type, true, null, info); bridge.toast(type == 1 ? '取消收藏成功' : '取消错题成功'); } else { final packId = session.totalPackId.isNotEmpty ? session.totalPackId : session.packId; final res = await _api.addUserCollect({ 'type': type, 'packId': packId, 'questionId': info.questionId, 'recordQuestionId': info.id, }); final resId = _field(res, 'id'); _syncCollectState(type, false, resId, info); bridge.toast(type == 1 ? '收藏成功' : '错题添加成功'); } bridge.notifyListeners(); } catch (_) { bridge.toast(type == 1 ? '收藏失败' : '失败'); } } /// 同步收藏态(对标 syncCollectState) void _syncCollectState( int type, bool wasSelected, dynamic resId, QuestionModel info, ) { if (type == 2) { info.isWrongCollect = !wasSelected; info.wrongCollectId = wasSelected ? 0 : resId; } else { info.isCollect = !wasSelected; info.collectId = wasSelected ? 0 : resId; } } }