"use client" import { useEffect, useState } from "react" import { CommandDialog, CommandEmpty, CommandInput, CommandList } from "@/components/ui/command" import {Button} from "@/components/ui/button"; import {Loader2, TrendingUp} from "lucide-react"; import Link from "next/link"; import {searchStocks} from "@/lib/actions/finnhub.actions"; import {useDebounce} from "@/hooks/useDebounce"; export default function SearchCommand({ renderAs = 'button', label = 'Add stock', initialStocks }: SearchCommandProps) { const [open, setOpen] = useState(false) const [searchTerm, setSearchTerm] = useState("") const [loading, setLoading] = useState(false) const [stocks, setStocks] = useState(initialStocks); const isSearchMode = !!searchTerm.trim(); const displayStocks = isSearchMode ? stocks : stocks?.slice(0, 10); useEffect(() => { const onKeyDown = (e: KeyboardEvent) => { if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === "k") { e.preventDefault() setOpen(v => !v) } } window.addEventListener("keydown", onKeyDown) return () => window.removeEventListener("keydown", onKeyDown) }, []) const handleSearch = async () => { if(!isSearchMode) return setStocks(initialStocks); setLoading(true) try { const results = await searchStocks(searchTerm.trim()); setStocks(results); } catch { setStocks([]) } finally { setLoading(false) } } const debouncedSearch = useDebounce(handleSearch, 300); useEffect(() => { debouncedSearch(); }, [debouncedSearch, searchTerm]); const handleSelectStock = () => { setOpen(false); setSearchTerm(""); setStocks(initialStocks); } return ( <> {renderAs === 'text' ? ( ): ( )}
{loading && }
{loading ? ( Loading stocks... ) : displayStocks?.length === 0 ? (
{isSearchMode ? 'No results found' : 'No stocks available'}
) : (
    {isSearchMode ? 'Search results' : 'Popular stocks'} {` `}({displayStocks?.length || 0})
    {displayStocks?.map((stock) => (
  • {stock.name}
    {[stock.symbol, stock.exchange, stock.type].filter(Boolean).join(' | ')}
  • ))}
) }
) }