@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.
- package/client/android-bootstrap.bundle.js +167 -6
- package/client/android-bootstrap.bundle.js.map +3 -3
- package/client/app.bundle.js +79 -7
- package/client/app.bundle.js.map +3 -3
- package/client/components/alarms.js +88 -11
- package/client/components/alarms.js.map +1 -1
- package/client/components/alarms.ts +83 -13
- package/client/compose/compose.bundle.js +4 -0
- package/client/compose/compose.bundle.js.map +2 -2
- package/client/lib/api-client.js +6 -0
- package/client/lib/api-client.js.map +1 -1
- package/client/lib/api-client.ts +9 -0
- package/client/lib/mailxapi.js +27 -5
- package/package.json +7 -7
- package/packages/mailx-imap/package-lock.json +2 -2
- package/packages/mailx-imap/package.json +1 -1
- package/packages/mailx-service/index.d.ts +5 -0
- package/packages/mailx-service/index.d.ts.map +1 -1
- package/packages/mailx-service/index.js +59 -12
- package/packages/mailx-service/index.js.map +1 -1
- package/packages/mailx-service/index.ts +63 -13
- package/packages/mailx-service/jsonrpc.js +4 -0
- package/packages/mailx-service/jsonrpc.js.map +1 -1
- package/packages/mailx-service/jsonrpc.ts +4 -0
- package/packages/mailx-service/package.json +1 -1
- package/packages/mailx-settings/index.d.ts +8 -1
- package/packages/mailx-settings/index.d.ts.map +1 -1
- package/packages/mailx-settings/index.js +71 -0
- package/packages/mailx-settings/index.js.map +1 -1
- package/packages/mailx-settings/index.ts +61 -1
- package/packages/mailx-settings/package.json +1 -1
- package/packages/mailx-store/package.json +1 -1
- package/packages/mailx-store-web/android-bootstrap.js +4 -0
- package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
- package/packages/mailx-store-web/android-bootstrap.ts +4 -0
- package/packages/mailx-store-web/package.json +1 -1
- package/packages/mailx-store-web/web-service.d.ts +4 -0
- package/packages/mailx-store-web/web-service.d.ts.map +1 -1
- package/packages/mailx-store-web/web-service.js +77 -8
- package/packages/mailx-store-web/web-service.js.map +1 -1
- package/packages/mailx-store-web/web-service.ts +71 -9
- package/packages/mailx-types/index.d.ts +4 -0
- package/packages/mailx-types/index.d.ts.map +1 -1
- package/packages/mailx-types/index.js +6 -0
- package/packages/mailx-types/index.js.map +1 -1
- package/packages/mailx-types/index.ts +12 -0
- package/packages/mailx-types/mailx-api.d.ts +14 -0
- package/packages/mailx-types/mailx-api.d.ts.map +1 -1
- package/packages/mailx-types/mailx-api.ts +5 -0
- package/packages/mailx-types/mime-inline-images.d.ts +38 -0
- package/packages/mailx-types/mime-inline-images.d.ts.map +1 -0
- package/packages/mailx-types/mime-inline-images.js +45 -0
- package/packages/mailx-types/mime-inline-images.js.map +1 -0
- package/packages/mailx-types/mime-inline-images.ts +55 -0
- package/packages/mailx-types/package.json +1 -1
- package/packages/mailx-types/reminder-state.d.ts +42 -0
- package/packages/mailx-types/reminder-state.d.ts.map +1 -0
- package/packages/mailx-types/reminder-state.js +85 -0
- package/packages/mailx-types/reminder-state.js.map +1 -0
- package/packages/mailx-types/reminder-state.ts +88 -0
- /package/packages/mailx-imap/{node_modules.npmglobalize-stash-69680 → node_modules.npmglobalize-stash-48352}/.package-lock.json +0 -0
package/client/app.bundle.js
CHANGED
|
@@ -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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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] =
|
|
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
|
-
|
|
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
|
}
|