1 parent
beae94e932
commit
de4d70970c
51 files changed
+4034
-421
No files matched your search
@@ -97,6 +97,7 @@ async function loadCombinedNotificationPreferences() {
|
||||
}
|
||||
|
||||
async function loadNotificationPreferences() {
|
||||
void loadCalendarReminderDefaults();
|
||||
const prefs = await loadNotificationPreferencesForAccount(state.accountId, { silent: false });
|
||||
if (!prefs) return;
|
||||
$("#notify-enabled").checked = Boolean(prefs.enabled);
|
||||
@@ -404,8 +405,24 @@ function notifyNewMail(data, accountId) {
|
||||
if (prefs.sound) playNotificationSound();
|
||||
}
|
||||
|
||||
function calendarReminderStorageKey(event) {
|
||||
return `rustbox.calendarReminder.${state.accountId || "account"}.${event.id}.${event.start_time}`;
|
||||
function calendarReminderStorageKey(event, minutes) {
|
||||
return `rustbox.calendarReminder.${state.accountId || "account"}.${event.id}.${event.start_time}.${minutes}`;
|
||||
}
|
||||
|
||||
// Timed events: start minus the reminder. All-day events: the reminder counts
|
||||
// from the start of the working day (calendar settings, default 09:00) of the
|
||||
// event's date, so "1 day before" fires the previous morning, not at midnight.
|
||||
function calendarReminderTrigger(event, minutes) {
|
||||
const offset = Math.max(0, Number(minutes) || 0) * 60000;
|
||||
if (event.all_day) {
|
||||
const day = /^(\d{4})-(\d{2})-(\d{2})/.exec(String(event.start_time || ""));
|
||||
if (!day) return NaN;
|
||||
const [hours, mins] = String(state.calendarSettings?.working_hours_start || "09:00").split(":").map(Number);
|
||||
const base = new Date(Number(day[1]), Number(day[2]) - 1, Number(day[3]), Number.isFinite(hours) ? hours : 9, Number.isFinite(mins) ? mins : 0);
|
||||
return base.getTime() - offset;
|
||||
}
|
||||
const startMs = new Date(event.start_time).getTime();
|
||||
return Number.isFinite(startMs) ? startMs - offset : NaN;
|
||||
}
|
||||
|
||||
function fireCalendarReminder(event) {
|
||||
@@ -424,19 +441,21 @@ async function checkCalendarReminders() {
|
||||
if (!state.accountId) return;
|
||||
const now = Date.now();
|
||||
const start = new Date(now - 2 * 24 * 60 * 60 * 1000);
|
||||
const end = new Date(now + 2 * 24 * 60 * 60 * 1000);
|
||||
// Look far enough ahead for the longest reminder choice (1 week before).
|
||||
const end = new Date(now + 8 * 24 * 60 * 60 * 1000);
|
||||
try {
|
||||
const data = await request(`/calendar/events?start=${encodeURIComponent(start.toISOString())}&end=${encodeURIComponent(end.toISOString())}`, { method: "GET" });
|
||||
for (const event of data.events || []) {
|
||||
if (event.reminder_minutes == null || String(event.status || "").toLowerCase() === "cancelled") continue;
|
||||
const startMs = new Date(event.start_time).getTime();
|
||||
if (!Number.isFinite(startMs)) continue;
|
||||
const trigger = startMs - Math.max(0, Number(event.reminder_minutes) || 0) * 60000;
|
||||
if (trigger > now || now - trigger > 10 * 60 * 1000) continue;
|
||||
const key = calendarReminderStorageKey(event);
|
||||
if (localStorage.getItem(key)) continue;
|
||||
localStorage.setItem(key, String(now));
|
||||
fireCalendarReminder(event);
|
||||
if (String(event.status || "").toLowerCase() === "cancelled") continue;
|
||||
for (const minutes of [event.reminder_minutes, event.reminder_extra_minutes]) {
|
||||
if (minutes == null) continue;
|
||||
const trigger = calendarReminderTrigger(event, minutes);
|
||||
if (!Number.isFinite(trigger) || trigger > now || now - trigger > 10 * 60 * 1000) continue;
|
||||
const key = calendarReminderStorageKey(event, minutes);
|
||||
if (localStorage.getItem(key)) continue;
|
||||
localStorage.setItem(key, String(now));
|
||||
fireCalendarReminder(event);
|
||||
}
|
||||
}
|
||||
} catch (_) { }
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user