fix notifications

This commit is contained in:
hihihaha 2024-03-02 18:11:22 +01:00
parent 88daf43c3a
commit 51ececc34a
7 changed files with 531 additions and 544 deletions

View File

@ -67,7 +67,11 @@ const userDataDB = DatabaseStruct("user_data", {
// renamed teachers // non kreta data // renamed teachers // non kreta data
"renamed_teachers": String, "renamed_teachers": String,
// "subject_lesson_count": String, // non kreta data // "subject_lesson_count": String, // non kreta data
// notifications and surprise grades // non kreta data
"last_seen_grade": int, "last_seen_grade": int,
"last_seen_absence": int,
"last_seen_message": int,
"last_seen_lesson": int,
// goal planning // non kreta data // goal planning // non kreta data
"goal_plans": String, "goal_plans": String,
"goal_averages": String, "goal_averages": String,
@ -131,6 +135,9 @@ Future<Database> initDB(DatabaseProvider database) async {
"renamed_teachers": "{}", "renamed_teachers": "{}",
// "subject_lesson_count": "{}", // non kreta data // "subject_lesson_count": "{}", // non kreta data
"last_seen_grade": 0, "last_seen_grade": 0,
"last_seen_absence": 0,
"last_seen_message": 0,
"last_seen_lesson": 0,
// goal planning // non kreta data // goal planning // non kreta data
"goal_plans": "{}", "goal_plans": "{}",
"goal_averages": "{}", "goal_averages": "{}",

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/api/providers/database_provider.dart';
import 'package:refilc/models/linked_account.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/self_note.dart';
import 'package:refilc/models/subject_lesson_count.dart'; import 'package:refilc/models/subject_lesson_count.dart';
import 'package:refilc/models/user.dart'; import 'package:refilc/models/user.dart';
@ -213,11 +214,11 @@ class UserDatabaseQuery {
return lessonCount; return lessonCount;
} }
Future<DateTime> lastSeenGrade({required String userId}) async { Future<DateTime> lastSeen({required String userId, required LastSeenCategory category}) async {
List<Map> userData = List<Map> userData =
await db.query("user_data", where: "id = ?", whereArgs: [userId]); await db.query("user_data", where: "id = ?", whereArgs: [userId]);
if (userData.isEmpty) return DateTime(0); 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); if (lastSeenDate == null) return DateTime(0);
DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate); DateTime lastSeen = DateTime.fromMillisecondsSinceEpoch(lastSeenDate);
return lastSeen; return lastSeen;

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:refilc/models/linked_account.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/self_note.dart';
import 'package:refilc/models/subject_lesson_count.dart'; import 'package:refilc/models/subject_lesson_count.dart';
import 'package:refilc_kreta_api/models/week.dart'; import 'package:refilc_kreta_api/models/week.dart';
@ -129,10 +130,10 @@ class UserDatabaseStore {
where: "id = ?", whereArgs: [userId]); where: "id = ?", whereArgs: [userId]);
} }
Future<void> storeLastSeenGrade(DateTime date, Future<void> storeLastSeen(DateTime date,
{required String userId}) async { {required String userId, required LastSeenCategory category}) async {
int lastSeenDate = date.millisecondsSinceEpoch; 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]); where: "id = ?", whereArgs: [userId]);
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,5 @@
import 'package:i18n_extension/i18n_extension.dart'; import 'package:i18n_extension/i18n_extension.dart';
import 'package:refilc/api/providers/database_provider.dart';
extension Localization on String { extension Localization on String {
static final _t = Translations.byLocale("hu_hu") + 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" "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 fill(List<Object> params) => localizeFill(this, params);
String plural(int value) => localizePlural(value, this, _t); String plural(int value) => localizePlural(value, this, _t);
String version(Object modifier) => localizeVersion(modifier, this, _t); String version(Object modifier) => localizeVersion(modifier, this, _t);

View File

@ -50,6 +50,7 @@ class Absence {
DateTime lessonStart; DateTime lessonStart;
DateTime lessonEnd; DateTime lessonEnd;
int? lessonIndex; int? lessonIndex;
bool isSeen = json["isSeen"] ?? false;
if (json["Ora"] != null) { if (json["Ora"] != null) {
lessonStart = json["Ora"]["KezdoDatum"] != null lessonStart = json["Ora"]["KezdoDatum"] != null
? DateTime.parse(json["Ora"]["KezdoDatum"]).toLocal() ? DateTime.parse(json["Ora"]["KezdoDatum"]).toLocal()
@ -62,7 +63,6 @@ class Absence {
lessonStart = DateTime(0); lessonStart = DateTime(0);
lessonEnd = DateTime(0); lessonEnd = DateTime(0);
} }
return Absence( return Absence(
id: json["Uid"], id: json["Uid"],
date: json["Datum"] != null date: json["Datum"] != null
@ -89,10 +89,29 @@ class Absence {
lessonIndex: lessonIndex, lessonIndex: lessonIndex,
group: group:
json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] : "", json["OsztalyCsoport"] != null ? json["OsztalyCsoport"]["Uid"] : "",
isSeen: false, isSeen: json["isSeen"] ?? false,
json: json, 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 } enum Justification { excused, unexcused, pending }

View File

@ -1,5 +1,6 @@
import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/api/providers/database_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/settings.dart';
import 'package:refilc/models/user.dart'; import 'package:refilc/models/user.dart';
import 'package:refilc_kreta_api/client/api.dart'; import 'package:refilc_kreta_api/client/api.dart';
@ -49,7 +50,7 @@ class GradeProvider with ChangeNotifier {
String? userId = _user.id; String? userId = _user.id;
if (userId != null) { if (userId != null) {
final userStore = _database.userStore; final userStore = _database.userStore;
userStore.storeLastSeenGrade(DateTime.now(), userId: userId); userStore.storeLastSeen(DateTime.now(), userId: userId, category: LastSeenCategory.grade);
_lastSeen = DateTime.now(); _lastSeen = DateTime.now();
} }
} }
@ -58,7 +59,7 @@ class GradeProvider with ChangeNotifier {
String? userId = _user.id; String? userId = _user.id;
if (userId != null) { if (userId != null) {
final userStore = _database.userStore; final userStore = _database.userStore;
userStore.storeLastSeenGrade(DateTime(1969), userId: userId); userStore.storeLastSeen(DateTime(1969), userId: userId, category: LastSeenCategory.grade);
_lastSeen = DateTime(1969); _lastSeen = DateTime(1969);
} }
} }
@ -74,7 +75,7 @@ class GradeProvider with ChangeNotifier {
await convertBySettings(); await convertBySettings();
_groupAvg = await userQuery.getGroupAverages(userId: userId); _groupAvg = await userQuery.getGroupAverages(userId: userId);
notifyListeners(); notifyListeners();
DateTime lastSeenDB = await userQuery.lastSeenGrade(userId: userId); DateTime lastSeenDB = await userQuery.lastSeen(userId: userId, category: LastSeenCategory.grade);
if (lastSeenDB.millisecondsSinceEpoch == 0 || if (lastSeenDB.millisecondsSinceEpoch == 0 ||
lastSeenDB.year == 0 || lastSeenDB.year == 0 ||
!_settings.gradeOpeningFun) { !_settings.gradeOpeningFun) {