/** * 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>, globalStrategyId: number | null, ): VirtualTargetItem[] { return list.map(s => { const { koreanName, englishName } = resolveVirtualTargetNames(s.market); return { market: s.market, strategyId: s.strategyId ?? globalStrategyId, koreanName, englishName, pinned: !!s.isPinned, }; }); } function fromWatchlist( list: Awaited>, 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 { 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 []; }