@bobfrankston/rmfmail 1.1.140 → 1.1.141

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.
@@ -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
- switch (r.button) {
5276
- case "Open":
5277
- openLink();
5278
- {
5279
- const dm = loadDismissed();
5280
- delete dm[item.uuid];
5281
- saveDismissed(dm);
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
- firedThisSession.delete(item.uuid);
5284
- snoozeItem(item, 2);
5285
- break;
5286
- case "snooze": {
5287
- const m = Math.max(1, Math.floor(r.form?.minutes ?? 15));
5288
- snoozeItem(item, m);
5289
- break;
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) {