"use client"
import type { ComponentType, ReactNode } from "react"
import { Check, Minus, Plus } from "lucide-react"
import { Input } from "@/components/ui/input"
import { cn } from "@/lib/utils"
export type CatalogLabelPresence = "none" | "some" | "all"
export type LabelPickerItemComponent = ComponentType<{
children: ReactNode
onSelect?: (event: Event) => void
className?: string
}>
function LabelPickerCheckboxVisual({
checked,
}: {
checked: boolean | "indeterminate"
}) {
return (
{checked === true ? (
) : checked === "indeterminate" ? (
) : null}
)
}
export function EmailLabelPickerBlock({
query,
onQueryChange,
catalogLabels,
Item,
getLabelPresence,
onToggleCatalogLabel,
onCreateLabel,
listClassName,
}: {
query: string
onQueryChange: (v: string) => void
catalogLabels: string[]
Item: LabelPickerItemComponent
getLabelPresence: (label: string) => CatalogLabelPresence
onToggleCatalogLabel: (label: string) => void
onCreateLabel: (label: string) => void
listClassName?: string
}) {
const q = query.trim().toLowerCase()
const filtered = catalogLabels.filter(
(l) => q.length === 0 || l.toLowerCase().includes(q)
)
const trimmed = query.trim()
const hasExact = catalogLabels.some(
(l) => l.toLowerCase() === trimmed.toLowerCase()
)
const canCreate = trimmed.length > 0 && !hasExact
return (
<>
e.stopPropagation()}
>
onQueryChange(e.target.value)}
placeholder="Rechercher ou créer un libellé…"
className="h-8 border-[#dadce0] text-sm shadow-none"
autoComplete="off"
onPointerDown={(e) => e.stopPropagation()}
onClick={(e) => e.stopPropagation()}
onKeyDown={(e) => e.stopPropagation()}
/>
{canCreate ? (
- {
e.preventDefault()
onCreateLabel(trimmed)
}}
>
Créer le libellé « {trimmed} »
) : null}
{filtered.map((label) => {
const presence = getLabelPresence(label)
const boxChecked: boolean | "indeterminate" =
presence === "all" ? true : presence === "some" ? "indeterminate" : false
return (
- {
e.preventDefault()
onToggleCatalogLabel(label)
}}
>
{label}
)
})}
{filtered.length === 0 && !canCreate ? (
Aucun libellé correspondant
) : null}
>
)
}