'use client' import { useState, useEffect } from 'react' import { Button } from './ui/button' import { Input } from './ui/input' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from './ui/dialog' import { Badge } from './ui/badge' import { Tag, X, Plus, Palette } from 'lucide-react' import { LABEL_COLORS, LabelColorName } from '@/lib/types' import { getLabelColor, setLabelColor, deleteLabelColor, getAllLabelColors } from '@/lib/label-storage' import { cn } from '@/lib/utils' interface LabelManagerProps { existingLabels: string[] onUpdate: (labels: string[]) => void } export function LabelManager({ existingLabels, onUpdate }: LabelManagerProps) { const [open, setOpen] = useState(false) const [newLabel, setNewLabel] = useState('') const [selectedLabels, setSelectedLabels] = useState(existingLabels) const [allLabelsInStorage, setAllLabelsInStorage] = useState([]) const [editingColor, setEditingColor] = useState(null) // Load all labels from localStorage useEffect(() => { const allColors = getAllLabelColors() setAllLabelsInStorage(Object.keys(allColors)) }, [open]) const handleAddLabel = () => { const trimmed = newLabel.trim() if (trimmed && !selectedLabels.includes(trimmed)) { const updated = [...selectedLabels, trimmed] setSelectedLabels(updated) setNewLabel('') // Set default color if doesn't exist if (getLabelColor(trimmed) === 'gray') { const colors = Object.keys(LABEL_COLORS) as LabelColorName[] const randomColor = colors[Math.floor(Math.random() * colors.length)] setLabelColor(trimmed, randomColor) } } } const handleRemoveLabel = (label: string) => { setSelectedLabels(selectedLabels.filter(l => l !== label)) } const handleSelectExisting = (label: string) => { if (!selectedLabels.includes(label)) { setSelectedLabels([...selectedLabels, label]) } else { setSelectedLabels(selectedLabels.filter(l => l !== label)) } } const handleChangeColor = (label: string, color: LabelColorName) => { setLabelColor(label, color) setEditingColor(null) // Force re-render const allColors = getAllLabelColors() setAllLabelsInStorage(Object.keys(allColors)) } const handleSave = () => { onUpdate(selectedLabels) setOpen(false) } const handleCancel = () => { setSelectedLabels(existingLabels) setEditingColor(null) setOpen(false) } return ( { if (!isOpen) { handleCancel() } else { setOpen(true) } }}> Manage Labels Add or remove labels for this note. Click on a label to change its color.
{/* Add new label */}
setNewLabel(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault() handleAddLabel() } }} />
{/* Selected labels */} {selectedLabels.length > 0 && (

Selected Labels

{selectedLabels.map((label) => { const colorName = getLabelColor(label) const colorClasses = LABEL_COLORS[colorName] const isEditing = editingColor === label return (
{isEditing ? (
{(Object.keys(LABEL_COLORS) as LabelColorName[]).map((color) => { const classes = LABEL_COLORS[color] return (
) : null} setEditingColor(isEditing ? null : label)} > {label}
) })}
)} {/* Available labels from storage */} {allLabelsInStorage.length > 0 && (

All Labels

{allLabelsInStorage .filter(label => !selectedLabels.includes(label)) .map((label) => { const colorName = getLabelColor(label) const colorClasses = LABEL_COLORS[colorName] return ( handleSelectExisting(label)} > {label} ) })}
)}
) }