import { useMemo, useState } from 'react' import { Input } from '@/components/ui/input' import { brandIconUrl, BRAND_ICON_PREFIX } from '@/utils/nodeIcons' import dashboardIcons from '@/data/dashboardIcons.json' const SLUGS: string[] = dashboardIcons as string[] const PAGE = 120 interface BrandIconPickerProps { value?: string onSelect: (key: string) => void } export function BrandIconPicker({ value, onSelect }: BrandIconPickerProps) { const [query, setQuery] = useState('') const [limit, setLimit] = useState(PAGE) const filtered = useMemo(() => { const q = query.trim().toLowerCase() if (!q) return SLUGS return SLUGS.filter((s) => s.includes(q)) }, [query]) const visible = filtered.slice(0, limit) const selectedSlug = value?.startsWith(BRAND_ICON_PREFIX) ? value.slice(BRAND_ICON_PREFIX.length) : null return (
{ setQuery(e.target.value); setLimit(PAGE) }} placeholder={`Search ${SLUGS.length} brand icons...`} className="bg-[#0d1117] border-[#30363d] text-xs h-7" aria-label="Brand icon search" />
{filtered.length} match{filtered.length === 1 ? '' : 'es'} ยท icons served via jsDelivr CDN
{visible.map((slug) => { const selected = slug === selectedSlug return ( ) })}
{filtered.length > limit && ( )} {filtered.length === 0 && (
No icons match.
)}
) }