Support custom event notifications

pull/1/head
yflory 4 years ago
parent 11c0b752bd
commit 362a439cb5

@ -460,22 +460,37 @@ define([
}; };
Messages.reminder_missed = "You missed <b>{0}</b> on {1}"; // XXX Messages.reminder_missed = "You missed <b>{0}</b> on {1}"; // XXX
Messages.reminder_now = "<b>{0}</b> is starting!"; // XXX
Messages.reminder_inProgress = "<b>{0}</b> has started on {1}"; // XXX Messages.reminder_inProgress = "<b>{0}</b> has started on {1}"; // XXX
Messages.reminder_inProgressAllDay = "<b>{0}</b> is happening today"; // XXX Messages.reminder_inProgressAllDay = "<b>{0}</b> is happening today"; // XXX
Messages.reminder_minutes = "<b>{0}</b> will start in {1} minutes!"; // XXX Messages.reminder_minutes = "<b>{0}</b> will start in {1} minutes!"; // XXX
Messages.reminder_hour = "<b>{0}</b> will start in 1 hour!"; // XXX Messages.reminder_time = "<b>{0}</b> will start today at {1}!"; // XXX
Messages.reminder_date = "<b>{0}</b> will start on {1}!"; // XXX
var getDate = function (time) {
return new Date(time).toLocaleDateString();
};
handlers['REMINDER'] = function (common, data) { handlers['REMINDER'] = function (common, data) {
var content = data.content; var content = data.content;
var msg = content.msg.content; var msg = content.msg.content;
var missed = content.msg.missed; var missed = content.msg.missed;
var now = +new Date();
var start = msg.start; var start = msg.start;
var title = Util.fixHTML(msg.title); var title = Util.fixHTML(msg.title);
var i = 0;
content.getFormatText = function () { content.getFormatText = function () {
var now = +new Date();
// Events that have already started
var wasRefresh = content.autorefresh;
content.autorefresh = false;
// Missed events // Missed events
if (start < now && missed) { if (start < now && missed) {
return Messages._getKey('reminder_missed', [title, new Date(start).toLocaleString()]); return Messages._getKey('reminder_missed', [title, new Date(start).toLocaleString()]);
} }
// Starting now
if (start < now && wasRefresh) {
return Messages._getKey('reminder_now', [title]);
}
// In progress, is all day // In progress, is all day
if (start < now && msg.isAllDay) { if (start < now && msg.isAllDay) {
return Messages._getKey('reminder_inProgressAllDay', [title]); return Messages._getKey('reminder_inProgressAllDay', [title]);
@ -484,12 +499,25 @@ define([
if (start < now) { if (start < now) {
return Messages._getKey('reminder_inProgress', [title, new Date(start).toLocaleString()]); return Messages._getKey('reminder_inProgress', [title, new Date(start).toLocaleString()]);
} }
// Not started yet // Not started yet
if ((start - now) > 600000) {
return Messages._getKey('reminder_hour', [title]); // In less than an hour: show countdown in minutes
if ((start - now) < 3600000) {
var minutes = Math.round((start - now) / 60000);
content.autorefresh = true;
return Messages._getKey('reminder_minutes', [title, minutes]);
}
// Not today: show full date
var nowDateStr = new Date().toLocaleDateString();
var startDate = new Date(start);
if (nowDateStr !== startDate.toLocaleDateString()) {
return Messages._getKey('reminder_date', [title, startDate.toLocaleString()]);
} }
var minutes = Math.round((start - now) / 60000);
return Messages._getKey('reminder_minutes', [title, minutes]); // Today: show time
return Messages._getKey('reminder_time', [title, startDate.toLocaleTimeString()]);
}; };
if (!content.archived) { if (!content.archived) {
content.dismissHandler = defaultDismiss(common, data); content.dismissHandler = defaultDismiss(common, data);

@ -96,7 +96,7 @@ define([
var time60 = now + (3600 * 1000); // 1 hour from now var time60 = now + (3600 * 1000); // 1 hour from now
var uid = ev.id; var uid = ev.id;
ctx.store.data.lastVisit = 1617922639683; // XXX Friday Apr 09 //ctx.store.data.lastVisit = 1617922639683; // XXX Friday Apr 09, used to test
// Clear reminders for this event // Clear reminders for this event
if (Array.isArray(reminders[uid])) { if (Array.isArray(reminders[uid])) {
@ -135,27 +135,29 @@ define([
}; };
var sendNotif = function () { ctx.Store.onReadyEvt.reg(send); }; var sendNotif = function () { ctx.Store.onReadyEvt.reg(send); };
if (ev.start <= time10) { var notifs = [600000, 3600000]; // 10min, 60min
sendNotif(); notifs.sort();
return;
}
// setTimeout only work with 32bit timeout values.
// FIXME: call this function again in xxx days to reload these missing timeout?
if (ev.start - time10 >= 2147483647) { return; }
notifs.some(function (delay) {
var time = now + delay;
// It starts in more than 10 minutes: prepare the 10 minutes notification // setTimeout only work with 32bit timeout values. If the event is too far away,
reminders[uid].push(setTimeout(function () { // ignore this event for now
sendNotif(); // FIXME: call this function again in xxx days to reload these missing timeout?
}, (ev.start - time10))); if (ev.start - time >= 2147483647) { return true; }
if (ev.start <= time60) { return; } // If we're too late to send a notification, send it instantly and ignore
// all notifications that were supposed to be sent even earlier
if (ev.start <= time) {
sendNotif();
return true;
}
// It starts in more than 1 hour: prepare the 1 hour notification // It starts in more than "delay": prepare the notification
reminders[uid].push(setTimeout(function () { reminders[uid].push(setTimeout(function () {
sendNotif(); sendNotif();
}, (ev.start - time60))); }, (ev.start - time)));
});
}; };
var addReminders = function (ctx, id, ev) { var addReminders = function (ctx, id, ev) {
var calendar = ctx.calendars[id]; var calendar = ctx.calendars[id];

@ -87,6 +87,15 @@ define([
if (typeof(data.content.getFormatText) === "function") { if (typeof(data.content.getFormatText) === "function") {
$(notif).find('.cp-notification-content p').html(data.content.getFormatText()); $(notif).find('.cp-notification-content p').html(data.content.getFormatText());
if (data.content.autorefresh) {
var it = setInterval(function () {
if (!data.content.autorefresh) {
clearInterval(it);
return;
}
$(notif).find('.cp-notification-content p').html(data.content.getFormatText());
}, 60000);
}
} }
if (data.content.isClickable) { if (data.content.isClickable) {

Loading…
Cancel
Save