'use client'; import { useEffect, useState } from 'react'; import { api } from '@/lib/api'; import Chart from '@/components/Chart'; import { Banner, Card, PageHeader, Select, Toggle } from '@/components/ui'; import { RefreshCw } from 'lucide-react'; const SYMBOLS = ['BTCUSDT', 'ETHUSDT', 'SOLUSDT', 'BNBUSDT']; const INTERVALS = ['1m', '3m', '5m', '15m', '30m', '1h', '4h', '12h', '1d']; const CANDLES_DESKTOP = 200; const CANDLES_MOBILE = 60; export default function DashboardPage() { const [symbol, setSymbol] = useState('BTCUSDT'); const [interval, setIntervalV] = useState('5m'); const [auto, setAuto] = useState(true); const [refresh, setRefresh] = useState(30); const [showLegend, setShowLegend] = useState(false); const [mobile, setMobile] = useState(false); const [data, setData] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [tick, setTick] = useState(0); // 첫 로드 시 viewport 자동 감지 (모바일이면 mobile 모드 default ON) useEffect(() => { if (typeof window !== 'undefined' && window.innerWidth < 768) { setMobile(true); } }, []); const candleLimit = mobile ? CANDLES_MOBILE : CANDLES_DESKTOP; useEffect(() => { let cancelled = false; setLoading(true); setError(null); api.get(`/api/market/dashboard?symbol=${symbol}&interval=${interval}&limit=${candleLimit}`) .then(d => { if (!cancelled) setData(d); }) .catch(e => { if (!cancelled) setError(e.message); }) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [symbol, interval, tick, candleLimit]); useEffect(() => { if (!auto) return; const id = setInterval(() => setTick(t => t + 1), refresh * 1000); return () => clearInterval(id); }, [auto, refresh]); const now = new Date().toLocaleString('ko-KR', { timeZone: 'Asia/Seoul' }); return (
setTick(t => t + 1)} className="flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium bg-blue-600 hover:bg-blue-700 text-white rounded-md shadow-sm"> 새로고침 } />
갱신(초) setRefresh(parseInt(e.target.value))} className="w-full px-3 py-2 text-sm rounded-md border border-slate-300 bg-slate-50" />
{(loading || data?.last_price) && (
{loading ? '⏳ 로딩 중...' : `현재가: ${data.last_price.toLocaleString()} ${symbol.replace('USDT', '/USDT')}`}
)}
{data?.banner && (
{data.banner.text}
)} {error && {error}}
); }