finished calendar sync huh

This commit is contained in:
Kima 2024-03-01 23:14:45 +01:00
parent 32c5e8ae91
commit 88daf43c3a
5 changed files with 86 additions and 7 deletions

View File

@ -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!!!

View File

@ -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<void> 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();

View File

@ -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<Calendar?> 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<void> 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<SettingsProvider>(_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)

View File

@ -58,6 +58,7 @@ class NavigationScreenState extends State<NavigationScreen>
// Initial sync
syncAll(context);
// platform specific shit
() async {
try {
await Window.initialize();

View File

@ -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<TimetablePage>
}
}
// push timetable to calendar
if (mounted) {
if (Provider.of<PremiumProvider>(context, listen: false).hasPremium &&
Provider.of<PremiumProvider>(context, listen: false)
.hasScope(PremiumScopes.calendarSync)) {
Provider.of<ThirdPartyProvider>(context, listen: false)
.pushTimetable(context, _controller);
}
}
// Listen for user changes
user = Provider.of<UserProvider>(context, listen: false);
user.addListener(_userListener);