forked from firka/student-legacy
finished calendar sync huh
This commit is contained in:
parent
32c5e8ae91
commit
88daf43c3a
@ -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!!!
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
@ -58,6 +58,7 @@ class NavigationScreenState extends State<NavigationScreen>
|
||||
// Initial sync
|
||||
syncAll(context);
|
||||
|
||||
// platform specific shit
|
||||
() async {
|
||||
try {
|
||||
await Window.initialize();
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user