"use client"; import Link from "next/link"; import { useEffect, useState } from "react"; import { api, type Symbol } from "../lib/api"; import { Sparkline } from "./Sparkline"; export function SearchBox({ autoFocus = false }: { autoFocus?: boolean }) { const [q, setQ] = useState(""); const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [err, setErr] = useState(null); const [seedOnly, setSeedOnly] = useState(false); useEffect(() => { const term = q.trim(); if (!term) { setItems([]); setErr(null); return; } setLoading(true); setErr(null); const handle = setTimeout(async () => { try { // with_sparkline=true: 백엔드가 최근 30 종가 + close + pct_change 동봉. const r = await api.search(term, seedOnly, 15, true); setItems(r.items); } catch (e) { setErr(e instanceof Error ? e.message : String(e)); setItems([]); } finally { setLoading(false); } }, 200); return () => clearTimeout(handle); }, [q, seedOnly]); return (
setQ(e.target.value)} placeholder="종목명 또는 코드 (예: 삼성, 005930)" className="w-full rounded-md border border-zinc-700 bg-zinc-900 px-4 py-3 text-base outline-none focus:border-zinc-500" />
{loading && "검색중…"} {err && 에러: {err}} {!loading && !err && q && items.length === 0 && "검색 결과 없음"}
{items.length > 0 && (
    {items.map((it) => ( ))}
)}
); } function SearchRow({ it }: { it: Symbol }) { const pct = it.pct_change ?? null; const tone = pct == null || pct === 0 ? "text-zinc-400" : pct > 0 ? "text-rose-400" : "text-sky-400"; const stroke = pct != null && pct < 0 ? "#3b82f6" : "#ef4444"; const series = it.sparkline ?? []; return (
  • {it.name} {it.is_seed && ( SEED )}
    {it.code} · {it.market} {it.sector ? ` · ${it.sector}` : ""}
    {series.length >= 2 && ( )}
    {it.close != null ? it.close.toLocaleString(undefined, { maximumFractionDigits: 0 }) : "—"}
    {pct != null ? `${pct >= 0 ? "+" : ""}${pct.toFixed(2)}%` : ""}
  • ); }