import React, { ForwardRefRenderFunction, HTMLAttributes, forwardRef, } from 'react' import classNames from 'classnames' import Button from '@/packages/button' import { DialogWrapper } from './DialogWrapper' import confirm from './Confirm' import { BasicDialogProps, DialogReturnProps, DialogComponent, ConfirmProps, } from './config' export type DialogProps = BasicDialogProps const defaultProps = { confirmText: '确认', cancelText: '取消', mask: true, closeOnClickOverlay: true, noFooter: false, noOkBtn: false, noCancelBtn: false, okBtnDisabled: false, cancelAutoClose: true, textAlign: 'center', footerDirection: 'horizontal', lockScroll: false, } as DialogProps const BaseDialog: ForwardRefRenderFunction< unknown, Partial & HTMLAttributes > = (props, ref) => { const { visible, footer, noFooter, noOkBtn, noCancelBtn, lockScroll, okBtnDisabled, cancelAutoClose, confirmText, cancelText, onClosed, onCancel, onOk, ...restProps } = props const renderFooter = function () { if (footer === null || noFooter) return '' const handleCancel = (e: MouseEvent) => { e.stopPropagation() if (!cancelAutoClose) return onClosed?.() onCancel?.() if (lockScroll && visible) { document.body.classList.remove('nut-overflow-hidden') } } const handleOk = (e: MouseEvent) => { e.stopPropagation() onClosed?.() onOk?.(e) if (lockScroll && visible) { document.body.classList.remove('nut-overflow-hidden') } } const footerContent = footer || ( <> {!noCancelBtn && ( )} {!noOkBtn && ( )} ) return footerContent } return ( ) } export const Dialog: DialogComponent = forwardRef(BaseDialog) as DialogComponent Dialog.confirm = (props: ConfirmProps): DialogReturnProps => { return confirm(props) } ;['alert'].forEach((type) => { ;(Dialog as any)[type] = (props: ConfirmProps) => { return confirm({ ...props, isNotice: false, noticeType: type, }) } }) Dialog.defaultProps = defaultProps Dialog.displayName = 'NutDialog'