import 'package:http/http.dart'; 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, _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 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(); print('MY SUMMARIES: ${summaries.length}'); /// 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(); /// UPDATE LESSONS _lessons = _lessons.map((lesson) { return lesson.copyWith( access: lessonAccessMap[lesson.id] ?? lesson.access, ); }).toList(); notifyListeners(); } }