import { useTranslation } from "react-i18next"; import { useControllableValue } from "ahooks"; import { Button, Drawer, type DrawerProps, Form, type FormProps, type ModalProps, Space } from "antd"; import { useAntdForm, useTriggerElement } from "@/hooks"; export interface DrawerFormProps = any> extends Omit, "title" | "onFinish"> { className?: string; style?: React.CSSProperties; children?: React.ReactNode; cancelButtonProps?: ModalProps["cancelButtonProps"]; cancelText?: ModalProps["cancelText"]; defaultOpen?: boolean; drawerProps?: Omit; okButtonProps?: ModalProps["okButtonProps"]; okText?: ModalProps["okText"]; open?: boolean; title?: React.ReactNode; trigger?: React.ReactNode; width?: string | number; onOpenChange?: (open: boolean) => void; onFinish?: (values: T) => void | Promise; } const DrawerForm = = any>({ className, style, children, cancelText, cancelButtonProps, form, drawerProps, okText, okButtonProps, title, trigger, width, onFinish, ...props }: DrawerFormProps) => { const { t } = useTranslation(); const [open, setOpen] = useControllableValue(props, { valuePropName: "open", defaultValuePropName: "defaultOpen", trigger: "onOpenChange", }); const triggerDom = useTriggerElement(trigger, { onClick: () => setOpen(true) }); const { form: formInst, formPending, formProps, submit, } = useAntdForm({ form, onSubmit: async (values) => { try { const ret = await onFinish?.(values); if (ret != null && !ret) return false; return true; } catch { return false; } }, }); const mergedFormProps = { preserve: drawerProps?.destroyOnClose ? false : undefined, ...formProps, ...props, }; const handleOkClick = async () => { const ret = await submit(); if (ret != null && !ret) return; setOpen(false); }; const handleCancelClick = () => { if (formPending) return; setOpen(false); }; return ( <> {triggerDom} } open={open} title={title} width={width} {...drawerProps} onClose={() => setOpen(false)} >
{children}
); }; export default DrawerForm;