import React, { useState, useEffect, useMemo } from 'react'; import { X, TrendingUp, BarChart4, PieChart, Info, Building2, Layers, RotateCw } from 'lucide-react'; import { StockItem, MarketType, StockTick } from '../types'; import { DbService } from '../services/dbService'; interface StockDetailModalProps { stock: StockItem; onClose: () => void; } const StockDetailModal: React.FC = ({ stock, onClose }) => { const [ticks, setTicks] = useState([]); const dbService = useMemo(() => new DbService(), []); useEffect(() => { const refreshTicks = async () => { const history = await dbService.getStockTicks(stock.code); setTicks(history); }; refreshTicks(); const interval = setInterval(refreshTicks, 5000); return () => clearInterval(interval); }, [stock.code, dbService]); return (
{/* Header */}

{stock.name}

{stock.market}

{stock.code}

{stock.market === MarketType.DOMESTIC ? stock.price.toLocaleString() : `$${stock.price}`}

= 0 ? 'text-rose-500' : 'text-blue-600'} flex items-center justify-end gap-2`}> {stock.changePercent >= 0 ? : } {Math.abs(stock.changePercent)}%

{/* Body */}
{/* Left: Chart */}

시계열 시세 차트 (실시간)

데이터 수집 중
{ticks.length > 0 ? (
) : (

분 단위 시세 데이터 수집 중...

)}
{/* Right: Info */}

연관 테마 분석

{stock.themes?.map(theme => ( #{theme} ))}

기업 분석 핵심 지표

AI Strategy Insight

); }; // --- Helpers --- const SimpleLineChart: React.FC<{ data: StockTick[] }> = ({ data }) => { const prices = data.map(d => d.price); const min = Math.min(...prices) * 0.9995; const max = Math.max(...prices) * 1.0005; const range = max - min || 1; const width = 800; const height = 400; if (data.length <= 1) return
데이터 수집 부족
; const points = data.map((d, i) => { const x = (i / (data.length - 1)) * width; const y = height - ((d.price - min) / range) * height; return `${x},${y}`; }).join(' '); return ( ); }; const DataCard: React.FC<{ label: string, value?: number, suffix?: string, desc: string }> = ({ label, value, suffix = '', desc }) => (
{label}
{value !== undefined ? value.toLocaleString() : 'N/A'} {suffix}

{desc}

); const ScoreBar: React.FC<{ label: string, score: number, color: 'rose' | 'blue' }> = ({ label, score, color }) => (
{label} {score}pt
); export default StockDetailModal;