@bobfrankston/rmfmail 1.2.177 → 1.2.179

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.
Files changed (61) hide show
  1. package/client/android-bootstrap.bundle.js +167 -6
  2. package/client/android-bootstrap.bundle.js.map +3 -3
  3. package/client/app.bundle.js +79 -7
  4. package/client/app.bundle.js.map +3 -3
  5. package/client/components/alarms.js +88 -11
  6. package/client/components/alarms.js.map +1 -1
  7. package/client/components/alarms.ts +83 -13
  8. package/client/compose/compose.bundle.js +4 -0
  9. package/client/compose/compose.bundle.js.map +2 -2
  10. package/client/lib/api-client.js +6 -0
  11. package/client/lib/api-client.js.map +1 -1
  12. package/client/lib/api-client.ts +9 -0
  13. package/client/lib/mailxapi.js +27 -5
  14. package/package.json +7 -7
  15. package/packages/mailx-imap/package-lock.json +2 -2
  16. package/packages/mailx-imap/package.json +1 -1
  17. package/packages/mailx-service/index.d.ts +5 -0
  18. package/packages/mailx-service/index.d.ts.map +1 -1
  19. package/packages/mailx-service/index.js +59 -12
  20. package/packages/mailx-service/index.js.map +1 -1
  21. package/packages/mailx-service/index.ts +63 -13
  22. package/packages/mailx-service/jsonrpc.js +4 -0
  23. package/packages/mailx-service/jsonrpc.js.map +1 -1
  24. package/packages/mailx-service/jsonrpc.ts +4 -0
  25. package/packages/mailx-service/package.json +1 -1
  26. package/packages/mailx-settings/index.d.ts +8 -1
  27. package/packages/mailx-settings/index.d.ts.map +1 -1
  28. package/packages/mailx-settings/index.js +71 -0
  29. package/packages/mailx-settings/index.js.map +1 -1
  30. package/packages/mailx-settings/index.ts +61 -1
  31. package/packages/mailx-settings/package.json +1 -1
  32. package/packages/mailx-store/package.json +1 -1
  33. package/packages/mailx-store-web/android-bootstrap.js +4 -0
  34. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  35. package/packages/mailx-store-web/android-bootstrap.ts +4 -0
  36. package/packages/mailx-store-web/package.json +1 -1
  37. package/packages/mailx-store-web/web-service.d.ts +4 -0
  38. package/packages/mailx-store-web/web-service.d.ts.map +1 -1
  39. package/packages/mailx-store-web/web-service.js +77 -8
  40. package/packages/mailx-store-web/web-service.js.map +1 -1
  41. package/packages/mailx-store-web/web-service.ts +71 -9
  42. package/packages/mailx-types/index.d.ts +4 -0
  43. package/packages/mailx-types/index.d.ts.map +1 -1
  44. package/packages/mailx-types/index.js +6 -0
  45. package/packages/mailx-types/index.js.map +1 -1
  46. package/packages/mailx-types/index.ts +12 -0
  47. package/packages/mailx-types/mailx-api.d.ts +14 -0
  48. package/packages/mailx-types/mailx-api.d.ts.map +1 -1
  49. package/packages/mailx-types/mailx-api.ts +5 -0
  50. package/packages/mailx-types/mime-inline-images.d.ts +38 -0
  51. package/packages/mailx-types/mime-inline-images.d.ts.map +1 -0
  52. package/packages/mailx-types/mime-inline-images.js +45 -0
  53. package/packages/mailx-types/mime-inline-images.js.map +1 -0
  54. package/packages/mailx-types/mime-inline-images.ts +55 -0
  55. package/packages/mailx-types/package.json +1 -1
  56. package/packages/mailx-types/reminder-state.d.ts +42 -0
  57. package/packages/mailx-types/reminder-state.d.ts.map +1 -0
  58. package/packages/mailx-types/reminder-state.js +85 -0
  59. package/packages/mailx-types/reminder-state.js.map +1 -0
  60. package/packages/mailx-types/reminder-state.ts +88 -0
  61. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-69680 → node_modules.npmglobalize-stash-48352}/.package-lock.json +0 -0
@@ -83,6 +83,7 @@ __export(api_client_exports, {
83
83
  logClientEvent: () => logClientEvent,
84
84
  markAsSpamMessages: () => markAsSpamMessages,
85
85
  markFolderRead: () => markFolderRead,
86
+ mergeReminderState: () => mergeReminderState,
86
87
  moveFolderToTrash: () => moveFolderToTrash,
87
88
  moveMessage: () => moveMessage,
88
89
  moveMessages: () => moveMessages,
@@ -616,6 +617,9 @@ function closeWordEdit(editId) {
616
617
  function showReminderPopup(opts) {
617
618
  return ipc().showReminderPopup?.(opts) ?? Promise.resolve({ button: "", reason: "no host" });
618
619
  }
620
+ function mergeReminderState(patch) {
621
+ return ipc().mergeReminderState?.(patch) ?? Promise.resolve(null);
622
+ }
619
623
  function consumePendingMailto() {
620
624
  return ipc().consumePendingMailto?.() ?? Promise.resolve(null);
621
625
  }
@@ -942,6 +946,23 @@ var init_groups = __esm({
942
946
  }
943
947
  });
944
948
 
949
+ // packages/mailx-types/reminder-state.js
950
+ var DISMISSED_RETENTION_MS, SNOOZED_RETENTION_MS;
951
+ var init_reminder_state = __esm({
952
+ "packages/mailx-types/reminder-state.js"() {
953
+ "use strict";
954
+ DISMISSED_RETENTION_MS = 30 * 864e5;
955
+ SNOOZED_RETENTION_MS = 7 * 864e5;
956
+ }
957
+ });
958
+
959
+ // packages/mailx-types/mime-inline-images.js
960
+ var init_mime_inline_images = __esm({
961
+ "packages/mailx-types/mime-inline-images.js"() {
962
+ "use strict";
963
+ }
964
+ });
965
+
945
966
  // packages/mailx-types/index.js
946
967
  function _has(msg, flag) {
947
968
  return !!msg.flags && msg.flags.includes(flag);
@@ -960,6 +981,8 @@ var init_mailx_types = __esm({
960
981
  init_contact_rules();
961
982
  init_contacts_config();
962
983
  init_groups();
984
+ init_reminder_state();
985
+ init_mime_inline_images();
963
986
  _SEEN = "\\Seen";
964
987
  _FLAGGED = "\\Flagged";
965
988
  _DRAFT = "\\Draft";
@@ -6089,6 +6112,48 @@ function pruneState(now) {
6089
6112
  }
6090
6113
  if (changed)
6091
6114
  saveSnoozed(snoozed);
6115
+ const dismissed = loadDismissed();
6116
+ let dChanged = false;
6117
+ for (const [uuid, at] of Object.entries(dismissed)) {
6118
+ if (typeof at === "number" && at < now - 30 * 864e5) {
6119
+ delete dismissed[uuid];
6120
+ dChanged = true;
6121
+ }
6122
+ }
6123
+ if (dChanged)
6124
+ saveDismissed(dismissed);
6125
+ }
6126
+ async function syncReminderState(force = false) {
6127
+ const now = Date.now();
6128
+ if (!force && now - _lastStateSync < STATE_SYNC_MIN_MS)
6129
+ return false;
6130
+ _lastStateSync = now;
6131
+ try {
6132
+ const merged = await mergeReminderState({
6133
+ dismissed: loadDismissed(),
6134
+ // `true` legacy values are normalized service-side
6135
+ snoozed: loadSnoozed()
6136
+ });
6137
+ if (!merged)
6138
+ return false;
6139
+ const dm = loadDismissed();
6140
+ for (const [k, v] of Object.entries(merged.dismissed)) {
6141
+ const cur = dm[k];
6142
+ if (cur === void 0 || cur === true || v > cur)
6143
+ dm[k] = v;
6144
+ }
6145
+ saveDismissed(dm);
6146
+ const sn = loadSnoozed();
6147
+ for (const [k, v] of Object.entries(merged.snoozed)) {
6148
+ if (!sn[k] || v > sn[k])
6149
+ sn[k] = v;
6150
+ }
6151
+ saveSnoozed(sn);
6152
+ return true;
6153
+ } catch (e) {
6154
+ alog("state sync failed", { err: e?.message || String(e) });
6155
+ return false;
6156
+ }
6092
6157
  }
6093
6158
  function occKey(uuid, ms) {
6094
6159
  return `${uuid}:${ms}`;
@@ -6141,7 +6206,7 @@ async function collectDueAlarms(now) {
6141
6206
  continue;
6142
6207
  const k = `${occBaseKey}@${offsetMs}`;
6143
6208
  if (!dismissed[k]) {
6144
- dismissed[k] = true;
6209
+ dismissed[k] = Date.now();
6145
6210
  touched = true;
6146
6211
  }
6147
6212
  }
@@ -6407,7 +6472,7 @@ async function firePopupForItem(item) {
6407
6472
  case "closed":
6408
6473
  {
6409
6474
  const m = loadDismissed();
6410
- m[item.uuid] = true;
6475
+ m[item.uuid] = Date.now();
6411
6476
  saveDismissed(m);
6412
6477
  alog("dismiss saved", { key: item.uuid, via: r.button });
6413
6478
  }
@@ -6415,7 +6480,7 @@ async function firePopupForItem(item) {
6415
6480
  case "Delete":
6416
6481
  {
6417
6482
  const m = loadDismissed();
6418
- m[item.uuid] = true;
6483
+ m[item.uuid] = Date.now();
6419
6484
  saveDismissed(m);
6420
6485
  }
6421
6486
  firedThisSession.delete(item.uuid);
@@ -6425,7 +6490,7 @@ async function firePopupForItem(item) {
6425
6490
  alog("unknown popup result", { button: r.button, form: r.form });
6426
6491
  {
6427
6492
  const m = loadDismissed();
6428
- m[item.uuid] = true;
6493
+ m[item.uuid] = Date.now();
6429
6494
  saveDismissed(m);
6430
6495
  }
6431
6496
  break;
@@ -6434,11 +6499,12 @@ async function firePopupForItem(item) {
6434
6499
  alog("action handler threw \u2014 forcing Dismiss", { key: item.uuid, err: e?.message || String(e) });
6435
6500
  try {
6436
6501
  const m = loadDismissed();
6437
- m[item.uuid] = true;
6502
+ m[item.uuid] = Date.now();
6438
6503
  saveDismissed(m);
6439
6504
  } catch {
6440
6505
  }
6441
6506
  }
6507
+ void syncReminderState(true);
6442
6508
  }
6443
6509
  function snoozeItem(item, minutes) {
6444
6510
  const now = Date.now();
@@ -6453,7 +6519,10 @@ async function pollAlarms() {
6453
6519
  return;
6454
6520
  const now = Date.now();
6455
6521
  pruneState(now);
6456
- const due = await collectDueAlarms(now);
6522
+ let due = await collectDueAlarms(now);
6523
+ if (due.length > 0 && await syncReminderState()) {
6524
+ due = await collectDueAlarms(now);
6525
+ }
6457
6526
  const fresh = due.filter((d) => !firedThisSession.has(d.uuid) && !openPopups.has(d.uuid));
6458
6527
  if (fresh.length === 0)
6459
6528
  return;
@@ -6467,6 +6536,7 @@ function startAlarmPoller() {
6467
6536
  if (window.__mailxAlarmPollerRunning)
6468
6537
  return;
6469
6538
  window.__mailxAlarmPollerRunning = true;
6539
+ void syncReminderState(true);
6470
6540
  setTimeout(() => {
6471
6541
  pollAlarms().catch(() => {
6472
6542
  });
@@ -6481,7 +6551,7 @@ function startAlarmPoller() {
6481
6551
  });
6482
6552
  });
6483
6553
  }
6484
- var DISMISSED_KEY, SNOOZED_KEY, LOOKBACK_MS, LOOKAHEAD_MS, POLL_INTERVAL_MS, _soundCache, _lastSoundAt, firedThisSession, openPopups;
6554
+ var DISMISSED_KEY, SNOOZED_KEY, LOOKBACK_MS, LOOKAHEAD_MS, POLL_INTERVAL_MS, _soundCache, _lastSoundAt, _lastStateSync, STATE_SYNC_MIN_MS, firedThisSession, openPopups;
6485
6555
  var init_alarms = __esm({
6486
6556
  "client/components/alarms.js"() {
6487
6557
  "use strict";
@@ -6493,6 +6563,8 @@ var init_alarms = __esm({
6493
6563
  POLL_INTERVAL_MS = 3e4;
6494
6564
  _soundCache = null;
6495
6565
  _lastSoundAt = 0;
6566
+ _lastStateSync = 0;
6567
+ STATE_SYNC_MIN_MS = 6e4;
6496
6568
  firedThisSession = /* @__PURE__ */ new Set();
6497
6569
  openPopups = /* @__PURE__ */ new Set();
6498
6570
  }