diff --git a/refilc_kreta_api/lib/providers/timetable_provider.dart b/refilc_kreta_api/lib/providers/timetable_provider.dart index 4363fae7..ea7c280e 100644 --- a/refilc_kreta_api/lib/providers/timetable_provider.dart +++ b/refilc_kreta_api/lib/providers/timetable_provider.dart @@ -10,6 +10,7 @@ import 'package:flutter/foundation.dart'; class TimetableProvider with ChangeNotifier { Map> lessons = {}; + String? _activeUserId; late final UserProvider _user; late final DatabaseProvider _database; late final KretaClient _kreta; @@ -21,17 +22,38 @@ class TimetableProvider with ChangeNotifier { }) : _user = user, _database = database, _kreta = kreta { + _user.addListener(_onUserChanged); + restoreUser(); + } + + @override + void dispose() { + _user.removeListener(_onUserChanged); + super.dispose(); + } + + void _onUserChanged() { + final userId = _user.id; + if (userId == _activeUserId) return; + + _activeUserId = userId; + lessons = {}; + notifyListeners(); restoreUser(); } Future restoreUser() async { String? userId = _user.id; + _activeUserId = userId; // Load lessons from the database if (userId != null) { var dbLessons = await _database.userQuery.getLessons(userId: userId); lessons = dbLessons; await convertBySettings(); + } else { + lessons = {}; + notifyListeners(); } } @@ -72,6 +94,12 @@ class TimetableProvider with ChangeNotifier { // Fetches Lessons from the Kreta API then stores them in the database Future fetch({Week? week}) async { if (week == null) return; + + if (_activeUserId != _user.id) { + _activeUserId = _user.id; + await restoreUser(); + } + User? user = _user.user; if (user == null) throw "Cannot fetch Lessons for User null"; diff --git a/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart b/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart index 80b134f7..6c4ee002 100644 --- a/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart +++ b/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart @@ -105,6 +105,7 @@ class TimetablePageState extends State // Update timetable on user change Future _userListener() async { + await Provider.of(context, listen: false).restoreUser(); await Provider.of(context, listen: false).refreshLogin(); if (mounted) _controller.jump(_controller.currentWeek, context: context); }