@bobfrankston/rmfmail 1.2.210 → 1.2.213

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 (36) hide show
  1. package/client/android-bootstrap.bundle.js +7 -1
  2. package/client/android-bootstrap.bundle.js.map +2 -2
  3. package/client/app.bundle.js +41 -9
  4. package/client/app.bundle.js.map +2 -2
  5. package/client/app.js +57 -13
  6. package/client/app.js.map +1 -1
  7. package/client/app.ts +52 -13
  8. package/client/components/folder-tree.js +45 -3
  9. package/client/components/folder-tree.js.map +1 -1
  10. package/client/components/folder-tree.ts +42 -3
  11. package/client/index.html +1 -1
  12. package/client/package.json +1 -1
  13. package/package.json +5 -5
  14. package/packages/mailx-imap/package-lock.json +2 -2
  15. package/packages/mailx-imap/package.json +1 -1
  16. package/packages/mailx-service/index.d.ts +6 -0
  17. package/packages/mailx-service/index.d.ts.map +1 -1
  18. package/packages/mailx-service/index.js +8 -0
  19. package/packages/mailx-service/index.js.map +1 -1
  20. package/packages/mailx-service/index.ts +9 -0
  21. package/packages/mailx-service/jsonrpc.js +1 -1
  22. package/packages/mailx-service/jsonrpc.js.map +1 -1
  23. package/packages/mailx-service/jsonrpc.ts +1 -1
  24. package/packages/mailx-service/package.json +1 -1
  25. package/packages/mailx-store/db.d.ts +27 -0
  26. package/packages/mailx-store/db.d.ts.map +1 -1
  27. package/packages/mailx-store/db.js +81 -1
  28. package/packages/mailx-store/db.js.map +1 -1
  29. package/packages/mailx-store/db.ts +78 -1
  30. package/packages/mailx-store/package.json +1 -1
  31. package/packages/mailx-store-web/android-bootstrap.d.ts.map +1 -1
  32. package/packages/mailx-store-web/android-bootstrap.js +14 -1
  33. package/packages/mailx-store-web/android-bootstrap.js.map +1 -1
  34. package/packages/mailx-store-web/android-bootstrap.ts +14 -1
  35. package/packages/mailx-store-web/package.json +1 -1
  36. /package/packages/mailx-imap/{node_modules.npmglobalize-stash-14572 → node_modules.npmglobalize-stash-38948}/.package-lock.json +0 -0
@@ -7518,7 +7518,8 @@ async function loadFolderTree(container) {
7518
7518
  setTimeout(() => earlyOverlay.remove(), 400);
7519
7519
  }
7520
7520
  if (accounts.length === 0) {
7521
- container.innerHTML = `<div class="folder-loading">No accounts</div>`;
7521
+ const onAndroid = window.mailxapi?.platform === "android";
7522
+ container.innerHTML = onAndroid ? `<div class="folder-loading">Initializing\u2026</div>` : `<div class="folder-loading">No accounts</div>`;
7522
7523
  const mlSection = document.querySelector(".message-list");
7523
7524
  if (mlSection)
7524
7525
  mlSection.style.display = "none";
@@ -7528,12 +7529,15 @@ async function loadFolderTree(container) {
7528
7529
  const mvHeader = document.getElementById("mv-header");
7529
7530
  if (mvHeader)
7530
7531
  mvHeader.style.display = "none";
7532
+ const mvSection = document.querySelector(".message-viewer");
7533
+ if (mvSection && onAndroid)
7534
+ mvSection.classList.add("narrow-active");
7531
7535
  const mainBody = document.getElementById("mv-body");
7532
7536
  if (mainBody) {
7533
- const isAndroid = window.mailxapi?.platform === "android";
7537
+ const isAndroid = onAndroid;
7534
7538
  const formDisplay = isAndroid ? "display:none;" : "";
7535
7539
  const introText = isAndroid ? "" : "Add your email account to get started.";
7536
- const checkingHtml = isAndroid ? '<div style="padding:0.5rem;color:var(--color-text-muted)">Checking for accounts...</div>' : "";
7540
+ const checkingHtml = isAndroid ? '<div id="bootstrap-narration" style="padding:0.5rem;color:var(--color-text-muted)">Initializing\u2026</div>' : "";
7537
7541
  const gmailNote = isAndroid ? "" : `<p style="margin-top:0.5rem;padding:0.5rem 0.75rem;background:color-mix(in oklch, var(--color-accent) 12%, var(--color-bg-surface));border:1px solid var(--color-border);border-radius:4px;font-size:0.9rem">For now, a <strong>Gmail</strong> or Google Workspace account is required. Support for other providers is coming.</p>`;
7538
7542
  mainBody.innerHTML = `<div style="padding:2rem;line-height:1.8;max-width:500px">
7539
7543
  <h2 style="margin-bottom:1rem">Welcome to mailx</h2>
@@ -7769,6 +7773,19 @@ async function loadFolderTree(container) {
7769
7773
  }
7770
7774
  return;
7771
7775
  }
7776
+ const mlPane = document.querySelector(".message-list");
7777
+ if (mlPane?.style.display === "none")
7778
+ mlPane.style.display = "";
7779
+ const splitterPane = document.getElementById("splitter-h");
7780
+ if (splitterPane?.style.display === "none")
7781
+ splitterPane.style.display = "";
7782
+ const mvHead = document.getElementById("mv-header");
7783
+ if (mvHead?.style.display === "none")
7784
+ mvHead.style.display = "";
7785
+ const mvPane = document.querySelector(".message-viewer");
7786
+ if (mvPane?.classList.contains("narrow-active") && document.getElementById("bootstrap-narration")) {
7787
+ mvPane.classList.remove("narrow-active");
7788
+ }
7772
7789
  const accountFolderData = await Promise.all(accounts.map(async (account) => {
7773
7790
  const accountKey = `account:${account.id}`;
7774
7791
  const accountExpanded = expandState[accountKey] !== false;
@@ -8321,8 +8338,10 @@ var alertText = document.getElementById("alert-text");
8321
8338
  var alertDismiss = document.getElementById("alert-dismiss");
8322
8339
  var dismissedAlerts = /* @__PURE__ */ new Set();
8323
8340
  var alertAutoDismissTimer = null;
8341
+ var dbReadOnlyLatched = false;
8324
8342
  function showAlert(message, key, opts) {
8325
8343
  if (key && dismissedAlerts.has(key)) return;
8344
+ if (dbReadOnlyLatched && key !== "db-readonly") return;
8326
8345
  if (alertBanner && alertText) {
8327
8346
  alertText.textContent = message;
8328
8347
  alertBanner.hidden = false;
@@ -8355,12 +8374,8 @@ function hideAlert(opts) {
8355
8374
  }
8356
8375
  }
8357
8376
  alertDismiss?.addEventListener("click", () => hideAlert({ force: true }));
8358
- function showRestartForConfigBanner() {
8377
+ function addRestartButton() {
8359
8378
  if (!alertBanner || !alertText) return;
8360
- const ts = (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour12: false });
8361
- alertText.textContent = `[${ts}] accounts.jsonc changed \u2014 restart to apply.`;
8362
- alertBanner.hidden = false;
8363
- alertBanner.dataset.key = "config-restart";
8364
8379
  const existing = alertBanner.querySelector("#alert-restart-btn");
8365
8380
  if (existing) return;
8366
8381
  const btn = document.createElement("button");
@@ -8385,6 +8400,14 @@ function showRestartForConfigBanner() {
8385
8400
  });
8386
8401
  alertText.after(btn);
8387
8402
  }
8403
+ function showRestartForConfigBanner() {
8404
+ if (!alertBanner || !alertText) return;
8405
+ const ts = (/* @__PURE__ */ new Date()).toLocaleTimeString([], { hour12: false });
8406
+ alertText.textContent = `[${ts}] accounts.jsonc changed \u2014 restart to apply.`;
8407
+ alertBanner.hidden = false;
8408
+ alertBanner.dataset.key = "config-restart";
8409
+ addRestartButton();
8410
+ }
8388
8411
  var folderTree = document.getElementById("folder-tree");
8389
8412
  var currentFolderSpecialUse = "";
8390
8413
  var folderTitleEl = document.getElementById("ml-folder-title");
@@ -10372,6 +10395,10 @@ onWsEvent((event) => {
10372
10395
  if (startupStatus) startupStatus.textContent = msg;
10373
10396
  const slot = document.querySelector(".folder-loading");
10374
10397
  if (slot) slot.textContent = msg;
10398
+ const mlEmpty = document.querySelector("#ml-body .ml-empty");
10399
+ if (mlEmpty) mlEmpty.textContent = msg;
10400
+ const narrationSlot = document.getElementById("bootstrap-narration");
10401
+ if (narrationSlot) narrationSlot.textContent = msg;
10375
10402
  }
10376
10403
  break;
10377
10404
  }
@@ -12484,7 +12511,12 @@ versionPromise.then((d) => {
12484
12511
  el.textContent = text;
12485
12512
  if (tip) el.title = tip;
12486
12513
  }
12487
- if (d.settingsError) {
12514
+ if (d.dbWriteDenied) {
12515
+ if (alertBanner) alertBanner.style.background = "oklch(0.45 0.18 25)";
12516
+ dbReadOnlyLatched = true;
12517
+ showAlert("Database is READ-ONLY \u2014 nothing you do is being saved (\u2605, moves, new mail). Restart rmfmail.", "db-readonly", { sticky: true });
12518
+ addRestartButton();
12519
+ } else if (d.settingsError) {
12488
12520
  showAlert(d.settingsError, "settings-error");
12489
12521
  const banner = document.getElementById("alert-banner");
12490
12522
  if (banner && !banner.querySelector(".repair-btn")) {