import { useCallback, useEffect, useState } from 'react';
import { merge } from 'lodash';
import { Modal } from 'antd';
import { ModalFuncProps } from 'antd/lib/modal';
export type ModalType = 'info' | 'success' | 'error' | 'warning' | 'confirm';
export interface Opts extends ModalFuncProps {
destroyOnClose?: boolean;
}
export interface ModalStateCallback {
destroy: () => void;
update: (newConfig: ModalFuncProps) => void;
}
const defaultOpts = {
okText: '确定',
cancelText: '取消',
maskClosable: true,
};
const useConfirm = (type: Partial<ModalType>, opts?: Opts) => {
const [state, setState] = useState<ModalStateCallback | null>(null);
const [config, setConfig] = useState(() => merge(defaultOpts, opts));
const show = useCallback(
(cfg?: Opts) => {
const newOptions = merge(config, cfg);
setConfig(newOptions);
setState(Modal[type](newOptions));
},
[setState, config, setConfig],
);
useEffect(() => {
return () => {
if (config?.destroyOnClose) {
state?.destroy();
}
};
}, [state, config]);
return [show, state] as const;
};
export default useConfirm;
使用方式
const [showDeleteTask] = useConfirm('confirm', {
title: '标题',
content: '具体描述内容',
icon: <ExclamationCircleFilled style={{ color: '#faac16' }} />,
});
showDeleteTask({
onOk: () => {
console.log('onOk');
}
});