'use client'; import { useState, useEffect, useRef } from 'react'; import { Search, X } from 'lucide-react'; import Fuse from 'fuse.js'; import { getAllMeasures, getUnitsForMeasure, getUnitInfo, formatMeasureName, type Measure, type UnitInfo, } from '@/lib/units/units'; import { cn } from '@/lib/utils'; interface SearchResult { unitInfo: UnitInfo; measure: Measure; } interface SearchUnitsProps { onSelectUnit: (unit: string, measure: Measure) => void; className?: string; } export default function SearchUnits({ onSelectUnit, className }: SearchUnitsProps) { const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [isOpen, setIsOpen] = useState(false); const inputRef = useRef(null); const containerRef = useRef(null); const searchIndex = useRef | null>(null); useEffect(() => { const allData: SearchResult[] = []; const measures = getAllMeasures(); for (const measure of measures) { for (const unit of getUnitsForMeasure(measure)) { const unitInfo = getUnitInfo(unit); if (unitInfo) allData.push({ unitInfo, measure }); } } searchIndex.current = new Fuse(allData, { keys: [ { name: 'unitInfo.abbr', weight: 2 }, { name: 'unitInfo.singular', weight: 1.5 }, { name: 'unitInfo.plural', weight: 1.5 }, { name: 'measure', weight: 1 }, ], threshold: 0.3, includeScore: true, }); }, []); useEffect(() => { if (!query.trim() || !searchIndex.current) { setResults([]); setIsOpen(false); return; } setResults(searchIndex.current.search(query).map((r) => r.item).slice(0, 10)); setIsOpen(true); }, [query]); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (containerRef.current && !containerRef.current.contains(event.target as Node)) { setIsOpen(false); } } document.addEventListener('mousedown', handleClickOutside); return () => document.removeEventListener('mousedown', handleClickOutside); }, []); const handleSelectUnit = (unit: string, measure: Measure) => { onSelectUnit(unit, measure); setQuery(''); setIsOpen(false); inputRef.current?.blur(); }; return (
setQuery(e.target.value)} onFocus={() => query && setIsOpen(true)} className="w-full bg-transparent border border-border/40 rounded-lg pl-8 pr-7 py-1.5 text-xs font-mono outline-none focus:border-primary/50 transition-colors placeholder:text-muted-foreground/30" /> {query && ( )}
{isOpen && results.length > 0 && (
{results.map((result, index) => ( ))}
)} {isOpen && query && results.length === 0 && (

No units found for "{query}"

)}
); }