import React from 'react'; import { Zap, ShoppingCart, Star, TrendingUp, TrendingDown } from 'lucide-react'; import { StockItem, MarketType, OrderType } from '../types'; interface StockMasterRowProps { stock: StockItem; rank?: number; isWatchlisted?: boolean; onClick?: () => void; onTrade?: (type: OrderType) => void; onToggleWatchlist?: () => void; } export const StockMasterRow: React.FC = ({ stock, rank, isWatchlisted, onClick, onTrade, onToggleWatchlist }) => { const formatValue = (val?: number) => { if (val === undefined) return '-'; return stock.market === MarketType.DOMESTIC ? val.toLocaleString() : '$' + val; }; const formatVolume = (vol: number) => { if (vol >= 1000000) return (vol / 1000000).toFixed(1) + 'M'; if (vol >= 1000) return (vol / 1000).toFixed(1) + 'K'; return vol.toString(); }; return ( {/* 1. 번호 (순위) */} {rank !== undefined ? rank.toString().padStart(2, '0') : '-'} {/* 2. 종목 기본 정보 */}
{stock.name[0]}
{stock.name} {stock.code}
{/* 3. 현재가 및 등락 */}
{formatValue(stock.price)}
= 0 ? 'text-rose-500' : 'text-blue-600'}`}> {stock.changePercent >= 0 ? : } {Math.abs(stock.changePercent)}%
{/* 4. 시가 / 고가 / 저가 */}
시: {formatValue(stock.openPrice)}
고: {formatValue(stock.highPrice)} 저: {formatValue(stock.lowPrice)}
{/* 5. 거래량 및 거래대금 */}
{formatVolume(stock.volume)} {stock.tradingValue && ( {stock.market === MarketType.DOMESTIC ? (stock.tradingValue / 100000000).toFixed(1) + '억' : '$' + (stock.tradingValue / 1000000).toFixed(1) + 'M'} )}
{/* 6. 기업 건강상태 (Fundamental) */}
PER/PBR {stock.per || '-'} / {stock.pbr || '-'}
ROE/DY {stock.roe || '-'}% / {stock.dividendYield || '-'}%
{/* 7. AI 스코어 (매수/매도) */}
Buy {stock.aiScoreBuy}
Sell {stock.aiScoreSell}
{/* 7. 액션 버튼 */}
); };