import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/user.dart'; import 'package:filcnaplo_kreta_api/client/api.dart'; import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:filcnaplo_kreta_api/models/homework.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class HomeworkProvider with ChangeNotifier { // Private late final SettingsProvider _settings; late final UserProvider _user; late final DatabaseProvider _database; // Public late List _homework; late BuildContext _context; List get homework => _homework; HomeworkProvider({ List initialHomework = const [], required BuildContext context, required DatabaseProvider database, }) { _homework = List.castFrom(initialHomework); _context = context; _database = database; if (_homework.isEmpty) restore(); } Future restore() async { String? userId = Provider.of(_context, listen: false).id; // Load homework from the database if (userId != null) { var dbHomework = await Provider.of(_context, listen: false) .userQuery .getHomework(userId: userId); _homework = dbHomework; await convertBySettings(); } } Future convertBySettings() async { Map renamedSubjects = (await _database.query.getSettings(_database)).renamedSubjectsEnabled ? await _database.userQuery.renamedSubjects(userId: _user.id!) : {}; Map renamedTeachers = (await _database.query.getSettings(_database)).renamedTeachersEnabled ? await _database.userQuery.renamedTeachers(userId: _user.id!) : {}; for (Homework homework in _homework) { homework.subject.renamedTo = renamedSubjects.isNotEmpty ? renamedSubjects[homework.subject.id] : null; homework.teacher.renamedTo = renamedTeachers.isNotEmpty ? renamedTeachers[homework.teacher.id] : null; } notifyListeners(); } // Fetches Homework from the Kreta API then stores them in the database Future fetch({DateTime? from, bool db = true}) async { User? user = Provider.of(_context, listen: false).user; if (user == null) throw "Cannot fetch Homework for User null"; String iss = user.instituteCode; List? homeworkJson = []; try { homeworkJson = await Provider.of(_context, listen: false) .getAPI(KretaAPI.homework(iss, start: from)); } catch (e) { // error fetcing homework (unknown error) } if (homeworkJson == null) { if (kDebugMode) print("Cannot fetch Homework for User ${user.id}"); return; } List homework = []; await Future.forEach(homeworkJson.cast(), (Map hw) async { Map? e = await Provider.of(_context, listen: false) .getAPI(KretaAPI.homework(iss, id: hw["Uid"])); Map renamedSubjects = _settings.renamedSubjectsEnabled ? await _database.userQuery.renamedSubjects(userId: _user.user!.id) : {}; if (e != null) { Homework hw = Homework.fromJson(e); hw.subject.renamedTo = renamedSubjects.isNotEmpty ? renamedSubjects[hw.subject.id] : null; homework.add(hw); } }); if (homework.isEmpty && _homework.isEmpty) return; if (db) await store(homework); _homework = homework; notifyListeners(); } // Stores Homework in the database Future store(List homework) async { User? user = Provider.of(_context, listen: false).user; if (user == null) throw "Cannot store Homework for User null"; String userId = user.id; await Provider.of(_context, listen: false) .userStore .storeHomework(homework, userId: userId); } }