feat(stock): 미리보기 결과 세션 히스토리 + 결과 비교 컬럼
- useScreenerRun: 실행 시마다 previewHistory에 누적 (최대 10, 메모리만 — 새로고침 시 사라짐, DB 부하 없음). top_ticker/score 요약 포함. - RunHistoryList: '이번 세션 미리보기'와 '저장된 실행' 두 섹션으로 분리. 미리보기 항목은 클릭으로 결과 표 로드 + '비교' 버튼으로 비교 대상 지정. - ResultTable: compareWith prop으로 비교 모드. 순위Δ(▲▼NEW)·점수Δ 컬럼 추가, 이번엔 빠진 종목은 'OUT'으로 별도 섹션에 회색 표시. - 헤더에 'vs HH:MM:SS (통과 X)' 라벨로 비교 대상 명시.
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
import { useState } from 'react';
|
||||
import { runScreener } from '../../../../api';
|
||||
|
||||
const MAX_PREVIEW_HISTORY = 10;
|
||||
|
||||
export function useScreenerRun() {
|
||||
const [result, setResult] = useState(null);
|
||||
const [running, setRunning] = useState(false);
|
||||
// 미리보기 결과를 세션 메모리에 누적 (새로고침 시 사라짐 — DB 부하 없음)
|
||||
const [previewHistory, setPreviewHistory] = useState([]);
|
||||
|
||||
async function call(mode, settings) {
|
||||
setRunning(true);
|
||||
@@ -17,15 +21,34 @@ export function useScreenerRun() {
|
||||
};
|
||||
const r = await runScreener(body);
|
||||
setResult(r);
|
||||
const stamp = new Date().toISOString();
|
||||
const item = {
|
||||
id: `${mode}-${stamp}`,
|
||||
mode,
|
||||
timestamp: stamp,
|
||||
asof: r?.asof,
|
||||
survivors_count: r?.survivors_count,
|
||||
top_ticker: r?.results?.[0]?.ticker,
|
||||
top_name: r?.results?.[0]?.name,
|
||||
top_score: r?.results?.[0]?.total_score,
|
||||
result: r,
|
||||
};
|
||||
setPreviewHistory((prev) => [item, ...prev].slice(0, MAX_PREVIEW_HISTORY));
|
||||
return r;
|
||||
} finally {
|
||||
setRunning(false);
|
||||
}
|
||||
}
|
||||
|
||||
function selectPreview(id) {
|
||||
const item = previewHistory.find((p) => p.id === id);
|
||||
if (item) setResult(item.result);
|
||||
}
|
||||
|
||||
return {
|
||||
result, running,
|
||||
result, running, previewHistory,
|
||||
runPreview: (s) => call('preview', s),
|
||||
runSave: (s) => call('manual_save', s),
|
||||
selectPreview,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user