diff --git a/manual_trading_hub/static/chart.js b/manual_trading_hub/static/chart.js index 27618b0..bbe943a 100644 --- a/manual_trading_hub/static/chart.js +++ b/manual_trading_hub/static/chart.js @@ -178,6 +178,7 @@ let chartRangeUserLocked = false; let chartRangeLockTimer = null; let suppressRangeUserLock = false; + let pendingViewportEpoch = -1; let priceTagTimer = null; let tfDigitBuf = ""; let tfDigitTimer = null; @@ -2032,6 +2033,7 @@ } function markChartRangeUserAdjusted() { + pendingViewportEpoch = -1; chartRangeUserLocked = true; if (chartRangeLockTimer) clearTimeout(chartRangeLockTimer); chartRangeLockTimer = setTimeout(function () { @@ -2248,16 +2250,27 @@ applyChartPriceFormat(); } } + const keepViewport = + pendingViewportEpoch !== chartViewEpoch && + savedRange && + isVisibleRangeValidForCandles(savedRange, candleCountBefore); applyCandlesToChart( mergeCandles(lastCandles, alignCandlesToTick(data.candles), { prepend: false }), 0, - { preserveRange: true, skipAutoScale: chartRangeUserLocked } + { + preserveRange: !!keepViewport, + skipAutoScale: chartRangeUserLocked, + } ); if (epochAtStart !== chartViewEpoch) return; const n = lastCandles.length; - if (!restoreVisibleLogicalRange(savedRange, n)) { + if (pendingViewportEpoch === chartViewEpoch) { + applyDefaultVisibleRange(); + } else if (savedRange && isVisibleRangeValidForCandles(savedRange, n)) { + restoreVisibleLogicalRange(savedRange, n); + } else if (!chartRangeUserLocked) { const curRange = chart && chart.timeScale().getVisibleLogicalRange(); - if (!chartRangeUserLocked && curRange && !isVisibleRangeValidForCandles(curRange, n)) { + if (!curRange || !isVisibleRangeValidForCandles(curRange, n)) { restoreVisibleLogicalRange(tailVisibleLogicalRange(n), n); } } @@ -2512,6 +2525,7 @@ chartDataLoading = true; if (resetView) { chartViewEpoch += 1; + pendingViewportEpoch = chartViewEpoch; chartRangeUserLocked = false; if (chartRangeLockTimer) { clearTimeout(chartRangeLockTimer);