in packages/antd/src/form-dialog/index.tsx [58:193]
export function FormDialog(
title: IModalProps,
id: string,
renderer: FormDialogRenderer
): IFormDialog
export function FormDialog(
title: IModalProps,
renderer: FormDialogRenderer
): IFormDialog
export function FormDialog(
title: ModalTitle,
id: string,
renderer: FormDialogRenderer
): IFormDialog
export function FormDialog(
title: ModalTitle,
renderer: FormDialogRenderer
): IFormDialog
export function FormDialog(title: any, id: any, renderer?: any): IFormDialog {
if (isFn(id) || React.isValidElement(id)) {
renderer = id
id = 'form-dialog'
}
const env = {
host: document.createElement('div'),
form: null,
promise: null,
openMiddlewares: [],
confirmMiddlewares: [],
cancelMiddlewares: [],
}
const root = createPortalRoot(env.host, id)
const props = getModelProps(title)
const modal = {
...props,
afterClose: () => {
props?.afterClose?.()
root.unmount()
},
}
const DialogContent = observer(() => {
return <Fragment>{isFn(renderer) ? renderer(env.form) : renderer}</Fragment>
})
const renderDialog = (
visible = true,
resolve?: () => any,
reject?: () => any
) => {
return (
<Observer>
{() => (
<Modal
{...modal}
visible={visible}
confirmLoading={env.form.submitting}
onCancel={(e) => {
if (modal?.onCancel?.(e) !== false) {
reject()
}
}}
onOk={async (e) => {
if (modal?.onOk?.(e) !== false) {
resolve()
}
}}
>
<FormProvider form={env.form}>
<DialogContent />
</FormProvider>
</Modal>
)}
</Observer>
)
}
document.body.appendChild(env.host)
const formDialog = {
forOpen: (middleware: IMiddleware<IFormProps>) => {
if (isFn(middleware)) {
env.openMiddlewares.push(middleware)
}
return formDialog
},
forConfirm: (middleware: IMiddleware<Form>) => {
if (isFn(middleware)) {
env.confirmMiddlewares.push(middleware)
}
return formDialog
},
forCancel: (middleware: IMiddleware<Form>) => {
if (isFn(middleware)) {
env.cancelMiddlewares.push(middleware)
}
return formDialog
},
open: async (props: IFormProps) => {
if (env.promise) return env.promise
env.promise = new Promise(async (resolve, reject) => {
try {
props = await loading(modal.loadingText, () =>
applyMiddleware(props, env.openMiddlewares)
)
env.form = env.form || createForm(props)
} catch (e) {
reject(e)
}
root.render(() =>
renderDialog(
true,
() => {
env.form
.submit(async () => {
await applyMiddleware(env.form, env.confirmMiddlewares)
resolve(toJS(env.form.values))
formDialog.close()
})
.catch(() => {})
},
async () => {
await loading(modal.loadingText, () =>
applyMiddleware(env.form, env.cancelMiddlewares)
)
formDialog.close()
}
)
)
})
return env.promise
},
close: () => {
if (!env.host) return
root.render(() => renderDialog(false))
},
}
return formDialog
}