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 { plural, t } from "@/lib/i18n"; import { mailboxDisplayPath } from "@/lib/mailboxName"; 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: t("New folder"), placeholder: t("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(t("Folder created")); } catch (err) { toast.error((err as Error).message); } }; return (

{t("Folders")}

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

{list.map(({ m, path }) => ( ))}
{t("Folder")}{t("Messages")}{t("Unread")}
{m.role === "inbox" ? : }{mailboxDisplayPath(m, mailboxes)}{!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)} />}
); }