검증게시판 단계 추가

This commit is contained in:
Macbook
2026-05-28 16:24:14 +09:00
parent f64dc1e983
commit 7e3644cb62
375 changed files with 4539 additions and 251294 deletions
@@ -0,0 +1,86 @@
/**
* ui_preferences.virtual.targets 가 비었을 때 서버·레거시에서 투자대상 복구
*/
import { loadActiveLiveStrategySettings, loadWatchlist } from './backendApi';
import {
loadVirtualSession,
loadVirtualTargets,
type VirtualTargetItem,
} from './virtualTradingStorage';
import { resolveVirtualTargetNames } from './virtualTargetNames';
function readLegacyTargets(): VirtualTargetItem[] {
try {
const raw = localStorage.getItem('gc_virtual_targets_v1');
if (!raw) return [];
const parsed = JSON.parse(raw) as VirtualTargetItem[];
return Array.isArray(parsed) ? parsed : [];
} catch {
return [];
}
}
function fromLiveSettings(
list: Awaited<ReturnType<typeof loadActiveLiveStrategySettings>>,
globalStrategyId: number | null,
): VirtualTargetItem[] {
return list.map(s => {
const { koreanName, englishName } = resolveVirtualTargetNames(s.market);
return {
market: s.market,
strategyId: s.strategyId ?? globalStrategyId,
candleType: s.candleType,
koreanName,
englishName,
pinned: !!s.isPinned,
};
});
}
function fromWatchlist(
list: Awaited<ReturnType<typeof loadWatchlist>>,
globalStrategyId: number | null,
): VirtualTargetItem[] {
return list.map(w => {
const market = w.symbol;
const { koreanName, englishName } = resolveVirtualTargetNames(
market,
w.koreanName,
w.englishName,
);
return {
market,
strategyId: globalStrategyId,
koreanName,
englishName,
};
});
}
/** DB·로컬 비어 있을 때 서버 실시간 설정·관심종목에서 목록 구성 */
export async function hydrateVirtualTargetsIfEmpty(): Promise<VirtualTargetItem[]> {
const existing = loadVirtualTargets();
if (existing.length > 0) return existing;
const legacy = readLegacyTargets();
if (legacy.length > 0) return legacy;
const session = loadVirtualSession();
const globalId = session.globalStrategyId;
try {
const active = await loadActiveLiveStrategySettings();
if (active.length > 0) return fromLiveSettings(active, globalId);
} catch (e) {
console.warn('[virtualTargets] active live settings load failed', e);
}
try {
const watchlist = await loadWatchlist();
if (watchlist.length > 0) return fromWatchlist(watchlist, globalId);
} catch (e) {
console.warn('[virtualTargets] watchlist load failed', e);
}
return [];
}