From 57531c9f21eeaefe47e0e50dfce6078b7b1ce298 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 18:17:28 +0300 Subject: [PATCH] =?UTF-8?q?fix(mera/v2):=20debounce-=D1=82=D0=B0=D0=B9?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=20=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=B0=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D1=87=D0=B8=D1=81=D1=82=D0=B8=D0=BB=D1=81=D1=8F?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D0=B7=D0=BC=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Таймер из onAddressChange (200 мс) переживал unmount и дёргал setState уже мёртвого компонента. В CI это валило frontend-checks у PR #3226 как unhandled `ReferenceError: window is not defined` — новый тест ParamsPanel.floors печатает адрес и завершается раньше, чем таймер срабатывает, и тот стрелял после teardown jsdom. Ассерты при этом были зелёные, падал сам прогон. --- .../src/components/trade-in/v2/ParamsPanel.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tradein-mvp/frontend/src/components/trade-in/v2/ParamsPanel.tsx b/tradein-mvp/frontend/src/components/trade-in/v2/ParamsPanel.tsx index 754a3688..aef80107 100644 --- a/tradein-mvp/frontend/src/components/trade-in/v2/ParamsPanel.tsx +++ b/tradein-mvp/frontend/src/components/trade-in/v2/ParamsPanel.tsx @@ -758,6 +758,17 @@ export default function ParamsPanel({ initialValues?.target_fias_id ?? null, ); const debounceRef = useRef | null>(null); + + // Debounce-таймер адреса переживал размонтирование панели: набранный текст + // ставит таймер на 200 мс, и если панель закрыть раньше, он дёргает setState + // уже мёртвого компонента. В тестах это падает как unhandled + // `ReferenceError: window is not defined` после teardown окружения (#3226). + useEffect( + () => () => { + if (debounceRef.current) clearTimeout(debounceRef.current); + }, + [], + ); // БАЛКОН radiogroup focus targets (roving tabindex). const balNoRef = useRef(null); const balYesRef = useRef(null);