import React from 'react'; import ReactDOM from 'react-dom'; import { destroyFns, ModalReactProps } from './Modal'; import ConfirmModal from './ConfirmModal'; import '@douyinfe/semi-foundation/modal/modal.scss'; import { get } from 'lodash'; import { IconAlertCircle, IconAlertTriangle, IconHelpCircle, IconInfoCircle, IconTickCircle } from '@douyinfe/semi-icons'; import { Motion } from '../_base/base'; export interface ConfirmProps extends ModalReactProps { type: 'success' | 'info' | 'warning' | 'error' | 'confirm'; } export default function confirm(props: ConfirmProps) { // create a dom in adapter? const div = document.createElement('div'); document.body.appendChild(div); let currentConfig = { ...props }; const destroy = () => { const unmountResult = ReactDOM.unmountComponentAtNode(div); if (unmountResult && div.parentNode) { div.parentNode.removeChild(div); } for (let i = 0; i < destroyFns.length; i++) { const fn = destroyFns[i]; // eslint-disable-next-line @typescript-eslint/no-use-before-define if (fn === close) { destroyFns.splice(i, 1); break; } } }; const mergedMotion: Motion = typeof (props.motion) === 'undefined' || props.motion ? { ...(props.motion as any), didLeave: (...args: any) => { const didLeave = get(props.motion, 'didLeave'); if (typeof didLeave === 'function') { didLeave(...args); } destroy(); } } : false; function render(renderProps: ConfirmProps) { ReactDOM.render(, div); } function close() { currentConfig = { ...currentConfig, visible: false, }; render(currentConfig); } function update(newConfig: T extends { type: Exclude } ? ModalReactProps : ConfirmProps) { currentConfig = { ...currentConfig, ...newConfig, }; render(currentConfig); } render(currentConfig); destroyFns.push(close); return { destroy: close, update, }; } export function withInfo(props: ModalReactProps) { return { type: 'info' as const, icon: , ...props }; } export function withSuccess(props: ModalReactProps) { return { type: 'success' as const, icon: , ...props }; } export function withWarning(props: ModalReactProps) { return { type: 'warning' as const, icon: , ...props }; } export function withError(props: ModalReactProps) { return { type: 'error' as const, icon: , ...props }; } export function withConfirm(props: ModalReactProps) { return { type: 'confirm' as const, icon: , ...props }; }