ultisuite-client/lib/label-picker-visual.tsx
2026-05-16 20:30:50 +02:00

64 lines
2.1 KiB
TypeScript

import type { FolderTreeNode } from "@/lib/sidebar-nav-maps"
import type { LabelRowItem } from "@/lib/sidebar-nav-data"
import { labelRowById } from "@/lib/sidebar-nav-data"
import { findFolderPath } from "@/lib/sidebar-nav-folder-ids"
export type LabelPickerVisual =
| { kind: "iconify"; icon: string }
| { kind: "dot"; colorClass: string }
function findFolderNodeByLabel(
nodes: FolderTreeNode[],
labelText: string
): FolderTreeNode | undefined {
const lower = labelText.toLowerCase()
for (const n of nodes) {
if (n.label === labelText || n.label.toLowerCase() === lower) return n
if (n.children?.length) {
const hit = findFolderNodeByLabel(n.children, labelText)
if (hit) return hit
}
}
return undefined
}
function labelRowByLabelText(
rows: readonly LabelRowItem[],
labelText: string
): LabelRowItem | undefined {
const lower = labelText.toLowerCase()
return rows.find((r) => r.label === labelText || r.label.toLowerCase() === lower)
}
/** Icône nav ou pastille couleur pour une entrée du sélecteur de libellés. */
export function resolveLabelPickerVisual(
labelText: string,
opts: {
folderTree: FolderTreeNode[]
labelRows: readonly LabelRowItem[]
emailLabelToSidebarFolderId: Record<string, string>
}
): LabelPickerVisual {
const { folderTree, labelRows, emailLabelToSidebarFolderId } = opts
const fid = emailLabelToSidebarFolderId[labelText]
if (fid) {
const row = labelRowById(labelRows, fid)
if (row?.icon) return { kind: "iconify", icon: row.icon }
if (row?.color) return { kind: "dot", colorClass: row.color }
const path = findFolderPath(folderTree, fid)
if (path?.length) {
const leaf = path[path.length - 1]!
return { kind: "dot", colorClass: leaf.color ?? "bg-gray-400" }
}
}
const row = labelRowByLabelText(labelRows, labelText)
if (row?.icon) return { kind: "iconify", icon: row.icon }
if (row?.color) return { kind: "dot", colorClass: row.color }
const folder = findFolderNodeByLabel(folderTree, labelText)
if (folder?.color) return { kind: "dot", colorClass: folder.color }
return { kind: "dot", colorClass: "bg-gray-400" }
}