0.2.24
RustBox CI / rustbox (push) Canceled after 0s

This commit is contained in:
Mateusz Gruszczyński committed 2026-11-04 23:34:09 +01:00
1 parent beae94e932
commit de4d70970c
51 files changed
+4034 -421

No files matched your search

+31 -12
View File
@@ -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 (_) { }
}