diff --git a/frontend/src/components/CaseForm/CaseForm.jsx b/frontend/src/components/CaseForm/CaseForm.jsx index 59804b3..aa3fdac 100644 --- a/frontend/src/components/CaseForm/CaseForm.jsx +++ b/frontend/src/components/CaseForm/CaseForm.jsx @@ -1,4 +1,5 @@ import React, { useState } from "react"; +import { useNavigate } from "react-router-dom"; import Step1Child from "./Step1Child"; import Step2Health from "./Step2Health"; import Step2bPsychotype from "./Step2bPsychotype"; @@ -16,6 +17,7 @@ const INITIAL_DATA = { }; const CaseForm = ({ isMobile = false }) => { + const navigate = useNavigate(); const [currentStep, setCurrentStep] = useState(1); const [formData, setFormData] = useState(INITIAL_DATA); const [errors, setErrors] = useState([]); @@ -116,10 +118,11 @@ const CaseForm = ({ isMobile = false }) => { } const result = await response.json(); - - // Перенаправляем на страницу анализа с ID карточки - window.location.href = `/analysis/${result.id}`; - + + // Перенаправляем на страницу анализа с ID карточки. + // SPA-переход: полная перезагрузка теряла состояние приложения. + navigate(`/analysis/${result.id}`); + } catch (err) { setErrors([err.message || "Ошибка при отправке данных"]); } finally { diff --git a/frontend/src/pages/AdminDashboard.jsx b/frontend/src/pages/AdminDashboard.jsx index 575df84..7ffbc50 100644 --- a/frontend/src/pages/AdminDashboard.jsx +++ b/frontend/src/pages/AdminDashboard.jsx @@ -76,11 +76,16 @@ function AdminDashboard() { throw new Error(`Не удалось загрузить список кейсов (${response.status})`); } const payload = await response.json(); - setCases(payload.items || []); + const items = payload.items || []; + setCases(items); setTotal(payload.total || 0); - if ((payload.items || []).length && !selectedCaseId) { - setSelectedCaseId(payload.items[0].id); - setEditForm(payload.items[0]); + // Auto-select the first row only when nothing is selected yet. + // Functional update so this effect does not have to read (and depend + // on) selectedCaseId — depending on it caused a second fetch on first + // render and after every filter reset. editForm is kept in sync by the + // selectedCase effect below. + if (items.length) { + setSelectedCaseId((current) => current || items[0].id); } } catch (err) { if (err.name !== 'AbortError') { @@ -93,7 +98,7 @@ function AdminDashboard() { loadCases(); return () => controller.abort(); - }, [filters.ageMax, filters.ageMin, filters.status, page, selectedCaseId]); + }, [filters.ageMax, filters.ageMin, filters.status, page]); useEffect(() => { const controller = new AbortController();