import 'package:stacked/stacked.dart'; import 'package:yimaru_app/models/refresh_object.dart'; import 'package:yimaru_app/ui/common/enmus.dart'; import '../app/app.locator.dart'; import '../models/access.dart'; import '../models/learn_course.dart'; import '../models/learn_lesson.dart'; import '../models/learn_module.dart'; import '../models/learn_program.dart'; import '../models/progress_summary.dart'; import 'api_service.dart'; class LearnService with ListenableServiceMixin { // Dependency injection final _apiService = locator(); // Initialization learnService() { listenToReactiveValues([_programs,_courses, _lessons, _modules]); } // Learn program List _programs = []; List get programs => _programs; // Learn course List _courses = []; List get courses => _courses; // Learn module List _modules = []; List get modules => _modules; // Learn lesson List _lessons = []; List get lessons => _lessons; // Learn progress final List _summaries = []; List get summaries => _summaries; // Learn programs Future refreshObject(String url) async { Map data = {'reference': url}; Map response = await _apiService.refreshObject(data); if (response['status'] == ResponseStatus.success) { RefreshObject object = response['data'] as RefreshObject; return object.url ?? ''; } return null; } // Learn programs Future getLearnPrograms() async { _programs = await _apiService.getLearnPrograms(); _programs.sort((a, b) => (a.sortOrder ?? 0).compareTo(b.sortOrder ?? 0)); notifyListeners(); } // Learn modules Future getLearnCourses(int id) async { _courses = await _apiService.getLearnCourses(id); _courses.sort((a, b) => (a.sortOrder ?? 0).compareTo(b.sortOrder ?? 0)); notifyListeners(); } // Learn modules Future getLearnModules(int id) async { _modules = await _apiService.getLearnModules(id); _modules.sort((a, b) => (a.sortOrder ?? 0).compareTo(b.sortOrder ?? 0)); notifyListeners(); } // Learn lessons Future getLearnLessons(int id) async { _lessons = await _apiService.getLearnLessons(id); _lessons.sort((a, b) => (a.sortOrder ?? 0).compareTo(b.sortOrder ?? 0)); notifyListeners(); } // Learn progress Future getLearnProgressSummary() async { final summaries = await _apiService.getProgressSummary(); /// PROGRAM ACCESS MAP final Map programAccessMap = {}; /// COURSE ACCESS MAP final Map courseAccessMap = {}; /// MODULE ACCESS MAP final Map moduleAccessMap = {}; /// LESSON ACCESS MAP final Map lessonAccessMap = {}; // Build maps for (final summary in summaries) { if (summary.id != null) { programAccessMap[summary.id!] = summary.access; } for (final course in summary.courses ?? []) { if (course.id != null) { courseAccessMap[course.id!] = course.access; } for (final module in course.modules ?? []) { if (module.id != null) { moduleAccessMap[module.id!] = module.access; } for (final lesson in module.lessons ?? []) { if (lesson.id != null) { lessonAccessMap[lesson.id!] = lesson.access; } } } } } /// UPDATE PROGRAMS _programs = _programs.map((program) { return program.copyWith( access: programAccessMap[program.id] ?? program.access, ); }).toList(); /// UPDATE COURSES _courses = _courses.map((course) { return course.copyWith( access: courseAccessMap[course.id] ?? course.access, ); }).toList(); /// UPDATE MODULES _modules = _modules.map((module) { return module.copyWith( access: moduleAccessMap[module.id] ?? module.access, ); }).toList(); print('MY SUMMARIES - COMPLETED COUNT: ${_modules.first.access?.completedCount}'); print('PROGRESS PERCENT: ${_modules.first.access?.progressPercent}'); /// UPDATE LESSONS _lessons = _lessons.map((lesson) { return lesson.copyWith( access: lessonAccessMap[lesson.id] ?? lesson.access, ); }).toList(); notifyListeners(); } LearnModule? getLearnModuleById(int id) { try { return _modules.firstWhere((e) => e.id == id); } catch (_) { return null; } } LearnCourse? getLearnCourseById(int id) { try { return _courses.firstWhere((e) => e.id == id); } catch (_) { return null; } } }