'use no memo'; // TODO: remove when react hook forms are compliant with react compiler 'use client'; import { useMemo } from 'react'; import { useForm, useWatch } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRSFormSuspense } from '@/features/rsform'; import { MiniButton } from '@/components/Control'; import { IconReset, IconSave } from '@/components/Icons'; import { TextArea, TextInput } from '@/components/Input'; import { ModalView } from '@/components/Modal'; import { useDialogsStore } from '@/stores/dialogs'; import { errorMsg } from '@/utils/labels'; import { type IVersionUpdateDTO, schemaVersionUpdate } from '../../backend/types'; import { useMutatingLibrary } from '../../backend/useMutatingLibrary'; import { useVersionDelete } from '../../backend/useVersionDelete'; import { useVersionUpdate } from '../../backend/useVersionUpdate'; import { TableVersions } from './TableVersions'; export interface DlgEditVersionsProps { itemID: number; afterDelete: (targetVersion: number) => void; } export function DlgEditVersions() { const { itemID, afterDelete } = useDialogsStore(state => state.props as DlgEditVersionsProps); const hideDialog = useDialogsStore(state => state.hideDialog); const { schema } = useRSFormSuspense({ itemID }); const isProcessing = useMutatingLibrary(); const { versionDelete } = useVersionDelete(); const { versionUpdate } = useVersionUpdate(); const { register, handleSubmit, control, reset, formState: { isDirty, errors: formErrors } } = useForm({ resolver: zodResolver(schemaVersionUpdate), defaultValues: { id: schema.versions[schema.versions.length - 1].id, version: schema.versions[schema.versions.length - 1].version, description: schema.versions[schema.versions.length - 1].description }, context: { schema: schema } }); const versionID = useWatch({ control, name: 'id' }); const versionName = useWatch({ control, name: 'version' }); const isValid = useMemo( () => schema.versions.every(ver => ver.id === versionID || ver.version != versionName), [schema, versionID, versionName] ); function handleSelectVersion(targetVersion: number) { const ver = schema.versions.find(ver => ver.id === targetVersion); if (!ver) { return; } reset({ ...ver }); } function handleDeleteVersion(targetVersion: number) { const nextVer = schema.versions.find(ver => ver.id !== targetVersion); void versionDelete({ itemID: itemID, versionID: targetVersion }).then(() => { if (!nextVer) { hideDialog(); } else if (targetVersion === versionID) { reset({ id: nextVer.id, version: nextVer.version, description: nextVer.description }); } afterDelete(targetVersion); }); } function onUpdate(data: IVersionUpdateDTO) { if (!isDirty || isProcessing || !isValid) { return; } void versionUpdate({ itemID: itemID, version: data }).then(() => reset({ ...data })); } return (
void handleSubmit(onUpdate)(event)}>
} /> reset()} icon={} />