From 7c523b93d10fe47a06408d336d8bb6bcadf6cb8d Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 27 Oct 2026 22:24:39 +0400 Subject: [PATCH] =?UTF-8?q?fix(web):=20=D1=81=D0=B2=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=B0,=20=D0=B4=D0=BE=D0=B3=D1=80=D1=83=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D0=BF=D1=80=D0=B8=20=D1=83=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=20=D1=81=20=D0=9E=D0=A1=D0=92,=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=B5=D1=88=D0=B8=D1=80=D1=83=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?(M-9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сводка живёт только в состоянии ожидающего перехода; при summary=null запрашивается заново. Co-Authored-By: Claude Opus 5.5 --- web/src/widgets/ConsolidatedOsv/OsvTabs.tsx | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx b/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx index b9265bd..5387a01 100644 --- a/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx +++ b/web/src/widgets/ConsolidatedOsv/OsvTabs.tsx @@ -70,7 +70,8 @@ export function OsvTabs({ summary, versionId, status }: Props) { const navigate = useNavigate(); const location = useLocation(); const { tab } = useParams<{ tab?: string }>(); - const [pending, setPending] = useState(null); + // переход, ожидающий решения в модалке; сводка — та, по которой модалка показана (только на время модалки) + const [pending, setPending] = useState<{ key: string; summary: OsvSummaryOut | null } | null>(null); const activeKey = tab || 'osv'; @@ -79,12 +80,7 @@ export function OsvTabs({ summary, versionId, status }: Props) { navigate(to, options); }; - // сводка, догруженная при уходе, пока страница её не передала (или запрос страницы упал); привязана к версии - const [fetched, setFetched] = useState<{ versionId: string; summary: OsvSummaryOut } | null>(null); const [checking, setChecking] = useState(false); - const fetchedSummary = fetched?.versionId === versionId ? fetched.summary : null; - const known = summary ?? fetchedSummary; - const shownPairs = known?.counter_pairs ?? []; // актуальные версия и признак «компонент жив» — ответ запроса, пришедший после смены версии/размонтирования, игнорируется const liveRef = useRef({ versionId, mounted: true }); @@ -104,7 +100,7 @@ export function OsvTabs({ summary, versionId, status }: Props) { return; } const storage = safeSessionStorage(); - let found: OsvSummaryOut | null = known; + let found: OsvSummaryOut | null = summary; let decision: 'warn' | 'go' | 'perform' = decideOsvLeave({ summary: found, versionId, status, storage }); if (decision === 'perform') { setChecking(true); @@ -118,13 +114,12 @@ export function OsvTabs({ summary, versionId, status }: Props) { if (!liveRef.current.mounted) return; setChecking(false); if (liveRef.current.versionId !== requestedFor) return; - if (result) setFetched({ versionId: requestedFor, summary: result }); found = result; decision = resolveLeaveAfterFetch({ summary: result, versionId, status, storage }); } if (decision === 'warn' && found) { rememberCounterPairsShown(versionId, found.counter_pairs, storage); - setPending(newKey); + setPending({ key: newKey, summary: found }); } else { go(newKey); } @@ -162,8 +157,8 @@ export function OsvTabs({ summary, versionId, status }: Props) { /> { setPending(null); navigate( @@ -173,7 +168,7 @@ export function OsvTabs({ summary, versionId, status }: Props) { }} onStay={() => setPending(null)} onGo={() => { - const next = pending; + const next = pending?.key; setPending(null); if (next) go(next); }}