import { useMemo, useState } from "react"; import { Eye, EyeOff, Folder, Pencil, Plus, Share2, Trash2, Inbox } from "lucide-react"; import { useMail } from "@/store/mail"; import { confirmDialog, promptDialog } from "@/ui/dialog"; import { toast } from "@/ui/toast"; import { formatSize } from "@/lib/format"; import { ShareDialog } from "./ShareDialog"; import type { Mailbox } from "@/jmap/types"; import { t } from "@/lib/i18n"; export function FoldersSettings() { const mailboxes = useMail((s) => s.mailboxes); const mailboxPath = useMail((s) => s.mailboxPath); const [share, setShare] = useState(null); const list = useMemo(() => Object.values(mailboxes).map((m) => ({ m, path: mailboxPath(m.id) })).sort((a, b) => a.path.localeCompare(b.path)), [mailboxes, mailboxPath]); const quotas = useMail((s) => s.quotas); const q = quotas.find((x) => x.resourceType === "octets"); const create = async () => { const name = await promptDialog({ title: "New folder", placeholder: "Folder name (use / for subfolders, e.g. Work/Invoices)" }); if (!name?.trim()) return; try { const parts = name.split("/").map((p) => p.trim()).filter(Boolean); let parentId: string | null = null; for (const part of parts) { const existing = Object.values(useMail.getState().mailboxes).find((m) => (m.parentId ?? null) === parentId && m.name.toLowerCase() === part.toLowerCase()); parentId = existing ? existing.id : await useMail.getState().createMailbox(part, parentId); } toast.success("Folder created"); } catch (err) { toast.error((err as Error).message); } }; return (

{t("Folders")}

Create, rename and hide folders. {q && q.hardLimit ? `Storage: ${formatSize(q.used)} of ${formatSize(q.hardLimit)} used.` : ""}

{list.map(({ m, path }) => ( ))}
{t("Folder")}{t("Messages")}{t("Unread")}
{m.role === "inbox" ? : }{path}{!m.isSubscribed && {t("hidden")}}{m.role && m.role !== "subscribed" && ({m.role})}
{m.totalEmails.toLocaleString()} {m.unreadEmails.toLocaleString()}
{Object.keys(m.shareWith ?? {}).length > 0 && }
{share && setShare(null)} />}
); }