"use client"; // 공시(DART) 패널 — news 테이블의 source='dart' 만 골라서 카드 리스트로. // 별도 백엔드 엔드포인트는 안 만들고 기존 /api/news/{code}?source=dart 재사용. import { useEffect, useState } from "react"; import { api, type NewsResponse } from "../lib/api"; import { CardHeader } from "./CardHeader"; export function DisclosuresPanel({ code }: { code: string }) { const [data, setData] = useState(null); const [err, setErr] = useState(null); useEffect(() => { let alive = true; api .news(code, 10, "dart") .then((r) => { if (alive) setData(r); }) .catch((e) => { if (alive) setErr(e instanceof Error ? e.message : String(e)); }); return () => { alive = false; }; }, [code]); return (
{err &&
공시 로딩 실패: {err}
} {!err && !data &&
공시 로딩 중…
} {data && data.items.length === 0 && (
최근 공시 없음
)} {data && data.items.length > 0 && ( )}
); } function formatRelative(iso: string): string { try { const d = new Date(iso); const now = Date.now(); const diffMin = Math.round((now - d.getTime()) / 60000); if (diffMin < 1) return "방금"; if (diffMin < 60) return `${diffMin}분 전`; if (diffMin < 60 * 24) return `${Math.round(diffMin / 60)}시간 전`; if (diffMin < 60 * 24 * 7) return `${Math.round(diffMin / (60 * 24))}일 전`; return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`; } catch { return iso; } } function pad(n: number): string { return n < 10 ? `0${n}` : `${n}`; }