(low) ConceptExportButtons: error/serverLoading не сбрасываются при смене variant — стейл-сообщение/disabled под чужой вкладкой #1443

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

Severity: low · Категория: frontend · Файл: frontend/src/components/concept/ConceptExportButtons.tsx:74-133

ConceptVariantsResult.tsx:287 рендерит VariantPanel без key, и внутри (стр.177) тоже без key — при переключении вкладок меняется только prop variant, экземпляр не размонтируется. ConceptExportButtons.tsx:75-78 держит локальный useState serverLoading и error, и нигде не сбрасывает их при изменении prop variant (нет useEffect на [variant]). Сценарий: на варианте A пользователь жмёт DXF/PDF, получает 404/405 → setError('Экспорт ... появится после публикации движка', стр.111-117) или сетевую ошибку (стр.129); затем переключает вкладку на вариант B — error остаётся в state и продолжает рендериться (стр.200-207) под кнопками экспорта другого варианта. Аналогично in-flight serverLoading != null дизейблит кнопки чужого варианта. Импакт: косметический/UX — вводящее в заблуждение сообщение под не тем вариантом. Фикс: useEffect(() => { setError(null); setServerLoading(null); }, [variant.strategy]) либо передать key={variant.strategy} в ConceptExportButtons/VariantPanel для remount при смене вкладки.

Почему баг: Сценарий: на варианте A пользователь жмёт DXF/PDF, получает 404/405 → setError('Экспорт ... появится после публикации движка') (стр.111-117) или сетевую ошибку. Затем переключает вкладку на вариант B. VariantPanel в ConceptVariantsResult.tsx:287 рендерится по позиции без key, ConceptExportButtons остаётся тем же экземпляром, props.variant сменился, но error остаётся в state и продолжает отображаться (стр.200-207) уже под кнопками экспорта другого варианта. Аналогично, если запрос для A ещё in-flight (serverLoading != null), кнопки экспорта B будут disabled, хотя относятся к другому варианту. Никакой сброс error/serverLoading на смену variant не делается.

Как чинить: Сбрасывать состояние при смене variant: либо передавать key={variant.strategy} на ConceptExportButtons (или на VariantPanel) в ConceptVariantsResult, либо useEffect(() => { setError(null); }, [variant.strategy]).


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

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/components/concept/ConceptExportButtons.tsx:74-133` ConceptVariantsResult.tsx:287 рендерит VariantPanel без key, и внутри (стр.177) <ConceptExportButtons variant={variant} /> тоже без key — при переключении вкладок меняется только prop variant, экземпляр не размонтируется. ConceptExportButtons.tsx:75-78 держит локальный useState serverLoading и error, и нигде не сбрасывает их при изменении prop variant (нет useEffect на [variant]). Сценарий: на варианте A пользователь жмёт DXF/PDF, получает 404/405 → setError('Экспорт ... появится после публикации движка', стр.111-117) или сетевую ошибку (стр.129); затем переключает вкладку на вариант B — error остаётся в state и продолжает рендериться (стр.200-207) под кнопками экспорта другого варианта. Аналогично in-flight serverLoading != null дизейблит кнопки чужого варианта. Импакт: косметический/UX — вводящее в заблуждение сообщение под не тем вариантом. Фикс: useEffect(() => { setError(null); setServerLoading(null); }, [variant.strategy]) либо передать key={variant.strategy} в ConceptExportButtons/VariantPanel для remount при смене вкладки. **Почему баг:** Сценарий: на варианте A пользователь жмёт DXF/PDF, получает 404/405 → setError('Экспорт ... появится после публикации движка') (стр.111-117) или сетевую ошибку. Затем переключает вкладку на вариант B. VariantPanel в ConceptVariantsResult.tsx:287 рендерится по позиции без key, ConceptExportButtons остаётся тем же экземпляром, props.variant сменился, но error остаётся в state и продолжает отображаться (стр.200-207) уже под кнопками экспорта другого варианта. Аналогично, если запрос для A ещё in-flight (serverLoading != null), кнопки экспорта B будут disabled, хотя относятся к другому варианту. Никакой сброс error/serverLoading на смену variant не делается. **Как чинить:** Сбрасывать состояние при смене variant: либо передавать key={variant.strategy} на ConceptExportButtons (или на VariantPanel) в ConceptVariantsResult, либо useEffect(() => { setError(null); }, [variant.strategy]). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U90</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:40 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:05 +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#1443
No description provided.