ultisuite-client/lib/mail-nav-icons.tsx

78 lines
2.2 KiB
TypeScript

import type { LucideIcon } from "lucide-react"
import {
Inbox,
Star,
Clock,
Tag,
Send,
FileText,
ClockArrowUp,
ShieldAlert,
Trash2,
} from "lucide-react"
import {
folderTreeNavIconNameClosed,
navFolderIconColorFromBgClass,
} from "@/lib/folder-nav-icons"
import type { FolderTreeNode } from "@/lib/sidebar-nav-maps"
import type { LabelRowItem } from "@/lib/sidebar-nav-data"
import { defaultNavLabelRowsSnapshot, labelRowById } from "@/lib/sidebar-nav-data"
import { findFolderPath } from "@/lib/sidebar-nav-folder-ids"
import { parseMailNavVisitKey } from "@/lib/mail-folder-display"
import { normalizeInboxTabSegment } from "@/lib/mail-url"
const SYSTEM_ICONS: Record<string, LucideIcon> = {
inbox: Inbox,
starred: Star,
snoozed: Clock,
important: Tag,
sent: Send,
drafts: FileText,
scheduled: ClockArrowUp,
spam: ShieldAlert,
trash: Trash2,
}
export type MailNavIcon =
| { kind: "lucide"; Icon: LucideIcon }
| { kind: "folder"; icon: string; color: string }
| { kind: "iconify"; icon: string }
export function resolveMailNavIcon(
visitKey: string,
folderTree: FolderTreeNode[],
labelRows: readonly LabelRowItem[] = defaultNavLabelRowsSnapshot
): MailNavIcon {
const { folderId, inboxTab } = parseMailNavVisitKey(visitKey)
if (folderId === "inbox") {
const tab = normalizeInboxTabSegment(inboxTab ?? "primary")
if (tab === "primary") return { kind: "lucide", Icon: Inbox }
const row = labelRowById(labelRows, tab)
if (row?.icon) return { kind: "iconify", icon: row.icon }
return { kind: "lucide", Icon: Inbox }
}
const system = SYSTEM_ICONS[folderId]
if (system) return { kind: "lucide", Icon: system }
const navRow = labelRowById(labelRows, folderId)
if (navRow?.icon) return { kind: "iconify", icon: navRow.icon }
const path = findFolderPath(folderTree, folderId)
if (path?.length) {
const leaf = path[path.length - 1]!
return {
kind: "folder",
icon: folderTreeNavIconNameClosed(!!leaf.children?.length),
color: navFolderIconColorFromBgClass(leaf.color ?? "bg-slate-400"),
}
}
return {
kind: "folder",
icon: folderTreeNavIconNameClosed(false),
color: navFolderIconColorFromBgClass("bg-slate-400"),
}
}