"use client"
import { useEffect, useMemo, useState } from "react"
import { Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select"
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible"
import { NavColorPickerTrigger } from "@/components/gmail/nav/nav-color-picker-trigger"
import {
NavMessageVisibilityFields,
NavSidebarVisibilityFields,
} from "@/components/gmail/nav/nav-visibility-fields"
import { useSidebarNav, folderMoveParentOptions } from "@/lib/sidebar-nav-context"
import { normalizeNavColorClass } from "@/lib/nav-color"
import { cn } from "@/lib/utils"
export function NavLabelSettingsCard({
id,
name,
color,
depth = 0,
}: {
id: string
name: string
color: string
depth?: number
}) {
const nav = useSidebarNav()
const prefs = nav.getNavItemPrefs(id)
const colorClass = normalizeNavColorClass(color)
const [renameDraft, setRenameDraft] = useState(name)
const [sublabelName, setSublabelName] = useState("")
useEffect(() => {
setRenameDraft(name)
}, [name])
return (
nav.updateFolderOrLabelColor(id, sw)}
onDelete={() => nav.removeFolderOrLabelRow(id)}
deleteLabel="Supprimer le libellé"
>
nav.setNavItemSidebarVisibility(id, v)}
/>
nav.setNavItemMessageVisibility(id, v)}
/>
)
}
export function NavImapFolderSettingsCard({
id,
name,
remoteName,
depth = 0,
}: {
id: string
name: string
remoteName?: string
depth?: number
}) {
const nav = useSidebarNav()
const prefs = nav.getNavItemPrefs(id)
const subtitle =
remoteName && remoteName !== name ? remoteName : undefined
return (
nav.setNavItemSidebarVisibility(id, v)}
/>
nav.setNavItemMessageVisibility(id, v)}
/>
Dossier synchronisé depuis le serveur mail — structure non modifiable ici.
)
}
export function NavFolderSettingsCard({
id,
name,
color,
depth = 0,
}: {
id: string
name: string
color?: string
depth?: number
}) {
const nav = useSidebarNav()
const prefs = nav.getNavItemPrefs(id)
const colorClass = normalizeNavColorClass(color)
const [renameDraft, setRenameDraft] = useState(name)
const [moveParent, setMoveParent] = useState("__root__")
const [subfolderName, setSubfolderName] = useState("")
const moveTargets = useMemo(
() => folderMoveParentOptions(nav.folderTree, id),
[nav.folderTree, id]
)
useEffect(() => {
setRenameDraft(name)
}, [name])
return (
nav.updateFolderOrLabelColor(id, sw)}
onDelete={() => nav.removeFolderOrLabelRow(id)}
deleteLabel="Supprimer le dossier"
>
nav.setNavItemSidebarVisibility(id, v)}
/>
nav.setNavItemMessageVisibility(id, v)}
/>
)
}
function NavItemSettingsShell({
title,
subtitle,
color,
depth,
onColorChange,
onDelete,
deleteLabel,
hideDelete = false,
hideColor = false,
children,
}: {
title: string
subtitle?: string
color?: string
depth: number
onColorChange?: (swatch: string) => void
onDelete?: () => void
deleteLabel?: string
hideDelete?: boolean
hideColor?: boolean
children: import("react").ReactNode
}) {
const [open, setOpen] = useState(false)
return (
{!hideColor && color && onColorChange ? (
) : null}
{title}
{subtitle ? (
{subtitle}
) : null}
{!hideDelete && onDelete ? (
) : null}
{children}
)
}
/** Flatten label rows for settings (parent/child via `/` in name). */
export function flattenLabelRowsForSettings(
rows: { id: string; label: string; color: string }[]
) {
return rows.map((row) => ({
...row,
depth: Math.max(0, row.label.split("/").length - 1),
}))
}
type FolderSettingsNode = {
id: string
label: string
color?: string
children?: FolderSettingsNode[]
}
export function FolderSettingsTree({
nodes,
depth = 0,
}: {
nodes: FolderSettingsNode[]
depth?: number
}) {
return (
0 && "mt-2")}>
{nodes.map((node) => (
-
{node.children?.length ? (
) : null}
))}
)
}
type ImapFolderSettingsNode = {
id: string
label: string
remoteName?: string
children?: ImapFolderSettingsNode[]
}
export function ImapFolderSettingsTree({
nodes,
depth = 0,
}: {
nodes: ImapFolderSettingsNode[]
depth?: number
}) {
return (
0 && "mt-2")}>
{nodes.map((node) => (
-
{node.children?.length ? (
) : null}
))}
)
}