From 641a9a64f8b337587b609d9a55d85c834737f298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Fri, 15 May 2026 16:40:33 +0000 Subject: [PATCH] =?UTF-8?q?fix(reviews):=20reset=20drawer=20state=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=B4=D0=B0=20reviewer=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=D0=B5=D1=82=20draft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ordinis-admin-ui/src/routes/reviews.tsx | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/ordinis-admin-ui/src/routes/reviews.tsx b/ordinis-admin-ui/src/routes/reviews.tsx index 5d9b25d..3699518 100644 --- a/ordinis-admin-ui/src/routes/reviews.tsx +++ b/ordinis-admin-ui/src/routes/reviews.tsx @@ -1,4 +1,4 @@ -import { useMemo, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { createFileRoute, Link } from '@tanstack/react-router' import { useTranslation } from 'react-i18next' import { @@ -631,6 +631,25 @@ function ReviewDrawer({ draftId, onClose }: DrawerProps) { * feedback теряется. */ const [decisionFlash, setDecisionFlash] = useState<'approve' | 'reject' | null>(null) + // Reset state когда reviewer переключается на другой draft без закрытия + // drawer'а (click row → open new draft в already-open drawer). Раньше + // {comment, rejectError} оставались от previous draft, и mutation .error + // объекты от approveMut/rejectMut/withdrawMut held conflict banners + // ('реверсное состояние draft', '409', etc.) из predыдущей попытки — + // показывались на форме нового draft (observed bug). + useEffect(() => { + setComment('') + setRejectError(null) + setDecisionFlash(null) + approveMut.reset() + rejectMut.reset() + withdrawMut.reset() + // approveMut/rejectMut/withdrawMut references stable между renders + // (TanStack mutation hook), но lint требует exhaustive deps. .reset + // — stable function, безопасно включить. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [draftId]) + // Identity gates — определяют что показать в footer'е drawer'а. // // 1. `isPending` = false: terminal draft (APPROVED/REJECTED/WITHDRAWN).