import React, { forwardRef, useCallback, useImperativeHandle, useRef, useState, type ReactElement, type Ref, } from 'react' import type { FieldValues } from 'react-hook-form' import { Modal, ScrollArea } from '@mantine/core' import type { SuperFormModalProps, SuperFormModalRef, SuperFormRef } from '../../types' import SuperForm from '../../components/SuperForm' import { openConfirmModal } from '../../utils/openConfirmModal' const SuperFormModal = ( { modalProps, noCloseOnSubmit, ...formProps }: SuperFormModalProps, ref: Ref> ) => { // Component Refs const modalRef = useRef(null) const formRef = useRef>(null) // Component store State // Tell drawer that form layout mounted to fix refs const [layoutMounted, setLayoutMounted] = useState(false) // Component Callback Functions const onSubmit = (data: T, request, formData, form, closeForm: boolean = true) => { formProps?.onSubmit?.(data, request, formData, form, closeForm) if (request === 'delete') { modalProps?.onClose() } if (!noCloseOnSubmit) { if (closeForm) { modalProps?.onClose() } } } const onCancel = (request) => { if (formRef?.current?.getFormState().isDirty) { openConfirmModal(() => { modalProps?.onClose() formProps?.onCancel?.(request) }) } else { modalProps?.onClose() formProps?.onCancel?.(request) } } const onLayoutMounted = useCallback(() => { setLayoutMounted(true) formProps?.onLayoutMounted?.() }, [formProps?.onLayoutMounted]) const onLayoutUnMounted = useCallback(() => { setLayoutMounted(false) formProps?.onLayoutUnMounted?.() }, [formProps?.onLayoutUnMounted]) // Component use Effects useImperativeHandle, SuperFormModalRef>( ref, () => ({ ...formRef.current, modal: modalRef.current, } as SuperFormModalRef), [layoutMounted] ) return ( {...formProps} onCancel={onCancel} onSubmit={onSubmit} onLayoutMounted={onLayoutMounted} onLayoutUnMounted={onLayoutUnMounted} ref={formRef} /> ) } const FRSuperFormModal = forwardRef(SuperFormModal) as ( props: SuperFormModalProps & { ref?: Ref> } ) => ReactElement export default FRSuperFormModal