import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/models/user.dart'; import 'package:refilc_kreta_api/client/api.dart'; import 'package:refilc_kreta_api/client/client.dart'; import 'package:refilc_kreta_api/models/exam.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ExamProvider with ChangeNotifier { late List _exams; late BuildContext _context; List get exams => _exams; ExamProvider({ List initialExams = const [], required BuildContext context, }) { _exams = List.castFrom(initialExams); _context = context; if (_exams.isEmpty) restore(); } Future restore() async { String? userId = Provider.of(_context, listen: false).id; // Load exams from the database if (userId != null) { var dbExams = await Provider.of(_context, listen: false) .userQuery .getExams(userId: userId); _exams = dbExams; notifyListeners(); await convertBySettings(); } } // for renamed subjects Future convertBySettings() async { final database = Provider.of(_context, listen: false); Map renamedSubjects = (await database.query.getSettings(database)).renamedSubjectsEnabled ? await database.userQuery.renamedSubjects( userId: // ignore: use_build_context_synchronously Provider.of(_context, listen: false).user!.id) : {}; Map renamedTeachers = (await database.query.getSettings(database)).renamedTeachersEnabled ? await database.userQuery.renamedTeachers( userId: // ignore: use_build_context_synchronously Provider.of(_context, listen: false).user!.id) : {}; for (Exam exam in _exams) { exam.subject.renamedTo = renamedSubjects.isNotEmpty ? renamedSubjects[exam.subject.id] : null; exam.teacher.renamedTo = renamedTeachers.isNotEmpty ? renamedTeachers[exam.teacher.id] : null; } notifyListeners(); } // Fetches Exams from the Kreta API then stores them in the database Future fetch() async { User? user = Provider.of(_context, listen: false).user; if (user == null) throw "Cannot fetch Exams for User null"; String iss = user.instituteCode; List? examsJson = await Provider.of(_context, listen: false) .getAPI(KretaAPI.exams(iss)); if (examsJson == null) throw "Cannot fetch Exams for User ${user.id}"; List exams = examsJson.map((e) => Exam.fromJson(e)).toList(); if (exams.isNotEmpty || _exams.isNotEmpty) await store(exams); } // Stores Exams in the database Future store(List exams) async { User? user = Provider.of(_context, listen: false).user; if (user == null) throw "Cannot store Exams for User null"; String userId = user.id; await Provider.of(_context, listen: false) .userStore .storeExams(exams, userId: userId); _exams = exams; notifyListeners(); await convertBySettings(); } }