From 88daf43c3af47219c3a7d63952794f39fa71526b Mon Sep 17 00:00:00 2001 From: Kima Date: Fri, 1 Mar 2024 23:14:45 +0100 Subject: [PATCH] finished calendar sync huh --- refilc/lib/database/init.dart | 1 + refilc/lib/models/settings.dart | 13 +++- .../lib/providers/third_party_provider.dart | 65 +++++++++++++++++-- .../screens/navigation/navigation_screen.dart | 1 + .../lib/pages/timetable/timetable_page.dart | 13 ++++ 5 files changed, 86 insertions(+), 7 deletions(-) diff --git a/refilc/lib/database/init.dart b/refilc/lib/database/init.dart index 5c25a2c..ee963a7 100644 --- a/refilc/lib/database/init.dart +++ b/refilc/lib/database/init.dart @@ -49,6 +49,7 @@ const settingsDB = DatabaseStruct("settings", { "cal_sync_show_exams": int, "cal_sync_show_teacher": int, "cal_sync_renamed": int, + "calendar_id": String, }); // DON'T FORGET TO UPDATE DEFAULT VALUES IN `initDB` MIGRATION OR ELSE PARENTS WILL COMPLAIN ABOUT THEIR CHILDREN MISSING // YOU'VE BEEN WARNED!!! diff --git a/refilc/lib/models/settings.dart b/refilc/lib/models/settings.dart index cddda2c..d238964 100644 --- a/refilc/lib/models/settings.dart +++ b/refilc/lib/models/settings.dart @@ -97,6 +97,7 @@ class SettingsProvider extends ChangeNotifier { bool _calSyncShowExams; bool _calSyncShowTeacher; bool _calSyncRenamed; + String _calendarId; SettingsProvider({ DatabaseProvider? database, @@ -159,6 +160,7 @@ class SettingsProvider extends ChangeNotifier { required bool calSyncShowExams, required bool calSyncShowTeacher, required bool calSyncRenamed, + required String calendarId, }) : _database = database, _language = language, _startPage = startPage, @@ -218,7 +220,8 @@ class SettingsProvider extends ChangeNotifier { _calSyncRoomLocation = calSyncRoomLocation, _calSyncShowExams = calSyncShowExams, _calSyncShowTeacher = calSyncShowTeacher, - _calSyncRenamed = calSyncRenamed; + _calSyncRenamed = calSyncRenamed, + _calendarId = calendarId; factory SettingsProvider.fromMap(Map map, {required DatabaseProvider database}) { @@ -298,6 +301,7 @@ class SettingsProvider extends ChangeNotifier { calSyncShowExams: map['cal_sync_show_exams'] == 1, calSyncShowTeacher: map['cal_sync_show_teacher'] == 1, calSyncRenamed: map['cal_sync_renamed'] == 1, + calendarId: map['calendar_id'], ); } @@ -365,6 +369,7 @@ class SettingsProvider extends ChangeNotifier { "cal_sync_show_exams": _calSyncShowExams ? 1 : 0, "cal_sync_show_teacher": _calSyncShowTeacher ? 1 : 0, "cal_sync_renamed": _calSyncRenamed ? 1 : 0, + "calendar_id": _calendarId, }; } @@ -436,6 +441,7 @@ class SettingsProvider extends ChangeNotifier { calSyncShowExams: true, calSyncShowTeacher: true, calSyncRenamed: false, + calendarId: '', ); } @@ -498,6 +504,7 @@ class SettingsProvider extends ChangeNotifier { bool get calSyncShowExams => _calSyncShowExams; bool get calSyncShowTeacher => _calSyncShowTeacher; bool get calSyncRenamed => _calSyncRenamed; + String get calendarId => _calendarId; Future update({ bool store = true, @@ -556,6 +563,7 @@ class SettingsProvider extends ChangeNotifier { bool? calSyncShowExams, bool? calSyncShowTeacher, bool? calSyncRenamed, + String? calendarId, }) async { if (language != null && language != _language) _language = language; if (startPage != null && startPage != _startPage) _startPage = startPage; @@ -720,6 +728,9 @@ class SettingsProvider extends ChangeNotifier { if (calSyncRenamed != null && calSyncRenamed != _calSyncRenamed) { _calSyncRenamed = calSyncRenamed; } + if (calendarId != null && calendarId != _calendarId) { + _calendarId = calendarId; + } // store or not if (store) await _database?.store.storeSettings(this); notifyListeners(); diff --git a/refilc/lib/providers/third_party_provider.dart b/refilc/lib/providers/third_party_provider.dart index aff99d8..ac94967 100644 --- a/refilc/lib/providers/third_party_provider.dart +++ b/refilc/lib/providers/third_party_provider.dart @@ -1,8 +1,11 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart'; import 'package:provider/provider.dart'; import 'package:refilc/api/providers/database_provider.dart'; import 'package:refilc/api/providers/user_provider.dart'; import 'package:refilc/models/linked_account.dart'; +import 'package:refilc/models/settings.dart'; import 'package:refilc/models/user.dart'; import 'package:refilc_kreta_api/controllers/timetable_controller.dart'; import 'package:refilc_kreta_api/models/lesson.dart'; @@ -149,6 +152,8 @@ class ThirdPartyProvider with ChangeNotifier { required String calendarId, required DateTime start, required DateTime end, + required String description, + required String? location, }) async { try { var httpClient = (await _googleSignIn.authenticatedClient())!; @@ -160,6 +165,8 @@ class ThirdPartyProvider with ChangeNotifier { start: EventDateTime(dateTime: start), end: EventDateTime(dateTime: end), summary: title, + description: description, + location: location, ); return await calendarApi.events.insert(event, calendarId); @@ -194,13 +201,39 @@ class ThirdPartyProvider with ChangeNotifier { return null; } + Future getCalendar({ + required String id, + }) async { + try { + var httpClient = (await _googleSignIn.authenticatedClient())!; + var calendarApi = CalendarApi(httpClient); + + return await calendarApi.calendars.get(id); + } catch (e) { + if (kDebugMode) print(e); + await _googleSignIn.signOut(); + } + + return null; + } + Future pushTimetable( BuildContext context, TimetableController controller) async { - Calendar? calendar = await createCalendar( - name: 'reFilc - Órarend', - description: - 'Ez egy automatikusan generált naptár, melyet a reFilc hozott létre az órarend számára.', - ); + SettingsProvider settings = + Provider.of(_context, listen: false); + + String calendarId = settings.calendarId; + late Calendar? calendar; + + if (calendarId == '') { + calendar = await createCalendar( + name: 'reFilc - Órarend', + description: + 'Ez egy automatikusan generált naptár, melyet a reFilc hozott létre az órarend számára.', + ); + } else { + calendar = await getCalendar(id: calendarId); + } if (calendar == null) return; @@ -209,11 +242,31 @@ class ThirdPartyProvider with ChangeNotifier { everyLesson.sort((a, b) => a.start.compareTo(b.start)); for (Lesson l in everyLesson) { + String mixedDescription = ''; + + if (settings.calSyncShowTeacher) { + mixedDescription += + 'Tanár: ${(l.teacher.isRenamed && settings.calSyncRenamed && settings.renamedTeachersEnabled) ? l.teacher.renamedTo : l.teacher.name}\n'; + } + if (settings.calSyncRoomLocation == 'description') { + mixedDescription += 'Terem: ${l.room}\n'; + } + Event? event = await pushEvent( - title: l.name, + title: (((l.subject.isRenamed && + settings.calSyncRenamed && + settings.renamedSubjectsEnabled) + ? l.subject.renamedTo + : l.subject.name) ?? + l.name) + + (settings.calSyncShowExams && l.exam.replaceAll(' ', '') != '' + ? '📝' + : ''), calendarId: calendar.id!, start: l.start, end: l.end, + description: mixedDescription, + location: settings.calSyncRoomLocation == 'location' ? l.room : null, ); // temp shit (DONT BULLY ME, ILL CUM) diff --git a/refilc_desktop_ui/lib/screens/navigation/navigation_screen.dart b/refilc_desktop_ui/lib/screens/navigation/navigation_screen.dart index 364f691..eb24771 100644 --- a/refilc_desktop_ui/lib/screens/navigation/navigation_screen.dart +++ b/refilc_desktop_ui/lib/screens/navigation/navigation_screen.dart @@ -58,6 +58,7 @@ class NavigationScreenState extends State // Initial sync syncAll(context); + // platform specific shit () async { try { await Window.initialize(); diff --git a/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart b/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart index ee3e305..dd5a563 100644 --- a/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart +++ b/refilc_mobile_ui/lib/pages/timetable/timetable_page.dart @@ -3,6 +3,7 @@ import 'package:animations/animations.dart'; import 'package:i18n_extension/i18n_extension.dart'; import 'package:refilc/api/providers/update_provider.dart'; import 'package:refilc/models/settings.dart'; +import 'package:refilc/providers/third_party_provider.dart'; // TODO: gulag calendar sync // import 'package:refilc/providers/third_party_provider.dart'; import 'package:refilc/utils/format.dart'; @@ -30,6 +31,8 @@ import 'package:flutter/services.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; import 'package:intl/intl.dart'; +import 'package:refilc_plus/models/premium_scopes.dart'; +import 'package:refilc_plus/providers/premium_provider.dart'; import 'timetable_page.i18n.dart'; // todo: "fix" overflow (priority: -1) @@ -148,6 +151,16 @@ class TimetablePageState extends State } } + // push timetable to calendar + if (mounted) { + if (Provider.of(context, listen: false).hasPremium && + Provider.of(context, listen: false) + .hasScope(PremiumScopes.calendarSync)) { + Provider.of(context, listen: false) + .pushTimetable(context, _controller); + } + } + // Listen for user changes user = Provider.of(context, listen: false); user.addListener(_userListener);