forked from firka/student-legacy
fix notifications
This commit is contained in:
parent
88daf43c3a
commit
51ececc34a
@ -67,7 +67,11 @@ const userDataDB = DatabaseStruct("user_data", {
|
||||
// renamed teachers // non kreta data
|
||||
"renamed_teachers": String,
|
||||
// "subject_lesson_count": String, // non kreta data
|
||||
// notifications and surprise grades // non kreta data
|
||||
"last_seen_grade": int,
|
||||
"last_seen_absence": int,
|
||||
"last_seen_message": int,
|
||||
"last_seen_lesson": int,
|
||||
// goal planning // non kreta data
|
||||
"goal_plans": String,
|
||||
"goal_averages": String,
|
||||
@ -131,6 +135,9 @@ Future<Database> initDB(DatabaseProvider database) async {
|
||||
"renamed_teachers": "{}",
|
||||
// "subject_lesson_count": "{}", // non kreta data
|
||||
"last_seen_grade": 0,
|
||||
"last_seen_absence": 0,
|
||||
"last_seen_message": 0,
|
||||
"last_seen_lesson": 0,
|
||||
// goal planning // non kreta data
|
||||
"goal_plans": "{}",
|
||||
"goal_averages": "{}",
|
||||
|
@ -1,6 +1,7 @@
|
||||
import 'dart:convert';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/models/linked_account.dart';
|
||||
import 'package:refilc/helpers/notification_helper.dart';
|
||||
import 'package:refilc/models/self_note.dart';
|
||||
import 'package:refilc/models/subject_lesson_count.dart';
|
||||
import 'package:refilc/models/user.dart';
|
||||
@ -213,11 +214,11 @@ class UserDatabaseQuery {
|
||||
return lessonCount;
|
||||
}
|
||||
|
||||
Future<DateTime> lastSeenGrade({required String userId}) async {
|
||||
Future<DateTime> lastSeen({required String userId, required LastSeenCategory category}) async {
|
||||
List<Map> userData =
|
||||
await db.query("user_data", where: "id = ?", whereArgs: [userId]);
|
||||
if (userData.isEmpty) return DateTime(0);
|
||||
int? lastSeenDate = userData.elementAt(0)["last_seen_grade"] as int?;
|
||||
int? lastSeenDate = userData.elementAt(0)["last_seen_${category.name}"] as int?;
|
||||
if (lastSeenDate == null) return DateTime(0);
|
||||
DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate);
|
||||
return lastSeen;
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'dart:convert';
|
||||
import 'package:refilc/models/linked_account.dart';
|
||||
import 'package:refilc/helpers/notification_helper.dart';
|
||||
import 'package:refilc/models/self_note.dart';
|
||||
import 'package:refilc/models/subject_lesson_count.dart';
|
||||
import 'package:refilc_kreta_api/models/week.dart';
|
||||
@ -129,10 +130,10 @@ class UserDatabaseStore {
|
||||
where: "id = ?", whereArgs: [userId]);
|
||||
}
|
||||
|
||||
Future<void> storeLastSeenGrade(DateTime date,
|
||||
{required String userId}) async {
|
||||
Future<void> storeLastSeen(DateTime date,
|
||||
{required String userId, required LastSeenCategory category}) async {
|
||||
int lastSeenDate = date.millisecondsSinceEpoch;
|
||||
await db.update("user_data", {"last_seen_grade": lastSeenDate},
|
||||
await db.update("user_data", {"last_seen_${category.name}": lastSeenDate},
|
||||
where: "id = ?", whereArgs: [userId]);
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@ import 'package:refilc/api/providers/status_provider.dart';
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/helpers/notification_helper.i18n.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/absence.dart';
|
||||
@ -13,10 +14,17 @@ import 'package:refilc_kreta_api/providers/grade_provider.dart';
|
||||
import 'package:refilc_kreta_api/providers/timetable_provider.dart';
|
||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart'
|
||||
hide Message;
|
||||
import 'package:i18n_extension/i18n_extension.dart';
|
||||
import 'package:i18n_extension/i18n_widget.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:refilc_kreta_api/models/message.dart';
|
||||
|
||||
enum LastSeenCategory {
|
||||
grade,
|
||||
absence,
|
||||
message,
|
||||
lesson
|
||||
} // didn't know a better place for this
|
||||
|
||||
class NotificationsHelper {
|
||||
late DatabaseProvider database;
|
||||
late SettingsProvider settingsProvider;
|
||||
@ -25,36 +33,14 @@ class NotificationsHelper {
|
||||
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
|
||||
FlutterLocalNotificationsPlugin();
|
||||
|
||||
List<T> combineLists<T, K>(
|
||||
List<T> list1,
|
||||
List<T> list2,
|
||||
K Function(T) keyExtractor,
|
||||
) {
|
||||
Set<K> uniqueKeys = <K>{};
|
||||
List<T> combinedList = [];
|
||||
|
||||
for (T item in list1) {
|
||||
K key = keyExtractor(item);
|
||||
if (!uniqueKeys.contains(key)) {
|
||||
uniqueKeys.add(key);
|
||||
combinedList.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
for (T item in list2) {
|
||||
K key = keyExtractor(item);
|
||||
if (!uniqueKeys.contains(key)) {
|
||||
uniqueKeys.add(key);
|
||||
combinedList.add(item);
|
||||
}
|
||||
}
|
||||
|
||||
return combinedList;
|
||||
}
|
||||
|
||||
String dayTitle(DateTime date) {
|
||||
try {
|
||||
return DateFormat("EEEE", I18n.locale.languageCode).format(date);
|
||||
String dayTitle =
|
||||
DateFormat("EEEE", I18n.locale.languageCode).format(date);
|
||||
dayTitle = dayTitle[0].toUpperCase() +
|
||||
dayTitle.substring(1); // capitalize string
|
||||
return dayTitle;
|
||||
} catch (e) {
|
||||
return "Unknown";
|
||||
}
|
||||
@ -69,30 +55,43 @@ class NotificationsHelper {
|
||||
userProvider = await database.query.getUsers(settingsProvider);
|
||||
|
||||
if (userProvider.id != null && settingsProvider.notificationsEnabled) {
|
||||
// refresh kreta login
|
||||
List<User> users = userProvider.getUsers();
|
||||
|
||||
// Process notifications for each user asynchronously
|
||||
await Future.forEach(users, (User user) async {
|
||||
// Create a new instance of userProvider for each user
|
||||
UserProvider userProviderForUser = await database.query.getUsers(settingsProvider);
|
||||
userProviderForUser.setUser(user.id);
|
||||
|
||||
// Refresh kreta login for current user
|
||||
final status = StatusProvider();
|
||||
kretaClient = KretaClient(
|
||||
user: userProvider, settings: settingsProvider, status: status);
|
||||
kretaClient.refreshLogin();
|
||||
if (settingsProvider.notificationsGradesEnabled) gradeNotification();
|
||||
if (settingsProvider.notificationsAbsencesEnabled) absenceNotification();
|
||||
if (settingsProvider.notificationsMessagesEnabled) messageNotification();
|
||||
if (settingsProvider.notificationsLessonsEnabled) lessonNotification();
|
||||
KretaClient kretaClientForUser = KretaClient(
|
||||
user: userProviderForUser, settings: settingsProvider, status: status);
|
||||
await kretaClientForUser.refreshLogin();
|
||||
|
||||
// Process notifications for current user
|
||||
if (settingsProvider.notificationsGradesEnabled) await gradeNotification(userProviderForUser, kretaClientForUser);
|
||||
if (settingsProvider.notificationsAbsencesEnabled) await absenceNotification(userProviderForUser, kretaClientForUser);
|
||||
if (settingsProvider.notificationsMessagesEnabled) await messageNotification(userProviderForUser, kretaClientForUser);
|
||||
if (settingsProvider.notificationsLessonsEnabled) await lessonNotification(userProviderForUser, kretaClientForUser);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void gradeNotification() async {
|
||||
Future<void> gradeNotification(UserProvider currentuserProvider, KretaClient currentKretaClient) async {
|
||||
// fetch grades
|
||||
GradeProvider gradeProvider = GradeProvider(
|
||||
settings: settingsProvider,
|
||||
user: userProvider,
|
||||
user: currentuserProvider,
|
||||
database: database,
|
||||
kreta: kretaClient);
|
||||
gradeProvider.fetch();
|
||||
List<Grade> grades =
|
||||
await database.userQuery.getGrades(userId: userProvider.id ?? "");
|
||||
DateTime lastSeenGrade =
|
||||
await database.userQuery.lastSeenGrade(userId: userProvider.id ?? "");
|
||||
kreta: currentKretaClient);
|
||||
await gradeProvider.fetch();
|
||||
database.userQuery
|
||||
.getGrades(userId: currentuserProvider.id!)
|
||||
.then((grades) async {
|
||||
DateTime lastSeenGrade = await database.userQuery.lastSeen(
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.grade);
|
||||
lastSeenGrade = lastSeenGrade.subtract(const Duration(minutes: 2)); // needed as lastSeenGrade somehow will be a bit in the future
|
||||
|
||||
// loop through grades and see which hasn't been seen yet
|
||||
for (Grade grade in grades) {
|
||||
@ -119,7 +118,7 @@ class NotificationsHelper {
|
||||
);
|
||||
NotificationDetails notificationDetails =
|
||||
NotificationDetails(android: androidNotificationDetails);
|
||||
if (userProvider.getUsers().length == 1) {
|
||||
if (currentuserProvider.getUsers().length == 1) {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
grade.id.hashCode,
|
||||
"title_grade".i18n,
|
||||
@ -141,7 +140,7 @@ class NotificationsHelper {
|
||||
"title_grade".i18n,
|
||||
"body_grade_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
grade.value.value.toString(),
|
||||
grade.subject.isRenamed &&
|
||||
settingsProvider.renamedSubjectsEnabled
|
||||
@ -156,35 +155,24 @@ class NotificationsHelper {
|
||||
}
|
||||
}
|
||||
// set grade seen status
|
||||
gradeProvider.seenAll();
|
||||
database.userStore.storeLastSeen(DateTime.now(), userId: currentuserProvider.id!, category: LastSeenCategory.grade);
|
||||
});
|
||||
}
|
||||
|
||||
void absenceNotification() async {
|
||||
Future<void> absenceNotification(UserProvider currentuserProvider, KretaClient currentKretaClient) async {
|
||||
// get absences from api
|
||||
List? absenceJson = await kretaClient
|
||||
.getAPI(KretaAPI.absences(userProvider.instituteCode ?? ""));
|
||||
List<Absence> storedAbsences =
|
||||
await database.userQuery.getAbsences(userId: userProvider.id!);
|
||||
List? absenceJson = await currentKretaClient
|
||||
.getAPI(KretaAPI.absences(currentuserProvider.instituteCode ?? ""));
|
||||
if (absenceJson == null) {
|
||||
return;
|
||||
}
|
||||
// format api absences to correct format while preserving isSeen value
|
||||
List<Absence> absences = absenceJson.map((e) {
|
||||
Absence apiAbsence = Absence.fromJson(e);
|
||||
Absence storedAbsence = storedAbsences.firstWhere(
|
||||
(stored) => stored.id == apiAbsence.id,
|
||||
orElse: () => apiAbsence);
|
||||
apiAbsence.isSeen = storedAbsence.isSeen;
|
||||
return apiAbsence;
|
||||
}).toList();
|
||||
List<Absence> modifiedAbsences = [];
|
||||
if (absences != storedAbsences) {
|
||||
// remove absences that are not new
|
||||
absences.removeWhere((element) => storedAbsences.contains(element));
|
||||
DateTime lastSeenAbsence = await database.userQuery
|
||||
.lastSeen(userId: currentuserProvider.id!, category: LastSeenCategory.absence);
|
||||
// format api absences
|
||||
List<Absence> absences =
|
||||
absenceJson.map((e) => Absence.fromJson(e)).toList();
|
||||
for (Absence absence in absences) {
|
||||
if (!absence.isSeen) {
|
||||
absence.isSeen = true;
|
||||
modifiedAbsences.add(absence);
|
||||
if (absence.date.isAfter(lastSeenAbsence)) {
|
||||
AndroidNotificationDetails androidNotificationDetails =
|
||||
AndroidNotificationDetails(
|
||||
'ABSENCES',
|
||||
@ -197,7 +185,7 @@ class NotificationsHelper {
|
||||
);
|
||||
NotificationDetails notificationDetails =
|
||||
NotificationDetails(android: androidNotificationDetails);
|
||||
if (userProvider.getUsers().length == 1) {
|
||||
if (currentuserProvider.getUsers().length == 1) {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
absence.id.hashCode,
|
||||
"title_absence"
|
||||
@ -220,7 +208,7 @@ class NotificationsHelper {
|
||||
.i18n, // https://discord.com/channels/1111649116020285532/1153273625206591528
|
||||
"body_absence_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
DateFormat("yyyy-MM-dd").format(absence.date),
|
||||
absence.subject.isRenamed &&
|
||||
settingsProvider.renamedSubjectsEnabled
|
||||
@ -233,56 +221,38 @@ class NotificationsHelper {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// combine modified absences and storedabsences list and save them to the database
|
||||
List<Absence> combinedAbsences = combineLists(
|
||||
modifiedAbsences,
|
||||
storedAbsences,
|
||||
(Absence absence) => absence.id,
|
||||
);
|
||||
await database.userStore
|
||||
.storeAbsences(combinedAbsences, userId: userProvider.id!);
|
||||
await database.userStore.storeLastSeen(DateTime.now(),
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.absence);
|
||||
}
|
||||
|
||||
void messageNotification() async {
|
||||
Future<void> messageNotification(UserProvider currentuserProvider, KretaClient currentKretaClient) async {
|
||||
// get messages from api
|
||||
List? messageJson =
|
||||
await kretaClient.getAPI(KretaAPI.messages("beerkezett"));
|
||||
List<Message> storedmessages =
|
||||
await database.userQuery.getMessages(userId: userProvider.id!);
|
||||
await currentKretaClient.getAPI(KretaAPI.messages("beerkezett"));
|
||||
if (messageJson == null) {
|
||||
return;
|
||||
}
|
||||
// format api messages to correct format while preserving isSeen value
|
||||
// format api messages to correct format
|
||||
// Parse messages
|
||||
List<Message> messages = [];
|
||||
await Future.wait(List.generate(messageJson.length, (index) {
|
||||
return () async {
|
||||
Map message = messageJson.cast<Map>()[index];
|
||||
Map? innerMessageJson = await kretaClient
|
||||
Map? innerMessageJson = await currentKretaClient
|
||||
.getAPI(KretaAPI.message(message["azonosito"].toString()));
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
if (innerMessageJson != null) {
|
||||
messages.add(
|
||||
Message.fromJson(innerMessageJson, forceType: MessageType.inbox));
|
||||
messages.add(Message.fromJson(innerMessageJson,
|
||||
forceType: MessageType.inbox));
|
||||
}
|
||||
}();
|
||||
}));
|
||||
|
||||
DateTime lastSeenMessage = await database.userQuery.lastSeen(
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.message);
|
||||
|
||||
for (Message message in messages) {
|
||||
for (Message storedMessage in storedmessages) {
|
||||
if (message.id == storedMessage.id) {
|
||||
message.isSeen = storedMessage.isSeen;
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Message> modifiedmessages = [];
|
||||
if (messages != storedmessages) {
|
||||
// remove messages that are not new
|
||||
messages.removeWhere((element) => storedmessages.contains(element));
|
||||
for (Message message in messages) {
|
||||
if (!message.isSeen) {
|
||||
message.isSeen = true;
|
||||
modifiedmessages.add(message);
|
||||
if (message.date.isAfter(lastSeenMessage)) {
|
||||
AndroidNotificationDetails androidNotificationDetails =
|
||||
AndroidNotificationDetails(
|
||||
'MESSAGES',
|
||||
@ -295,7 +265,7 @@ class NotificationsHelper {
|
||||
);
|
||||
NotificationDetails notificationDetails =
|
||||
NotificationDetails(android: androidNotificationDetails);
|
||||
if (userProvider.getUsers().length == 1) {
|
||||
if (currentuserProvider.getUsers().length == 1) {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
message.id.hashCode,
|
||||
message.author,
|
||||
@ -305,46 +275,31 @@ class NotificationsHelper {
|
||||
} else {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
message.id.hashCode,
|
||||
"(${userProvider.displayName!}) ${message.author}",
|
||||
"(${currentuserProvider.displayName!}) ${message.author}",
|
||||
message.content.replaceAll(RegExp(r'<[^>]*>'), ''),
|
||||
notificationDetails,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// combine modified messages and storedmessages list and save them to the database
|
||||
List<Message> combinedmessages = combineLists(
|
||||
modifiedmessages,
|
||||
storedmessages,
|
||||
(Message message) => message.id,
|
||||
);
|
||||
await database.userStore
|
||||
.storeMessages(combinedmessages, userId: userProvider.id!);
|
||||
await database.userStore.storeLastSeen(DateTime.now(),
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.message);
|
||||
}
|
||||
|
||||
void lessonNotification() async {
|
||||
// get lesson from api
|
||||
Future<void> lessonNotification(UserProvider currentuserProvider, KretaClient currentKretaClient) async {
|
||||
// get lessons from api
|
||||
TimetableProvider timetableProvider = TimetableProvider(
|
||||
user: userProvider, database: database, kreta: kretaClient);
|
||||
List<Lesson> storedlessons =
|
||||
timetableProvider.lessons[Week.current()] ?? [];
|
||||
List? apilessons = timetableProvider.getWeek(Week.current()) ?? [];
|
||||
user: currentuserProvider, database: database, kreta: currentKretaClient);
|
||||
await timetableProvider.restoreUser();
|
||||
await timetableProvider.fetch(week: Week.current());
|
||||
List<Lesson> apilessons =
|
||||
timetableProvider.getWeek(Week.current()) ?? [];
|
||||
|
||||
DateTime lastSeenLesson = await database.userQuery.lastSeen(
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.lesson);
|
||||
|
||||
for (Lesson lesson in apilessons) {
|
||||
for (Lesson storedLesson in storedlessons) {
|
||||
if (lesson.id == storedLesson.id) {
|
||||
lesson.isSeen = storedLesson.isSeen;
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Lesson> modifiedlessons = [];
|
||||
if (apilessons != storedlessons) {
|
||||
// remove lessons that are not new
|
||||
apilessons.removeWhere((element) => storedlessons.contains(element));
|
||||
for (Lesson lesson in apilessons) {
|
||||
if (!lesson.isSeen && lesson.isChanged) {
|
||||
lesson.isSeen = true;
|
||||
modifiedlessons.add(lesson);
|
||||
if (lesson.date.isAfter(lastSeenLesson)) {
|
||||
AndroidNotificationDetails androidNotificationDetails =
|
||||
AndroidNotificationDetails(
|
||||
'LESSONS',
|
||||
@ -358,7 +313,7 @@ class NotificationsHelper {
|
||||
);
|
||||
NotificationDetails notificationDetails =
|
||||
NotificationDetails(android: androidNotificationDetails);
|
||||
if (userProvider.getUsers().length == 1) {
|
||||
if (currentuserProvider.getUsers().length == 1) {
|
||||
if (lesson.status?.name == "Elmaradt") {
|
||||
switch (I18n.localeStr) {
|
||||
case "en_en":
|
||||
@ -479,9 +434,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_canceled".i18n.fill(
|
||||
"body_lesson_canceled_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
lesson.lessonIndex,
|
||||
lesson.name,
|
||||
dayTitle(lesson.date)
|
||||
@ -496,9 +451,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_canceled".i18n.fill(
|
||||
"body_lesson_canceled_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
dayTitle(lesson.date),
|
||||
lesson.lessonIndex,
|
||||
lesson.name
|
||||
@ -513,9 +468,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_canceled".i18n.fill(
|
||||
"body_lesson_canceled_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
lesson.lessonIndex,
|
||||
lesson.name,
|
||||
dayTitle(lesson.date)
|
||||
@ -533,9 +488,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_substituted".i18n.fill(
|
||||
"body_lesson_substituted_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
lesson.lessonIndex,
|
||||
lesson.name,
|
||||
dayTitle(lesson.date),
|
||||
@ -553,9 +508,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_substituted".i18n.fill(
|
||||
"body_lesson_substituted_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
dayTitle(lesson.date),
|
||||
lesson.lessonIndex,
|
||||
lesson.name,
|
||||
@ -573,9 +528,9 @@ class NotificationsHelper {
|
||||
await flutterLocalNotificationsPlugin.show(
|
||||
lesson.id.hashCode,
|
||||
"title_lesson".i18n,
|
||||
"body_lesson_substituted".i18n.fill(
|
||||
"body_lesson_substituted_multiuser".i18n.fill(
|
||||
[
|
||||
userProvider.displayName!,
|
||||
currentuserProvider.displayName!,
|
||||
lesson.lessonIndex,
|
||||
lesson.name,
|
||||
dayTitle(lesson.date),
|
||||
@ -593,16 +548,7 @@ class NotificationsHelper {
|
||||
}
|
||||
}
|
||||
}
|
||||
// combine modified lesson and storedlesson list and save them to the database
|
||||
List<Lesson> combinedlessons = combineLists(
|
||||
modifiedlessons,
|
||||
storedlessons,
|
||||
(Lesson message) => message.id,
|
||||
);
|
||||
Map<Week, List<Lesson>> timetableLessons = timetableProvider.lessons;
|
||||
timetableLessons[Week.current()] = combinedlessons;
|
||||
await database.userStore
|
||||
.storeLessons(timetableLessons, userId: userProvider.id!);
|
||||
}
|
||||
await database.userStore.storeLastSeen(DateTime.now(),
|
||||
userId: currentuserProvider.id!, category: LastSeenCategory.lesson);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:i18n_extension/i18n_extension.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
|
||||
extension Localization on String {
|
||||
static final _t = Translations.byLocale("hu_hu") +
|
||||
@ -43,8 +44,19 @@ extension Localization on String {
|
||||
"body_lesson_substituted_multiuser": "(%s) Lektion Nr. %s (%s) wird am %s durch %s ersetzt"
|
||||
},
|
||||
};
|
||||
String get i18n {
|
||||
// very hacky way to get app language in notifications
|
||||
// i18n does not like being in background functions (it cannot retrieve locale sometimes)
|
||||
final DatabaseProvider _databaseProvider = DatabaseProvider();
|
||||
_databaseProvider.init().then((value) {
|
||||
_databaseProvider.query.getSettings(_databaseProvider).then((settings) {
|
||||
return localize(this, _t, locale: "${settings.language}_${settings.language.toUpperCase()}");
|
||||
});
|
||||
});
|
||||
|
||||
String get i18n => localize(this, _t);
|
||||
|
||||
return localize(this, _t);
|
||||
}
|
||||
String fill(List<Object> params) => localizeFill(this, params);
|
||||
String plural(int value) => localizePlural(value, this, _t);
|
||||
String version(Object modifier) => localizeVersion(modifier, this, _t);
|
||||
|
@ -50,6 +50,7 @@ class Absence {
|
||||
DateTime lessonStart;
|
||||
DateTime lessonEnd;
|
||||
int? lessonIndex;
|
||||
bool isSeen = json["isSeen"] ?? false;
|
||||
if (json["Ora"] != null) {
|
||||
lessonStart = json["Ora"]["KezdoDatum"] != null
|
||||
? DateTime.parse(json["Ora"]["KezdoDatum"]).toLocal()
|
||||
@ -62,7 +63,6 @@ class Absence {
|
||||
lessonStart = DateTime(0);
|
||||
lessonEnd = DateTime(0);
|
||||
}
|
||||
|
||||
return Absence(
|
||||
id: json["Uid"],
|
||||
date: json["Datum"] != null
|
||||
@ -89,10 +89,29 @@ class Absence {
|
||||
lessonIndex: lessonIndex,
|
||||
group:
|
||||
json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] : "",
|
||||
isSeen: false,
|
||||
isSeen: json["isSeen"] ?? false,
|
||||
json: json,
|
||||
);
|
||||
}
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
"id": id,
|
||||
"date": date.toIso8601String(),
|
||||
"delay": delay,
|
||||
"submitDate": submitDate.toIso8601String(),
|
||||
"teacher": teacher,
|
||||
"state": state.toString().split('.').last,
|
||||
"justification": justification,
|
||||
"type": type,
|
||||
"mode": mode,
|
||||
"subject": subject,
|
||||
"lessonStart": lessonStart.toIso8601String(),
|
||||
"lessonEnd": lessonEnd.toIso8601String(),
|
||||
"lessonIndex": lessonIndex,
|
||||
"group": group,
|
||||
"isSeen": isSeen,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
enum Justification { excused, unexcused, pending }
|
||||
|
@ -1,5 +1,6 @@
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/helpers/notification_helper.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/models/user.dart';
|
||||
import 'package:refilc_kreta_api/client/api.dart';
|
||||
@ -49,7 +50,7 @@ class GradeProvider with ChangeNotifier {
|
||||
String? userId = _user.id;
|
||||
if (userId != null) {
|
||||
final userStore = _database.userStore;
|
||||
userStore.storeLastSeenGrade(DateTime.now(), userId: userId);
|
||||
userStore.storeLastSeen(DateTime.now(), userId: userId, category: LastSeenCategory.grade);
|
||||
_lastSeen = DateTime.now();
|
||||
}
|
||||
}
|
||||
@ -58,7 +59,7 @@ class GradeProvider with ChangeNotifier {
|
||||
String? userId = _user.id;
|
||||
if (userId != null) {
|
||||
final userStore = _database.userStore;
|
||||
userStore.storeLastSeenGrade(DateTime(1969), userId: userId);
|
||||
userStore.storeLastSeen(DateTime(1969), userId: userId, category: LastSeenCategory.grade);
|
||||
_lastSeen = DateTime(1969);
|
||||
}
|
||||
}
|
||||
@ -74,7 +75,7 @@ class GradeProvider with ChangeNotifier {
|
||||
await convertBySettings();
|
||||
_groupAvg = await userQuery.getGroupAverages(userId: userId);
|
||||
notifyListeners();
|
||||
DateTime lastSeenDB = await userQuery.lastSeenGrade(userId: userId);
|
||||
DateTime lastSeenDB = await userQuery.lastSeen(userId: userId, category: LastSeenCategory.grade);
|
||||
if (lastSeenDB.millisecondsSinceEpoch == 0 ||
|
||||
lastSeenDB.year == 0 ||
|
||||
!_settings.gradeOpeningFun) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user