import type { Component } from "vue"; import ConfirmationModal from "../components/ConfirmationModal.vue"; import NotificationModal from "../components/NotificationModal.vue"; export type ModalCallbackType = ( event: ModalEvents[T], close: () => void ) => Promise | void; export interface ModalStackElement { component: Component; type: T; callback: ModalCallbackType; loading: Ref; data: ModalDatas[T]; } export enum ModalType { Confirmation, Notification, } export type ModalEvents = { [ModalType.Confirmation]: "confirm" | "cancel"; [ModalType.Notification]: "close"; }; export type ModalDatas = { [ModalType.Confirmation]: { title: string; description: string; buttonText?: string; }; [ModalType.Notification]: { title: string; description: string; buttonText?: string; }; }; const modalComponents: { [key in ModalType]: Component } = { [ModalType.Confirmation]: ConfirmationModal, [ModalType.Notification]: NotificationModal, }; export function createModal( type: T, data: ModalDatas[T], callback: ModalCallbackType ) { const modalStack = useModalStack(); modalStack.value.push({ type, component: modalComponents[type], data, callback, loading: ref(false), }); } export const useModalStack = () => useState>>("modal-stack", () => []);