알림목록 지표없음 문제 수정

This commit is contained in:
Macbook
2026-06-08 01:23:49 +09:00
parent 7055748b34
commit 0229799383
8 changed files with 166 additions and 39 deletions
@@ -11,7 +11,9 @@ import {
loadStrategy,
runBacktest,
type PaperSummaryDto,
type StrategyDto,
} from '../utils/backendApi';
import { prefetchNotificationStrategies } from '../utils/resolveNotificationStrategy';
import { loadAnalysisCandles } from '../utils/analysisChartData';
import { buildChartBacktestReportModel } from '../utils/backtestReportModel';
import { candleTypeToTimeframe } from '../utils/strategyToChartIndicators';
@@ -145,6 +147,7 @@ export const TradeNotificationListPage: React.FC<Props> = ({
const [gridPreset, setGridPreset] = useState<TradeNotificationGridPresetId>(
() => loadTradeNotificationGridPreset(),
);
const [strategies, setStrategies] = useState<StrategyDto[]>([]);
const [selectedMarket, setSelectedMarket] = useState(defaultMarket);
const [selectedId, setSelectedId] = useState<string | null>(null);
const [reportOpen, setReportOpen] = useState(false);
@@ -177,6 +180,14 @@ export const TradeNotificationListPage: React.FC<Props> = ({
void refreshPaperData();
}, [refreshPaperData]);
useEffect(() => {
let cancelled = false;
void prefetchNotificationStrategies().then(list => {
if (!cancelled) setStrategies(list);
});
return () => { cancelled = true; };
}, []);
const tradePrice = useMemo(
() => coerceFiniteNumber(tickers?.get(selectedMarket)?.tradePrice),
[tickers, selectedMarket],
@@ -433,6 +444,7 @@ export const TradeNotificationListPage: React.FC<Props> = ({
theme={theme}
layoutMode={listLayout}
itemTag="div"
prefetchedStrategies={strategies}
isSelected={selectedId === item.id}
chartsEnabled={isListView}
chartLiveReceiveHighlight={chartLiveReceiveHighlight}
@@ -465,6 +477,7 @@ export const TradeNotificationListPage: React.FC<Props> = ({
handleReportFromAlert,
reportLoadingId,
tickers,
strategies,
]);
return (
@@ -7,7 +7,7 @@ import type { TickerData } from '../../hooks/useMarketTicker';
import { useLiveReceiveFlash } from '../../hooks/useLiveReceiveFlash';
import { useTradeNotificationSignalSnapshot } from '../../hooks/useTradeNotificationSignalSnapshot';
import type { StrategyDto } from '../../utils/backendApi';
import { isStrategyMissingOnServer, loadStrategies, loadStrategy } from '../../utils/backendApi';
import { resolveNotificationStrategy } from '../../utils/resolveNotificationStrategy';
import type { TradeNotificationItem } from '../../contexts/TradeNotificationContext';
import {
buildSignalDetailRows,
@@ -68,6 +68,8 @@ interface Props {
reportLoading?: boolean;
/** 가상 스크롤 목록에서는 div + role=listitem */
itemTag?: 'li' | 'div';
/** 목록 화면에서 선로드한 전략 목록 (ID·이름 fallback) */
prefetchedStrategies?: StrategyDto[];
}
const MAX_INDICATOR_CARDS = 8;
@@ -88,6 +90,7 @@ const TradeNotificationListRow: React.FC<Props> = ({
onReport,
reportLoading = false,
itemTag = 'li',
prefetchedStrategies = [],
}) => {
useTradeAlertTimeFormat();
const isBuy = item.signalType === 'BUY';
@@ -137,17 +140,20 @@ const TradeNotificationListRow: React.FC<Props> = ({
return;
}
let cancelled = false;
void loadStrategies().then(list => {
if (!cancelled) setStrategies(list ?? []);
});
if (!item.strategyId || isStrategyMissingOnServer(item.strategyId)) {
setStrategies(prefetchedStrategies);
if (!item.strategyId && !item.strategyName?.trim()) {
return () => { cancelled = true; };
}
void loadStrategy(item.strategyId).then(s => {
void resolveNotificationStrategy(
item.strategyId,
item.strategyName,
prefetchedStrategies,
).then(({ strategy: s, strategyId: sid }) => {
if (!cancelled && s) setStrategy(s);
else if (!cancelled && !s && sid == null) setStrategy(undefined);
});
return () => { cancelled = true; };
}, [item.strategyId, panelActive, isListLayout]);
}, [item.strategyId, item.strategyName, panelActive, isListLayout, prefetchedStrategies]);
useEffect(() => {
setExpandedChartKey(null);
@@ -181,7 +187,9 @@ const TradeNotificationListRow: React.FC<Props> = ({
item.market,
item.strategyId,
strategy,
item.strategyName,
signalSnapshotEnabled,
prefetchedStrategies,
);
const [chartActivitySeq, setChartActivitySeq] = useState(0);
@@ -52,7 +52,9 @@ const TradeNotificationSignalSummary: React.FC<Props> = ({
market,
strategyId,
strategy,
strategyLabel,
active && snapshotProp === undefined,
strategies,
);
const snapshot = snapshotProp ?? internal.snapshot;
const loading = signalLoadingProp ?? internal.loading;