매매 시그널 알림 화면 수정

This commit is contained in:
Macbook
2026-05-29 00:46:20 +09:00
parent cbad62a5b0
commit e43b5cbd5a
45 changed files with 2186 additions and 415 deletions
@@ -14,6 +14,8 @@ interface Props {
strategyId: number | null;
globalStrategyId: number | null;
onStrategyChange?: (strategyId: number | null) => void;
/** 변경 불가 시 셀렉트 대신 표시할 전략명 (알림 목록 등) */
readOnlyStrategyLabel?: string;
}
/** 카드 하단 — 갱신 시각(좌) · 전략 드롭다운(우) */
@@ -23,29 +25,48 @@ const VirtualTargetCardFoot: React.FC<Props> = ({
strategyId,
globalStrategyId,
onStrategyChange,
}) => (
<div className="vtd-card-foot">
<span className="vtd-card-updated"> {formatUpdatedTime(snapshot?.updatedAt)}</span>
<div className="vtd-card-foot-controls" onClick={e => e.stopPropagation()}>
<label className="vtd-card-foot-field">
<select
className="vtd-card-foot-select"
aria-label="투자전략"
value={targetStrategySelectValue({ strategyId })}
onChange={e => {
onStrategyChange?.(parseTargetStrategySelectValue(e.target.value));
}}
>
<option value={targetStrategySelectValue({ strategyId: null })}>
{defaultStrategyOptionLabel(globalStrategyId, strategies)}
</option>
{strategies.map(s => (
<option key={s.id} value={String(s.id)}>{s.name}</option>
))}
</select>
</label>
readOnlyStrategyLabel,
}) => {
const resolvedName =
readOnlyStrategyLabel?.trim()
|| strategies.find(s => s.id === strategyId)?.name
|| '';
return (
<div className="vtd-card-foot">
<span className="vtd-card-updated"> {formatUpdatedTime(snapshot?.updatedAt)}</span>
<div className="vtd-card-foot-controls" onClick={e => e.stopPropagation()}>
<label className="vtd-card-foot-field">
{readOnlyStrategyLabel != null && !onStrategyChange ? (
<span
className="vtd-card-foot-select vtd-card-foot-select--readonly"
title={resolvedName}
>
{resolvedName || '전략'}
</span>
) : (
<select
className="vtd-card-foot-select"
aria-label="투자전략"
value={targetStrategySelectValue({ strategyId })}
disabled={!onStrategyChange}
title={!onStrategyChange ? resolvedName : undefined}
onChange={e => {
onStrategyChange?.(parseTargetStrategySelectValue(e.target.value));
}}
>
<option value={targetStrategySelectValue({ strategyId: null })}>
{defaultStrategyOptionLabel(globalStrategyId, strategies)}
</option>
{strategies.map(s => (
<option key={s.id} value={String(s.id)}>{s.name}</option>
))}
</select>
)}
</label>
</div>
</div>
</div>
);
);
};
export default VirtualTargetCardFoot;