import { useMemo, useState } from "react"; import { Folder, Inbox } from "lucide-react"; import { useMail } from "@/store/mail"; import { Dialog } from "@/ui/dialog"; import type { Id, Mailbox } from "@/jmap/types"; import { t } from "@/lib/i18n"; import { mailboxDisplayPath } from "@/lib/mailboxName"; export function MailboxPicker({ title, onClose, onPick, exclude }: { title: string; onClose: () => void; onPick: (id: Id) => void; exclude?: Id[] }) { const mailboxes = useMail((s) => s.mailboxes); const mailboxPath = useMail((s) => s.mailboxPath); const [q, setQ] = useState(""); const [active, setActive] = useState(0); const list = useMemo(() => { const all = Object.values(mailboxes) .filter((m) => !exclude?.includes(m.id) && m.myRights.mayAddItems) .map((m) => ({ m, path: mailboxDisplayPath(m, mailboxes) })) .sort((a, b) => (a.m.role === "inbox" ? -1 : b.m.role === "inbox" ? 1 : a.path.localeCompare(b.path))); const ql = q.trim().toLowerCase(); return ql ? all.filter((x) => x.path.toLowerCase().includes(ql)) : all; }, [mailboxes, mailboxPath, q, exclude]); return ( { setQ(e.target.value); setActive(0); }} onKeyDown={(e) => { if (e.key === "ArrowDown") { e.preventDefault(); setActive((a) => Math.min(list.length - 1, a + 1)); } else if (e.key === "ArrowUp") { e.preventDefault(); setActive((a) => Math.max(0, a - 1)); } else if (e.key === "Enter") { e.preventDefault(); const m = list[active]?.m; if (m) onPick(m.id); } }} /> {list.map(({ m, path }, i) => ( onPick(m.id)} onHover={() => setActive(i)} /> ))} {!list.length && {t("No matching folders")}} ); } function PickerRow({ m, path, active, onClick, onHover }: { m: Mailbox; path: string; active: boolean; onClick: () => void; onHover: () => void }) { return ( {m.role === "inbox" ? : } {path} {m.totalEmails} ); }