@bobfrankston/rmfmail 1.1.140 → 1.1.142
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/app.bundle.js +99 -62
- package/client/app.bundle.js.map +2 -2
- package/client/app.js +28 -3
- package/client/app.js.map +1 -1
- package/client/app.ts +22 -2
- package/client/components/alarms.js +126 -87
- package/client/components/alarms.js.map +1 -1
- package/client/components/alarms.ts +32 -1
- package/client/compose/compose.bundle.js +37 -4
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/compose/compose.js +50 -7
- package/client/compose/compose.js.map +1 -1
- package/client/compose/compose.ts +37 -7
- package/package.json +1 -1
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-43144 → node_modules.npmglobalize-stash-21212}/.package-lock.json +0 -0
package/client/app.bundle.js
CHANGED
|
@@ -5260,9 +5260,18 @@ async function firePopupForItem(item) {
|
|
|
5260
5260
|
} else {
|
|
5261
5261
|
r = await showInWebViewPopup({ title, html, buttons });
|
|
5262
5262
|
}
|
|
5263
|
+
} catch (e) {
|
|
5264
|
+
alog("popup IPC failed \u2014 treating as Dismiss", { key: item.uuid, err: e?.message || String(e) });
|
|
5265
|
+
r = { button: "Dismiss" };
|
|
5263
5266
|
} finally {
|
|
5264
5267
|
openPopups.delete(item.uuid);
|
|
5265
5268
|
}
|
|
5269
|
+
if (!r || typeof r !== "object" || typeof r.button !== "string") {
|
|
5270
|
+
alog("popup returned empty / malformed \u2014 treating as Dismiss", { key: item.uuid, raw: r });
|
|
5271
|
+
r = { button: "Dismiss" };
|
|
5272
|
+
} else {
|
|
5273
|
+
alog("popup result", { key: item.uuid, button: r.button, form: r.form });
|
|
5274
|
+
}
|
|
5266
5275
|
const api = window.mailxapi;
|
|
5267
5276
|
const openLink = () => {
|
|
5268
5277
|
if (!item.htmlLink)
|
|
@@ -5272,67 +5281,77 @@ async function firePopupForItem(item) {
|
|
|
5272
5281
|
else
|
|
5273
5282
|
window.open(item.htmlLink, "_blank");
|
|
5274
5283
|
};
|
|
5275
|
-
|
|
5276
|
-
|
|
5277
|
-
|
|
5278
|
-
|
|
5279
|
-
|
|
5280
|
-
|
|
5281
|
-
|
|
5284
|
+
try {
|
|
5285
|
+
switch (r.button) {
|
|
5286
|
+
case "Open":
|
|
5287
|
+
openLink();
|
|
5288
|
+
{
|
|
5289
|
+
const dm = loadDismissed();
|
|
5290
|
+
delete dm[item.uuid];
|
|
5291
|
+
saveDismissed(dm);
|
|
5292
|
+
}
|
|
5293
|
+
firedThisSession.delete(item.uuid);
|
|
5294
|
+
snoozeItem(item, 2);
|
|
5295
|
+
break;
|
|
5296
|
+
case "snooze": {
|
|
5297
|
+
const m = Math.max(1, Math.floor(r.form?.minutes ?? 15));
|
|
5298
|
+
snoozeItem(item, m);
|
|
5299
|
+
break;
|
|
5282
5300
|
}
|
|
5283
|
-
|
|
5284
|
-
|
|
5285
|
-
|
|
5286
|
-
|
|
5287
|
-
|
|
5288
|
-
|
|
5289
|
-
|
|
5301
|
+
// Legacy literal labels — retained so a pre-upgrade popup whose
|
|
5302
|
+
// bundle still says "Snooze 15m" / "Snooze 1h" continues to work
|
|
5303
|
+
// through a daemon-side rebuild without a UI restart.
|
|
5304
|
+
case "Snooze 15m":
|
|
5305
|
+
snoozeItem(item, 15);
|
|
5306
|
+
break;
|
|
5307
|
+
case "Snooze 1h":
|
|
5308
|
+
snoozeItem(item, 60);
|
|
5309
|
+
break;
|
|
5310
|
+
case "Dismiss":
|
|
5311
|
+
case "dismissed":
|
|
5312
|
+
// msger reports window-close as r.dismissed=true → daemon
|
|
5313
|
+
// wrapper lowercases to "dismissed". Treat the same as
|
|
5314
|
+
// explicit Dismiss-button: the popup HAD a clear button
|
|
5315
|
+
// for that action, so any close that lands here is the
|
|
5316
|
+
// user's "I'm done with this reminder" — not a 15-min
|
|
5317
|
+
// snooze. Bob 2026-05-14: "I keep dismissing the
|
|
5318
|
+
// reminder but it keeps coming back" — the lowercase
|
|
5319
|
+
// path was hitting the snooze-15-min default, so the
|
|
5320
|
+
// popup re-fired every 15 min indefinitely.
|
|
5321
|
+
case "closed":
|
|
5322
|
+
{
|
|
5323
|
+
const m = loadDismissed();
|
|
5324
|
+
m[item.uuid] = true;
|
|
5325
|
+
saveDismissed(m);
|
|
5326
|
+
alog("dismiss saved", { key: item.uuid, via: r.button });
|
|
5327
|
+
}
|
|
5328
|
+
break;
|
|
5329
|
+
case "Delete":
|
|
5330
|
+
{
|
|
5331
|
+
const m = loadDismissed();
|
|
5332
|
+
m[item.uuid] = true;
|
|
5333
|
+
saveDismissed(m);
|
|
5334
|
+
}
|
|
5335
|
+
firedThisSession.delete(item.uuid);
|
|
5336
|
+
deleteCalendarEvent(item.uuid).catch((e) => console.error(` [alarm] delete failed for ${item.uuid}: ${e?.message || e}`));
|
|
5337
|
+
break;
|
|
5338
|
+
default:
|
|
5339
|
+
alog("unknown popup result", { button: r.button, form: r.form });
|
|
5340
|
+
{
|
|
5341
|
+
const m = loadDismissed();
|
|
5342
|
+
m[item.uuid] = true;
|
|
5343
|
+
saveDismissed(m);
|
|
5344
|
+
}
|
|
5345
|
+
break;
|
|
5346
|
+
}
|
|
5347
|
+
} catch (e) {
|
|
5348
|
+
alog("action handler threw \u2014 forcing Dismiss", { key: item.uuid, err: e?.message || String(e) });
|
|
5349
|
+
try {
|
|
5350
|
+
const m = loadDismissed();
|
|
5351
|
+
m[item.uuid] = true;
|
|
5352
|
+
saveDismissed(m);
|
|
5353
|
+
} catch {
|
|
5290
5354
|
}
|
|
5291
|
-
// Legacy literal labels — retained so a pre-upgrade popup whose
|
|
5292
|
-
// bundle still says "Snooze 15m" / "Snooze 1h" continues to work
|
|
5293
|
-
// through a daemon-side rebuild without a UI restart.
|
|
5294
|
-
case "Snooze 15m":
|
|
5295
|
-
snoozeItem(item, 15);
|
|
5296
|
-
break;
|
|
5297
|
-
case "Snooze 1h":
|
|
5298
|
-
snoozeItem(item, 60);
|
|
5299
|
-
break;
|
|
5300
|
-
case "Dismiss":
|
|
5301
|
-
case "dismissed":
|
|
5302
|
-
// msger reports window-close as r.dismissed=true → daemon
|
|
5303
|
-
// wrapper lowercases to "dismissed". Treat the same as
|
|
5304
|
-
// explicit Dismiss-button: the popup HAD a clear button
|
|
5305
|
-
// for that action, so any close that lands here is the
|
|
5306
|
-
// user's "I'm done with this reminder" — not a 15-min
|
|
5307
|
-
// snooze. Bob 2026-05-14: "I keep dismissing the
|
|
5308
|
-
// reminder but it keeps coming back" — the lowercase
|
|
5309
|
-
// path was hitting the snooze-15-min default, so the
|
|
5310
|
-
// popup re-fired every 15 min indefinitely.
|
|
5311
|
-
case "closed":
|
|
5312
|
-
{
|
|
5313
|
-
const m = loadDismissed();
|
|
5314
|
-
m[item.uuid] = true;
|
|
5315
|
-
saveDismissed(m);
|
|
5316
|
-
alog("dismiss saved", { key: item.uuid, via: r.button });
|
|
5317
|
-
}
|
|
5318
|
-
break;
|
|
5319
|
-
case "Delete":
|
|
5320
|
-
{
|
|
5321
|
-
const m = loadDismissed();
|
|
5322
|
-
m[item.uuid] = true;
|
|
5323
|
-
saveDismissed(m);
|
|
5324
|
-
}
|
|
5325
|
-
firedThisSession.delete(item.uuid);
|
|
5326
|
-
deleteCalendarEvent(item.uuid).catch((e) => console.error(` [alarm] delete failed for ${item.uuid}: ${e?.message || e}`));
|
|
5327
|
-
break;
|
|
5328
|
-
default:
|
|
5329
|
-
alog("unknown popup result", { button: r.button, form: r.form });
|
|
5330
|
-
{
|
|
5331
|
-
const m = loadDismissed();
|
|
5332
|
-
m[item.uuid] = true;
|
|
5333
|
-
saveDismissed(m);
|
|
5334
|
-
}
|
|
5335
|
-
break;
|
|
5336
5355
|
}
|
|
5337
5356
|
}
|
|
5338
5357
|
function snoozeItem(item, minutes) {
|
|
@@ -7298,17 +7317,35 @@ async function openCompose(mode, overrideMsg, overrideAccountId) {
|
|
|
7298
7317
|
} catch (e) {
|
|
7299
7318
|
console.error("[compose] sessionStorage.setItem failed:", e?.message || e);
|
|
7300
7319
|
}
|
|
7320
|
+
const composeKey = "init-" + Math.random().toString(36).slice(2, 10);
|
|
7321
|
+
window.__mailxComposeInits = window.__mailxComposeInits || {};
|
|
7322
|
+
window.__mailxComposeInits[composeKey] = init;
|
|
7323
|
+
try {
|
|
7324
|
+
frame.dataset.composeKey = composeKey;
|
|
7325
|
+
} catch {
|
|
7326
|
+
}
|
|
7301
7327
|
const post = () => {
|
|
7302
7328
|
try {
|
|
7303
|
-
frame?.contentWindow?.postMessage({ type: "compose-init", init }, "*");
|
|
7304
|
-
} catch {
|
|
7329
|
+
frame?.contentWindow?.postMessage({ type: "compose-init", init, composeKey }, "*");
|
|
7330
|
+
} catch (e) {
|
|
7331
|
+
logClientEvent("compose-post-failed", { err: e?.message || String(e) });
|
|
7305
7332
|
}
|
|
7306
7333
|
};
|
|
7334
|
+
logClientEvent("compose-handoff", { hasFrame: !!frame, hasContentWindow: !!frame?.contentWindow, composeKey, bodyBytes: initJson.length });
|
|
7307
7335
|
post();
|
|
7308
7336
|
try {
|
|
7309
|
-
frame?.addEventListener("load",
|
|
7337
|
+
frame?.addEventListener("load", () => {
|
|
7338
|
+
logClientEvent("compose-iframe-loaded", { composeKey });
|
|
7339
|
+
post();
|
|
7340
|
+
});
|
|
7310
7341
|
} catch {
|
|
7311
7342
|
}
|
|
7343
|
+
let attempts = 0;
|
|
7344
|
+
const heartbeat = setInterval(() => {
|
|
7345
|
+
attempts++;
|
|
7346
|
+
post();
|
|
7347
|
+
if (attempts >= 30) clearInterval(heartbeat);
|
|
7348
|
+
}, 100);
|
|
7312
7349
|
}
|
|
7313
7350
|
function showComposeOverlay(title = "Compose") {
|
|
7314
7351
|
const wrapper = document.createElement("div");
|