Say a missing folder is missing, not empty
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.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
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];
|
||||
}
|
||||
Reference in New Issue
Block a user