diff --git a/frontend/src/chart/useChartWorkspace.ts b/frontend/src/chart/useChartWorkspace.ts index 4da94ea..c2143c9 100644 --- a/frontend/src/chart/useChartWorkspace.ts +++ b/frontend/src/chart/useChartWorkspace.ts @@ -1219,6 +1219,14 @@ export function useChartWorkspace({ setSingleChartPaintReady(false); }, [symbol, timeframe]); + /** 타이틀바 refresh — 실시간 틱·paint 게이트 초기화 (symbol 전환과 동일) */ + useLayoutEffect(() => { + if (chartRefreshToken === 0) return; + chartLiveReadyRef.current = false; + pendingRealtimeBarRef.current = null; + setSingleChartPaintReady(false); + }, [chartRefreshToken]); + useEffect(() => { slotPaintReadyRef.current = {}; setSlotPaintEpoch(v => v + 1); diff --git a/frontend/src/components/TradingChart.tsx b/frontend/src/components/TradingChart.tsx index ba709ca..b5948ad 100644 --- a/frontend/src/components/TradingChart.tsx +++ b/frontend/src/components/TradingChart.tsx @@ -407,7 +407,14 @@ const TradingChart: React.FC = ({ }, [chartVisible]); useEffect(() => { - if (dataLoading) setChartPaintReady(false); + if (!dataLoading) return; + setChartPaintReady(false); + // refresh 후 동일 barsKey면 reloadAll이 스킵되어 paint가 영구 false — 키 초기화 + prevBarsKey.current = ''; + prevIndKey.current = ''; + reloadGenRef.current += 1; + reloadInFlightRef.current = false; + reloadCoalesceRef.current = false; }, [dataLoading]); useEffect(() => {