import contextMenuVue from './ContextMenu.vue'; import { isClient } from '/@/utils/is'; import { CreateContextOptions, ContextMenuProps } from './typing'; import { createVNode, render } from 'vue'; const menuManager: { domList: Element[]; resolve: Fn; } = { domList: [], resolve: () => {}, }; export const createContextMenu = function (options: CreateContextOptions) { const { event } = options || {}; event && event?.preventDefault(); if (!isClient) { return; } return new Promise((resolve) => { const body = document.body; const container = document.createElement('div'); const propsData: Partial<ContextMenuProps> = {}; if (options.styles) { propsData.styles = options.styles; } if (options.items) { propsData.items = options.items; } if (options.event) { propsData.customEvent = event; propsData.axis = { x: event.clientX, y: event.clientY }; } const vm = createVNode(contextMenuVue, propsData); render(vm, container); const handleClick = function () { menuManager.resolve(''); }; menuManager.domList.push(container); const remove = function () { menuManager.domList.forEach((dom: Element) => { try { dom && body.removeChild(dom); } catch (error) { // } }); body.removeEventListener('click', handleClick); body.removeEventListener('scroll', handleClick); }; menuManager.resolve = function (arg) { remove(); resolve(arg); }; remove(); body.appendChild(container); body.addEventListener('click', handleClick); body.addEventListener('scroll', handleClick); }); }; export const destroyContextMenu = function () { if (menuManager) { menuManager.resolve(''); menuManager.domList = []; } };