press-plus
Version:
85 lines (76 loc) • 1.88 kB
text/typescript
/* eslint-disable import/no-unresolved */
interface DialogInterface {
confirm(options: any): Promise<any>;
close(): void;
install(): void;
}
// 定义 Dialog 组件类型
interface DialogComponent {
(options: any): Promise<any>;
confirm(options: any): Promise<any>;
close(): void;
install(): void;
}
let mDialog: DialogComponent;
function getDialog() {
return new Promise((resolve) => {
if (mDialog) {
resolve(mDialog);
return;
}
Promise.all(Dialog.dialogComponent())
.then((comp) => {
mDialog = comp?.[0]?.default;
resolve(mDialog);
});
});
}
const Dialog = {
dialogComponent: () => [
// #ifdef VUE3
import('press-ui/press-dialog/index' as any),
// #endif
// #ifdef VUE2
import('vant/lib/dialog' as any),
import('vant/lib/dialog/style' as any),
// #endif
],
/**
* 可以通过 Dialog.setComponent 指定其他组件库
* @example
* ```ts
* Dialog.setComponent(() => [
* import('press-ui/press-dialog/index'),
* ])
* ```
*/
setComponent(comp: () => Promise<any>[]) {
Dialog.dialogComponent = comp;
},
show: async (options: any) => {
await getDialog();
const parsed = typeof options === 'object' ? {
message: options.message || options.content,
confirmButtonText: options.confirmButtonText || options.cancelText,
cancelButtonText: options.cancelButtonText || options.confirmText,
...options,
} : options;
return mDialog(parsed);
},
confirm: async (options: any) => {
await getDialog();
return mDialog.confirm(options);
},
close: () => {
getDialog().then(() => {
mDialog.close();
});
},
install: () => {
getDialog().then(() => {
mDialog.install();
});
},
};
const DialogTyped = Dialog as DialogInterface;
export { DialogTyped as Dialog };