'use client' import { useState } from 'react' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator } from '@/components/ui/dropdown-menu' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Tag, Plus, Check } from 'lucide-react' import { cn } from '@/lib/utils' import { useLabels } from '@/context/LabelContext' import { LabelBadge } from './label-badge' interface LabelSelectorProps { selectedLabels: string[] onLabelsChange: (labels: string[]) => void variant?: 'default' | 'compact' triggerLabel?: string align?: 'start' | 'center' | 'end' } export function LabelSelector({ selectedLabels, onLabelsChange, variant = 'default', triggerLabel = 'Labels', align = 'start', }: LabelSelectorProps) { const { labels, loading, addLabel } = useLabels() const [search, setSearch] = useState('') const filteredLabels = labels.filter(l => l.name.toLowerCase().includes(search.toLowerCase()) ) const handleToggleLabel = (labelName: string) => { if (selectedLabels.includes(labelName)) { onLabelsChange(selectedLabels.filter((l) => l !== labelName)) } else { onLabelsChange([...selectedLabels, labelName]) } } const handleCreateLabel = async () => { const trimmed = search.trim() if (trimmed) { await addLabel(trimmed) // Let backend assign random color onLabelsChange([...selectedLabels, trimmed]) setSearch('') } } const showCreateOption = search.trim() && !labels.some(l => l.name.toLowerCase() === search.trim().toLowerCase()) return (
setSearch(e.target.value)} className="h-8 text-sm" onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault() if (showCreateOption) handleCreateLabel() } }} />
{loading ? (
Loading...
) : ( <> {filteredLabels.map((label) => { const isSelected = selectedLabels.includes(label.name) return (
{ e.preventDefault() handleToggleLabel(label.name) }} className="flex items-center gap-2 p-2 rounded-sm hover:bg-gray-100 dark:hover:bg-zinc-800 cursor-pointer text-sm" >
{isSelected && }
) })} {showCreateOption && (
{ e.preventDefault() handleCreateLabel() }} className="flex items-center gap-2 p-2 rounded-sm hover:bg-gray-100 dark:hover:bg-zinc-800 cursor-pointer text-sm border-t mt-1" > Create "{search}"
)} {filteredLabels.length === 0 && !showCreateOption && (
No labels found
)} )}
) }