import { Search } from "lucide-react"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; import { useState, useMemo, useRef } from "react"; type ListPaneProps = { items: T[]; listItems: () => void; clearItems: () => void; setSelectedItem: (item: T) => void; renderItem: (item: T) => React.ReactNode; title: string; buttonText: string; isButtonDisabled?: boolean; }; const ListPane = ({ items, listItems, clearItems, setSelectedItem, renderItem, title, buttonText, isButtonDisabled, }: ListPaneProps) => { const [searchQuery, setSearchQuery] = useState(""); const [isSearchExpanded, setIsSearchExpanded] = useState(false); const searchInputRef = useRef(null); const filteredItems = useMemo(() => { if (!searchQuery.trim()) return items; return items.filter((item) => { const searchableText = [ (item as { name?: string }).name || "", (item as { description?: string }).description || "", ] .join(" ") .toLowerCase(); return searchableText.includes(searchQuery.toLowerCase()); }); }, [items, searchQuery]); const handleSearchClick = () => { setIsSearchExpanded(true); setTimeout(() => { searchInputRef.current?.focus(); }, 100); }; const handleSearchBlur = () => { if (!searchQuery.trim()) { setIsSearchExpanded(false); } }; return (

{title}

{!isSearchExpanded ? ( ) : (
setSearchQuery(e.target.value)} onBlur={handleSearchBlur} className="pl-10 w-full transition-all duration-300 ease-in-out" />
)}
{filteredItems.map((item, index) => (
setSelectedItem(item)} > {renderItem(item)}
))} {filteredItems.length === 0 && searchQuery && items.length > 0 && (
No items found matching "{searchQuery}"
)}
); }; export default ListPane;