B: Do not change state in render

This commit is contained in:
Ivan 2025-06-10 21:28:21 +03:00
parent 5dcaae4f51
commit c166a4478a
3 changed files with 21 additions and 15 deletions

View File

@ -1,7 +1,7 @@
'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler
'use client'; 'use client';
import { useRef } from 'react'; import { useEffect, useRef } from 'react';
import { useForm, useWatch } from 'react-hook-form'; import { useForm, useWatch } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
@ -47,10 +47,12 @@ export function FormOSS() {
const readOnly = useWatch({ control, name: 'read_only' }); const readOnly = useWatch({ control, name: 'read_only' });
const prevDirty = useRef(isDirty); const prevDirty = useRef(isDirty);
useEffect(() => {
if (prevDirty.current !== isDirty) { if (prevDirty.current !== isDirty) {
prevDirty.current = isDirty; prevDirty.current = isDirty;
setIsModified(isDirty); setIsModified(isDirty);
} }
}, [isDirty, setIsModified]);
function onSubmit(data: IUpdateLibraryItemDTO) { function onSubmit(data: IUpdateLibraryItemDTO) {
return updateOss(data).then(() => reset({ ...data })); return updateOss(data).then(() => reset({ ...data }));

View File

@ -1,7 +1,7 @@
'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler
'use client'; 'use client';
import { useMemo, useRef, useState } from 'react'; import { useEffect, useMemo, useRef, useState } from 'react';
import { Controller, useForm } from 'react-hook-form'; import { Controller, useForm } from 'react-hook-form';
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
@ -121,10 +121,12 @@ export function FormConstituenta({ disabled, id, toggleReset, schema, activeCst,
} }
const prevDirty = useRef(isDirty); const prevDirty = useRef(isDirty);
useEffect(() => {
if (prevDirty.current !== isDirty) { if (prevDirty.current !== isDirty) {
prevDirty.current = isDirty; prevDirty.current = isDirty;
setIsModified(isDirty); setIsModified(isDirty);
} }
}, [isDirty, setIsModified]);
function onSubmit(data: IUpdateConstituentaDTO) { function onSubmit(data: IUpdateConstituentaDTO) {
return cstUpdate({ itemID: schema.id, data }).then(() => { return cstUpdate({ itemID: schema.id, data }).then(() => {

View File

@ -1,7 +1,7 @@
'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use no memo'; // TODO: remove when react hook forms are compliant with react compiler
'use client'; 'use client';
import { useRef } from 'react'; import { useEffect, useRef } from 'react';
import { useForm, useWatch } from 'react-hook-form'; import { useForm, useWatch } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
@ -70,10 +70,12 @@ export function FormRSForm() {
} }
const prevDirty = useRef(isDirty); const prevDirty = useRef(isDirty);
useEffect(() => {
if (prevDirty.current !== isDirty) { if (prevDirty.current !== isDirty) {
prevDirty.current = isDirty; prevDirty.current = isDirty;
setIsModified(isDirty); setIsModified(isDirty);
} }
}, [isDirty, setIsModified]);
function handleSelectVersion(version: CurrentVersion) { function handleSelectVersion(version: CurrentVersion) {
router.push({ path: urls.schema(schema.id, version === 'latest' ? undefined : version) }); router.push({ path: urls.schema(schema.id, version === 'latest' ? undefined : version) });