(low) WeightProfilePanel.tsx / handleSliderChange: дебаунс-таймер дублирует немедленный setDraft и не чистится при unmount #1452

Closed
opened 2026-06-15 05:55:50 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: frontend · Файл: frontend/src/components/site-finder/WeightProfilePanel.tsx:103-111

WeightProfilePanel.tsx:103-111. handleSliderChange ставит setTimeout(()=>setDraft(...),300) (106-108) с тем же value, и сразу setDraft с тем же value (110). Немедленный set делает дебаунс бессмысленным (отдельного display-state нет, draft = то что рендерится). debounceRef очищается только на строке 105 при следующем onChange; useEffect cleanup отсутствует (подтверждено grep). Импакт: лишний/мёртвый код + латентный no-op set-state при unmount в окне 300мс (в React 18+ без warning/утечки). Фикс: убрать setTimeout-блок (оставить только немедленный setDraft) либо добавить useEffect-cleanup с clearTimeout. Severity low: видимого дефекта поведения нет.

Почему баг: 1) Дебаунс не работает — комментарий обещает «no debounce for the display value input itself», но отдельного display-state нет: draft и есть то, что рендерит ползунок и уходит в onWeightsChange, поэтому setTimeout не отсрочивает ничего, а лишь дублирует запись. 2) debounceRef никогда не очищается при размонтировании панели (нет useEffect cleanup), а очищается только при следующем onChange того же инстанса. Если пользователь двинул ползунок и закрыл/перемонтировал панель в пределах 300мс — таймер выстрелит setDraft на размонтированном компоненте (React warning, в строгих сборках — утечка). По сути это либо лишний код, либо латентная гонка стейта.

Как чинить: Либо убрать setTimeout полностью (обновлять draft синхронно), либо реально дебаунсить: оставить немедленный set только для отдельного display-стейта, а debounced — для draft, и очищать таймер в useEffect(()=>()=>clearTimeout(debounceRef.current),[]).


deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U93

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/components/site-finder/WeightProfilePanel.tsx:103-111` WeightProfilePanel.tsx:103-111. handleSliderChange ставит setTimeout(()=>setDraft(...),300) (106-108) с тем же value, и сразу setDraft с тем же value (110). Немедленный set делает дебаунс бессмысленным (отдельного display-state нет, draft = то что рендерится). debounceRef очищается только на строке 105 при следующем onChange; useEffect cleanup отсутствует (подтверждено grep). Импакт: лишний/мёртвый код + латентный no-op set-state при unmount в окне 300мс (в React 18+ без warning/утечки). Фикс: убрать setTimeout-блок (оставить только немедленный setDraft) либо добавить useEffect-cleanup с clearTimeout. Severity low: видимого дефекта поведения нет. **Почему баг:** 1) Дебаунс не работает — комментарий обещает «no debounce for the display value input itself», но отдельного display-state нет: draft и есть то, что рендерит ползунок и уходит в onWeightsChange, поэтому setTimeout не отсрочивает ничего, а лишь дублирует запись. 2) debounceRef никогда не очищается при размонтировании панели (нет useEffect cleanup), а очищается только при следующем onChange того же инстанса. Если пользователь двинул ползунок и закрыл/перемонтировал панель в пределах 300мс — таймер выстрелит setDraft на размонтированном компоненте (React warning, в строгих сборках — утечка). По сути это либо лишний код, либо латентная гонка стейта. **Как чинить:** Либо убрать setTimeout полностью (обновлять draft синхронно), либо реально дебаунсить: оставить немедленный set только для отдельного display-стейта, а debounced — для draft, и очищать таймер в useEffect(()=>()=>clearTimeout(debounceRef.current),[]). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U93</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:50 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:07 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1452
No description provided.