A folder id the account does not have rendered the ordinary empty state -- "Nothing here. This folder is empty." That is a claim about a folder that is not there, so a stale link read as a folder that had emptied itself rather than one that was gone (#111). It now goes to the inbox and says why. Inbox is the kinder landing than a dead end for a bookmark that has outlived its folder, but swapping one folder for another without a word would be its own small lie, so it does not do that either. The condition worth writing a test around is not the unknown id, it is the one guarding it. The folder list arrives after the first paint, so for a moment *every* id is unknown, the right one included. Without that gate this redirects on every cold load, from the folder the reader actually asked for, and looks exactly like a flaky link -- a worse bug than the one being fixed and a harder one to see. `isUnknownMailbox` is a small pure function so that case can be pinned down rather than reasoned about. Only ever reachable from outside the app, which is why it went unnoticed: the sidebar links to ids that exist. A bookmark to a deleted folder, or a folder link passed between accounts, is where it bites. Verified against the mock: an unknown id lands on the inbox with the message and a full list rather than an empty one, and a cold load straight into a real folder stays in that folder with nothing said. Closes #111.
28 lines
1.1 KiB
TypeScript
28 lines
1.1 KiB
TypeScript
import type { Id, Mailbox } from "@/jmap/types";
|
|
|
|
/**
|
|
* Whether the folder in the address is one this account does not have.
|
|
*
|
|
* Rendering it as an empty folder was the bug (#111): "Nothing here. This
|
|
* folder is empty" is a claim about a folder that is not there, so a stale link
|
|
* read as a folder that had emptied itself rather than one that was gone.
|
|
*
|
|
* The condition that matters is `loaded`. The folder list arrives after the
|
|
* first paint, so for a moment every id is unknown -- including the right one.
|
|
* Without that gate this answers true on every cold load and sends the reader
|
|
* to their inbox from the folder they asked for, which is a worse bug than the
|
|
* one it fixes and would look exactly like a flaky link.
|
|
*/
|
|
export function isUnknownMailbox(args: {
|
|
mailboxId: Id | undefined;
|
|
mailboxes: Record<Id, Mailbox>;
|
|
loaded: boolean;
|
|
search?: boolean;
|
|
}): boolean {
|
|
const { mailboxId, mailboxes, loaded, search } = args;
|
|
if (search) return false;
|
|
if (!mailboxId) return false;
|
|
if (!loaded) return false;
|
|
return !mailboxes[mailboxId];
|
|
}
|