From c166a4478a2493658abc4d83a968a0cf7806a418 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Tue, 10 Jun 2025 21:28:21 +0300 Subject: [PATCH] B: Do not change state in render --- .../oss/pages/oss-page/editor-oss-card/form-oss.tsx | 12 +++++++----- .../editor-constituenta/form-constituenta.tsx | 12 +++++++----- .../rsform-page/editor-rsform-card/form-rsform.tsx | 12 +++++++----- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-card/form-oss.tsx b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-card/form-oss.tsx index f3693f0f..776f45ab 100644 --- a/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-card/form-oss.tsx +++ b/rsconcept/frontend/src/features/oss/pages/oss-page/editor-oss-card/form-oss.tsx @@ -1,7 +1,7 @@ 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use client'; -import { useRef } from 'react'; +import { useEffect, useRef } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -47,10 +47,12 @@ export function FormOSS() { const readOnly = useWatch({ control, name: 'read_only' }); const prevDirty = useRef(isDirty); - if (prevDirty.current !== isDirty) { - prevDirty.current = isDirty; - setIsModified(isDirty); - } + useEffect(() => { + if (prevDirty.current !== isDirty) { + prevDirty.current = isDirty; + setIsModified(isDirty); + } + }, [isDirty, setIsModified]); function onSubmit(data: IUpdateLibraryItemDTO) { return updateOss(data).then(() => reset({ ...data })); diff --git a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/form-constituenta.tsx b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/form-constituenta.tsx index 52704d9b..0a61e7df 100644 --- a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/form-constituenta.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-constituenta/form-constituenta.tsx @@ -1,7 +1,7 @@ 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use client'; -import { useMemo, useRef, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { toast } from 'react-toastify'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -121,10 +121,12 @@ export function FormConstituenta({ disabled, id, toggleReset, schema, activeCst, } const prevDirty = useRef(isDirty); - if (prevDirty.current !== isDirty) { - prevDirty.current = isDirty; - setIsModified(isDirty); - } + useEffect(() => { + if (prevDirty.current !== isDirty) { + prevDirty.current = isDirty; + setIsModified(isDirty); + } + }, [isDirty, setIsModified]); function onSubmit(data: IUpdateConstituentaDTO) { return cstUpdate({ itemID: schema.id, data }).then(() => { diff --git a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsform-card/form-rsform.tsx b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsform-card/form-rsform.tsx index 7d93d79b..dad0b9be 100644 --- a/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsform-card/form-rsform.tsx +++ b/rsconcept/frontend/src/features/rsform/pages/rsform-page/editor-rsform-card/form-rsform.tsx @@ -1,7 +1,7 @@ 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use client'; -import { useRef } from 'react'; +import { useEffect, useRef } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; @@ -70,10 +70,12 @@ export function FormRSForm() { } const prevDirty = useRef(isDirty); - if (prevDirty.current !== isDirty) { - prevDirty.current = isDirty; - setIsModified(isDirty); - } + useEffect(() => { + if (prevDirty.current !== isDirty) { + prevDirty.current = isDirty; + setIsModified(isDirty); + } + }, [isDirty, setIsModified]); function handleSelectVersion(version: CurrentVersion) { router.push({ path: urls.schema(schema.id, version === 'latest' ? undefined : version) });