121 lines
4.1 KiB
Dart
121 lines
4.1 KiB
Dart
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/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> _homework;
|
|
late BuildContext _context;
|
|
List<Homework> get homework => _homework;
|
|
|
|
HomeworkProvider({
|
|
List<Homework> initialHomework = const [],
|
|
required BuildContext context,
|
|
required DatabaseProvider database,
|
|
}) {
|
|
_homework = List.castFrom(initialHomework);
|
|
_context = context;
|
|
_database = database;
|
|
|
|
if (_homework.isEmpty) restore();
|
|
}
|
|
|
|
Future<void> restore() async {
|
|
String? userId = Provider.of<UserProvider>(_context, listen: false).id;
|
|
|
|
// Load homework from the database
|
|
if (userId != null) {
|
|
var dbHomework =
|
|
await Provider.of<DatabaseProvider>(_context, listen: false)
|
|
.userQuery
|
|
.getHomework(userId: userId);
|
|
_homework = dbHomework;
|
|
await convertBySettings();
|
|
}
|
|
}
|
|
|
|
Future<void> convertBySettings() async {
|
|
Map<String, String> renamedSubjects =
|
|
(await _database.query.getSettings(_database)).renamedSubjectsEnabled
|
|
? await _database.userQuery.renamedSubjects(userId: _user.id!)
|
|
: {};
|
|
Map<String, String> 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<void> fetch({DateTime? from, bool db = true}) async {
|
|
User? user = Provider.of<UserProvider>(_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<KretaClient>(_context, listen: false)
|
|
.getAPI(KretaAPI.homework(iss, start: from));
|
|
} catch (e) {
|
|
// error fetcing homework (unknown error)
|
|
}
|
|
|
|
if (homeworkJson == null) throw "Cannot fetch Homework for User ${user.id}";
|
|
|
|
List<Homework> homework = [];
|
|
await Future.forEach(homeworkJson.cast<Map>(), (Map hw) async {
|
|
Map? e = await Provider.of<KretaClient>(_context, listen: false)
|
|
.getAPI(KretaAPI.homework(iss, id: hw["Uid"]));
|
|
Map<String, String> 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<void> store(List<Homework> homework) async {
|
|
User? user = Provider.of<UserProvider>(_context, listen: false).user;
|
|
if (user == null) throw "Cannot store Homework for User null";
|
|
String userId = user.id;
|
|
await Provider.of<DatabaseProvider>(_context, listen: false)
|
|
.userStore
|
|
.storeHomework(homework, userId: userId);
|
|
}
|
|
}
|