From 11c0b752bde01ec9f5d4bf5f20e566f3d9d0904e Mon Sep 17 00:00:00 2001 From: yflory Date: Mon, 12 Apr 2021 17:08:18 +0200 Subject: [PATCH] Add notifications for past events since our last visit --- www/common/cryptpad-common.js | 9 ++++++++- www/common/notifications.js | 22 ++++++++++++++++++++-- www/common/outer/calendar.js | 29 +++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/www/common/cryptpad-common.js b/www/common/cryptpad-common.js index b639eebab..51ec09ef6 100644 --- a/www/common/cryptpad-common.js +++ b/www/common/cryptpad-common.js @@ -2288,7 +2288,8 @@ define([ cache: rdyCfg.cache, noDrive: rdyCfg.noDrive, disableCache: localStorage['CRYPTPAD_STORE|disableCache'], - driveEvents: !rdyCfg.noDrive //rdyCfg.driveEvents // Boolean + driveEvents: !rdyCfg.noDrive, //rdyCfg.driveEvents // Boolean + lastVisit: Number(localStorage.lastVisit) || undefined }; common.userHash = userHash; @@ -2570,6 +2571,12 @@ define([ AppConfig.afterLogin(common, waitFor()); } }).nThen(function () { + // Last visit is used to warn you about missed events from your calendars + localStorage.lastVisit = +new Date(); + setInterval(function () { + // Bump last visit every minute + localStorage.lastVisit = +new Date(); + }, 60000); f(void 0, env); if (typeof(window.onhashchange) === 'function') { window.onhashchange(); } }); diff --git a/www/common/notifications.js b/www/common/notifications.js index 018093c2a..35ebb447c 100644 --- a/www/common/notifications.js +++ b/www/common/notifications.js @@ -459,19 +459,37 @@ define([ } }; + Messages.reminder_missed = "You missed {0} on {1}"; // XXX + Messages.reminder_inProgress = "{0} has started on {1}"; // XXX + Messages.reminder_inProgressAllDay = "{0} is happening today"; // XXX Messages.reminder_minutes = "{0} will start in {1} minutes!"; // XXX Messages.reminder_hour = "{0} will start in 1 hour!"; // XXX handlers['REMINDER'] = function (common, data) { var content = data.content; var msg = content.msg.content; + var missed = content.msg.missed; var now = +new Date(); var start = msg.start; + var title = Util.fixHTML(msg.title); content.getFormatText = function () { + // Missed events + if (start < now && missed) { + return Messages._getKey('reminder_missed', [title, new Date(start).toLocaleString()]); + } + // In progress, is all day + if (start < now && msg.isAllDay) { + return Messages._getKey('reminder_inProgressAllDay', [title]); + } + // In progress, normal event + if (start < now) { + return Messages._getKey('reminder_inProgress', [title, new Date(start).toLocaleString()]); + } + // Not started yet if ((start - now) > 600000) { - return Messages._getKey('reminder_hour', [Util.fixHTML(msg.title)]); + return Messages._getKey('reminder_hour', [title]); } var minutes = Math.round((start - now) / 60000); - return Messages._getKey('reminder_minutes', [Util.fixHTML(msg.title), minutes]); + return Messages._getKey('reminder_minutes', [title, minutes]); }; if (!content.archived) { content.dismissHandler = defaultDismiss(common, data); diff --git a/www/common/outer/calendar.js b/www/common/outer/calendar.js index 016e95abb..2113dcc69 100644 --- a/www/common/outer/calendar.js +++ b/www/common/outer/calendar.js @@ -90,31 +90,43 @@ define([ }); }; - var updateEventReminders = function (ctx, reminders, ev) { + var updateEventReminders = function (ctx, reminders, ev, useLastVisit) { var now = +new Date(); var time10 = now + (600 * 1000); // 10 minutes from now var time60 = now + (3600 * 1000); // 1 hour from now var uid = ev.id; + ctx.store.data.lastVisit = 1617922639683; // XXX Friday Apr 09 + // Clear reminders for this event if (Array.isArray(reminders[uid])) { reminders[uid].forEach(function (to) { clearTimeout(to); }); } reminders[uid] = []; - // No reminder for past events - if (ev.start <= now) { + var last = ctx.store.data.lastVisit; + // XXX add a limit to make sure we don't go too far in the past? + var missed = useLastVisit && ev.start > last && ev.end <= now; + if (ev.end <= now && !missed) { + // No reminder for past events delete reminders[uid]; return; } + // XXX + // TODO + // use custom notifications per event + // if you missed a notification, show it instantly (eg: load cryptpad 45min before an event, show the 1h notification) + var send = function () { var hide = Util.find(ctx, ['store', 'proxy', 'settings', 'general', 'calendar', 'hideNotif']); if (hide) { return; } + var ctime = ev.start <= now ? ev.start : +new Date(); // Correct order for past events ctx.store.mailbox.showMessage('reminders', { msg: { - ctime: +new Date(), + ctime: ctime, type: "REMINDER", + missed: Boolean(missed), content: ev }, hash: 'REMINDER|'+uid @@ -152,7 +164,7 @@ define([ updateEventReminders(ctx, calendar.reminders, ev); }; - var addInitialReminders = function (ctx, id) { + var addInitialReminders = function (ctx, id, useLastVisit) { var calendar = ctx.calendars[id]; if (!calendar || !calendar.reminders) { return; } if (Object.keys(calendar.reminders).length) { return; } // Already initialized @@ -164,7 +176,7 @@ define([ var content = Util.find(calendar, ['proxy', 'content']); if (!content) { return; } Object.keys(content).forEach(function (uid) { - updateEventReminders(ctx, calendar.reminders, content[uid]); + updateEventReminders(ctx, calendar.reminders, content[uid], useLastVisit); }); }; var openChannel = function (ctx, cfg, _cb) { @@ -325,7 +337,7 @@ define([ c.cacheready = true; setTimeout(update); if (cb) { cb(null, lm.proxy); } - addInitialReminders(ctx, channel); + addInitialReminders(ctx, channel, cfg.lastVisitNotif); }).on('ready', function (info) { var md = info.metadata; c.owners = md.owners || []; @@ -342,7 +354,7 @@ define([ } setTimeout(update); if (cb) { cb(null, lm.proxy); } - addInitialReminders(ctx, channel); + addInitialReminders(ctx, channel, cfg.lastVisitNotif); }).on('change', [], function () { if (!c.ready) { return; } setTimeout(update); @@ -455,6 +467,7 @@ define([ decryptTeamCalendarHref(store, cal); openChannel(ctx, { storeId: storeId, + lastVisitNotif: true, data: cal }); });