Files
goldenChart/frontend/src/components/TradeSignalDetailBody.tsx
T
2026-06-10 21:13:53 +09:00

77 lines
2.4 KiB
TypeScript

/**
* 매매 시그널 알림 상세 본문 — 종목·시간·매수/매도·금액 등
*/
import React from 'react';
import {
buildSignalDetailRows,
formatSignalPrice,
getSignalHeadline,
getSignalTypeKo,
type TradeSignalDisplaySource,
} from '../utils/tradeSignalDisplay';
import { useTradeAlertTimeFormat } from '../utils/tradeAlertTimeFormat';
interface Props {
item: TradeSignalDisplaySource;
/** compact: 스택 팝업, full: 목록/모달 요약 */
variant?: 'compact' | 'full';
showHeadline?: boolean;
/** list: 라벨·값 세로 목록, matrix: n×n 정보 카드 그리드 */
layout?: 'list' | 'matrix';
}
export const TradeSignalDetailBody: React.FC<Props> = ({
item,
variant = 'compact',
showHeadline = true,
layout = 'list',
}) => {
useTradeAlertTimeFormat();
const isBuy = item.signalType === 'BUY';
const rows = buildSignalDetailRows(item);
return (
<div className={`tsd-body tsd-body--${variant}${layout === 'matrix' ? ' tsd-body--matrix' : ''}`}>
{showHeadline && (
<div className="tsd-headline">
<span className={`tsd-direction ${isBuy ? 'tsd-direction--buy' : 'tsd-direction--sell'}`}>
{isBuy ? '↑' : '↓'} {getSignalTypeKo(item.signalType)}
</span>
<span className="tsd-headline-price">{formatSignalPrice(item.price)}</span>
</div>
)}
{layout !== 'matrix' && (
<p className="tsd-summary">{getSignalHeadline(item)}</p>
)}
{layout === 'matrix' ? (
<div className="tsd-detail-matrix" role="list">
{rows.map(row => (
<div key={row.label} className="tsd-detail-cell" role="listitem">
<span className="tsd-detail-cell-label">{row.label}</span>
<span
className={[
'tsd-detail-cell-value',
row.highlight ? 'tsd-detail-cell-value--highlight' : '',
].filter(Boolean).join(' ')}
>
{row.value}
</span>
</div>
))}
</div>
) : (
<dl className="tsd-detail-grid">
{rows.map(row => (
<React.Fragment key={row.label}>
<dt className="tsd-dt">{row.label}</dt>
<dd className={`tsd-dd${row.highlight ? ' tsd-dd--highlight' : ''}`}>{row.value}</dd>
</React.Fragment>
))}
</dl>
)}
</div>
);
};
export default TradeSignalDetailBody;