MeterSphere/frontend/src/hooks/useModal.ts

85 lines
2.6 KiB
TypeScript
Raw Normal View History

2023-06-09 13:46:11 +08:00
import { Modal } from '@arco-design/web-vue';
import type { ModalConfig } from '@arco-design/web-vue';
import { useI18n } from '@/hooks/useI18n';
2023-08-16 15:04:57 +08:00
import { Ref, ref } from 'vue';
2023-06-09 13:46:11 +08:00
export type ModalType = 'info' | 'success' | 'warning' | 'error';
export type ModalSize = 'small' | 'medium' | 'large' | 'full';
export type ModalMode = 'default' | 'weak';
export interface ModalOptions extends ModalConfig {
mode?: ModalMode;
type: ModalType;
size?: ModalSize;
onBeforeOk: () => Promise<void>;
2023-06-09 13:46:11 +08:00
}
export interface DeleteModalOptions extends ModalConfig {
title: string;
content: string;
}
const { t } = useI18n();
2023-08-16 15:04:57 +08:00
2023-06-09 13:46:11 +08:00
export default function useModal() {
2023-08-16 15:04:57 +08:00
const beforeOkHandler = (options: any, done: (closed: boolean) => void, loading: Ref) => {
loading.value = true;
options?.onBeforeOk().finally(() => {
loading.value = false;
done(true);
});
};
2023-06-09 13:46:11 +08:00
return {
2023-08-16 15:04:57 +08:00
openModal: (options: ModalOptions) => {
const okHandlerLoading = ref<boolean>(false);
// error 使用 warning的感叹号图标
Modal[options.type === 'error' ? 'warning' : options.type]({
// 默认设置按钮属性也可通过options传入覆盖
okButtonProps: {
type: options.mode === 'weak' ? 'text' : 'primary',
},
cancelButtonProps: {
type: options.mode === 'weak' ? 'text' : 'secondary',
2023-08-16 15:04:57 +08:00
disabled: okHandlerLoading.value,
},
simple: false,
2023-08-16 15:04:57 +08:00
okLoading: okHandlerLoading.value,
...options,
onBeforeOk: (done: (closed: boolean) => void) => {
2023-08-16 15:04:57 +08:00
beforeOkHandler(options, done, okHandlerLoading);
},
onBeforeCancel: () => {
2023-08-16 15:04:57 +08:00
return !okHandlerLoading.value;
},
titleAlign: 'start',
2023-08-09 13:57:29 +08:00
modalClass: `ms-usemodal ms-usemodal-${options.mode || 'default'} ms-usemodal-${
options.size || 'small'
} ms-usemodal-${options.type}`,
2023-08-16 15:04:57 +08:00
});
},
openDeleteModal: (options: DeleteModalOptions) => {
const deleteLoading = ref<boolean>(false);
Modal.warning({
okText: t('common.confirmDelete'),
cancelText: t('common.cancel'),
hideCancel: false,
okButtonProps: { status: 'danger' },
titleAlign: 'start',
modalClass: `ms-usemodal ms-usemodal-warning ms-usemodal-small`,
...options,
2023-08-16 15:04:57 +08:00
okLoading: deleteLoading.value,
cancelButtonProps: {
disabled: deleteLoading.value,
},
onBeforeOk: (done: (closed: boolean) => void) => {
beforeOkHandler(options, done, deleteLoading);
},
onBeforeCancel: () => {
return !deleteLoading.value;
},
});
},
2023-06-09 13:46:11 +08:00
};
}