import React, { useState } from 'react'; import { Cross } from '@pingtou/rn-vant-icons'; import noop from 'lodash-es/noop'; import BaseDialog from './Dialog'; import { PortalRef } from '../ConfigProvider'; import type { DialogProps, AlertDialogProps } from './type'; let currentKey = 0; const show = (props: DialogProps) => { const defaultOptions = { overlay: true, closeable: false, closeIcon: , showConfirmButton: true, showCancelButton: false, closeOnClickOverlay: false, }; const { onClosed, onCancel, onConfirm, onClose, cancelProps, confirmProps, ...restProps } = props; let destroy = noop; const key = `dialog_${++currentKey}`; const TempDialog = () => { const [visible, setVisible] = useState(true); const [cancelLoading, setCancelLoading] = useState(false); const [okLoading, setOkLoading] = useState(false); destroy = () => { setVisible(false); onClose?.(); }; const _afterClose = () => { onClosed?.(); PortalRef.current?.removePortal(key); }; const _onConfirm = async () => { const i = setTimeout(() => setOkLoading(true)); if ((await onConfirm?.()) !== false) { clearTimeout(i); destroy(); } else { clearTimeout(i); setOkLoading(false); } }; const _onCancel = async () => { const i = setTimeout(() => setCancelLoading(true)); if ((await onCancel?.()) !== false) { clearTimeout(i); destroy(); } else { clearTimeout(i); setCancelLoading(false); } }; return ( ); }; PortalRef.current?.addPortal(key, ); return destroy; }; // 可使用 async/await 的方式 const alert = (props: AlertDialogProps) => { const { onConfirm = noop } = props; return new Promise(resolve => { show({ ...props, onConfirm: () => { onConfirm(); resolve(); }, }); }); }; const confirm = (props: DialogProps): Promise => { const { onCancel = noop, onConfirm = noop } = props; return new Promise((resolve, reject) => { show({ // 强制显示 OK Btn showCancelButton: true, ...props, onCancel: () => { onCancel(); reject(); }, onConfirm: () => { onConfirm(); resolve(true); }, }); }); }; const Dialog = Object.assign(BaseDialog, { show, alert, confirm }); export default Dialog; export { Dialog }; export type { DialogProps } from './type';