import type { InjectionKey, Slot, VNode } from 'vue';
import { ModalProps } from '../modal-types';
import { CommonModalService, ModalOpenResult } from './common-modal-service';
import DModal from '../modal';
let vm: VNode | null;
export interface ModalOptions {
title?: string;
lockScroll?: boolean;
closeOnClickOverlay?: boolean;
header: Slot;
content: Slot;
footer: Slot;
beforeClose: (done: () => void) => void;
}
export class ModalService extends CommonModalService<ModalOptions, ModalProps> {
static token = 'MODAL_SERVICE_TOKEN' as unknown as InjectionKey<ModalService>;
component(): unknown {
return DModal;
}
open(props: Partial<ModalOptions> = {}): ModalOpenResult {
const anchor = document.createElement('div');
this.anchorContainer.appendChild(anchor);
const { header, content, footer, ...resProps } = props;
const renderOrigin = (propsValue: typeof resProps, onUpdateModelValue: (value: boolean) => void): VNode => {
return this.renderModal(
anchor,
{
...propsValue,
modelValue: true,
'onUpdate:modelValue': onUpdateModelValue,
},
{ header, default: content, footer }
);
};
const hide = () => {
const innerNeedHideOrNot = (value: boolean) => {
if (!value) {
hide();
}
};
renderOrigin(resProps, (value: boolean) => {
if (!value) {
this.renderModal(anchor, { ...resProps, modelValue: false });
this.renderNull(anchor);
} else {
renderOrigin(resProps, innerNeedHideOrNot);
}
});
vm?.component?.exposed?.handleVisibleChange?.(false);
};
const needHideOrNot = (value: boolean) => {
if (!value) {
hide();
}
};
this.renderModal(anchor, { modelValue: false });
vm = renderOrigin(resProps, needHideOrNot);
return { hide };
}
}