"use client"; import { useRef, useState } from "react"; import { X } from "lucide-react"; import type { SeriesResponse } from "@/lib/types"; interface SeriesPickerProps { values: string[]; onChange: (v: string[]) => void; series: SeriesResponse[]; isLoading?: boolean; } export function SeriesPicker({ values, onChange, series, isLoading }: SeriesPickerProps) { const [search, setSearch] = useState(""); const [open, setOpen] = useState(false); const inputRef = useRef(null); const filtered = series .filter((s) => !values.includes(s.name)) .filter((s) => !search.trim() || s.name.toLowerCase().includes(search.toLowerCase())) .slice(0, 40); const handleSelect = (name: string) => { onChange([...values, name]); setSearch(""); inputRef.current?.focus(); }; const handleRemove = (name: string) => { onChange(values.filter((v) => v !== name)); }; // Delay blur so clicks inside the dropdown register before closing const handleBlur = () => setTimeout(() => setOpen(false), 150); return (
{/* Selected chips */} {values.length > 0 && (
{values.map((name) => ( {name} ))}
)} {/* Search input */}
{ setSearch(e.target.value); setOpen(true); }} onFocus={() => setOpen(true)} onBlur={handleBlur} onKeyDown={(e) => { if (e.key === "Escape") setOpen(false); }} className="w-full rounded-md border border-zinc-700 bg-zinc-800 px-3 py-2 text-sm text-zinc-100 placeholder:text-zinc-600 focus:border-zinc-500 focus:outline-none disabled:opacity-50" /> {open && filtered.length > 0 && (
    {filtered.map((s) => (
  • ))}
)} {open && !isLoading && series.length === 0 && (
No series found in library.
)}
); }