web: charts — relecture des valeurs d'indicateurs sur les frames suivantes (calcul paresseux du moteur) pour une légende renseignée sans crosshair
1 changed file +6 −0
modified
hfmarketdata/web/src/pages/charts/ChartView.jsx
+6 −0
@@ -39,6 +39,7 @@ const ChartView = forwardRef(function ChartView({ cs, onChange, prefs, theme, ac | ||
| 39 | 39 | const [hover, setHover] = useState(null) |
| 40 | 40 | const [lastBars, setLastBars] = useState({ last: null, prev: null }) |
| 41 | 41 | const [indValues, setIndValues] = useState({}) |
| 42 | + const refreshTries = useRef(0) | |
| 42 | 43 | const [plotColors, setPlotColors] = useState({}) |
| 43 | 44 | const [name, setName] = useState('') |
| 44 | 45 | const [suggestions, setSuggestions] = useState([]) |
@@ -95,6 +96,11 @@ const ChartView = forwardRef(function ChartView({ cs, onChange, prefs, theme, ac | ||
| 95 | 96 | } |
| 96 | 97 | setIndValues(vals) |
| 97 | 98 | setPlotColors(colors) |
| 99 | + // The engine computes indicators lazily on its next frame: right after setData()/addIndicator() the arrays may | |
| 100 | + // still be empty. Re-read on the following frames (bounded) until every indicator has a value or gives up. | |
| 101 | + const pending = data.length > 0 && Object.values(vals).some(v => Object.keys(v).length === 0 || Object.values(v).every(x => x == null)) | |
| 102 | + if (pending && (refreshTries.current = (refreshTries.current || 0) + 1) <= 5) requestAnimationFrame(() => refreshLastValues()) | |
| 103 | + else refreshTries.current = 0 | |
| 98 | 104 | }, []) |
| 99 | 105 | |
| 100 | 106 | const announce = useCallback(() => { |
| 101 | 107 | |