From 775ecf75bd2679e70b6d70d146d3f0b7343d9e2a Mon Sep 17 00:00:00 2001 From: rufinomec-afk Date: Mon, 8 Jun 2026 11:52:19 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20Aplicar=20s=C3=B3=20dispara=20replay=20b?= =?UTF-8?q?ackend=20quando=20modo/delta/volume/tempo/range=20mudam?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adiciona backendDirty separado de configDirty - stepMultiplier e viewMode só setam configDirty (frontend-only, sem replay) - closeMode, deltaMax, volumeMax, timeSeconds, rangePoints setam backendDirty também - Aplicar chama applyConfig apenas se backendDirty=true, evitando reload desnecessário Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/App.jsx | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 6dbb59e..5eb2b60 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -25,7 +25,8 @@ export default function App() { const [volumeMax, setVolumeMax] = useState(1000); const [timeSeconds, setTimeSeconds] = useState(300); const [rangePoints, setRangePoints] = useState(10); - const [configDirty, setConfigDirty] = useState(false); + const [configDirty, setConfigDirty] = useState(false); // qualquer campo mudou + const [backendDirty, setBackendDirty] = useState(false); // só campos que precisam do backend const [targetSymbol, setTargetSymbol] = useState('EURUSD'); // History Mode @@ -336,7 +337,7 @@ export default function App() { MODO DE FECHAMENTO { setDeltaMax(Math.max(100, Number(e.target.value) || 100)); setConfigDirty(true); }} + onChange={e => { setDeltaMax(Math.max(100, Number(e.target.value) || 100)); setConfigDirty(true); setBackendDirty(true); }} className="flex-1 bg-transparent text-center text-sm font-bold text-white outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" /> - + )} @@ -364,12 +365,12 @@ export default function App() {
VOLUME MÁX
- + { setVolumeMax(Math.max(100, Number(e.target.value) || 100)); setConfigDirty(true); }} + onChange={e => { setVolumeMax(Math.max(100, Number(e.target.value) || 100)); setConfigDirty(true); setBackendDirty(true); }} className="flex-1 bg-transparent text-center text-sm font-bold text-white outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" /> - +
)} @@ -377,12 +378,12 @@ export default function App() {
TEMPO (segundos)
- + { setTimeSeconds(Math.max(10, Number(e.target.value) || 10)); setConfigDirty(true); }} + onChange={e => { setTimeSeconds(Math.max(10, Number(e.target.value) || 10)); setConfigDirty(true); setBackendDirty(true); }} className="flex-1 bg-transparent text-center text-sm font-bold text-white outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" /> - +
)} @@ -390,19 +391,24 @@ export default function App() {
RANGE (pontos)
- + { setRangePoints(Math.max(1, Number(e.target.value) || 1)); setConfigDirty(true); }} + onChange={e => { setRangePoints(Math.max(1, Number(e.target.value) || 1)); setConfigDirty(true); setBackendDirty(true); }} className="flex-1 bg-transparent text-center text-sm font-bold text-white outline-none [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none" /> - +
)} - {/* Apply */} + {/* Apply — só chama backend se campos do backend mudaram */}