import { createApp } from 'vue' import Antd from 'ant-design-vue' // 导入组件 import CodePreview from './BoxMask.vue' import snowy from '@/snowy' let codePreviewInstance = null let codePreviewApp = null /** * 初始化代码预览实例 * @param {Object} fileInfo 文件信息 * @param {Boolean} isEdit 是否可编辑 * @param {Function} callback 回调函数 */ const initInstanceCodePreview = (fileInfo, isEdit, callback) => { const mountNode = document.createElement('div') codePreviewApp = createApp(CodePreview, { fileInfo, isEdit, callback }) // 注册 Ant Design Vue 组件 codePreviewApp.use(Antd) codePreviewApp.use(snowy) codePreviewInstance = codePreviewApp.mount(mountNode) return mountNode } /** * 代码预览 Promise 函数 * @param {Object} obj 包含文件信息和编辑状态的对象 * @returns {Promise} 抛出确认和取消回调函数 */ const showCodePreviewBox = (obj) => { // 非首次调用服务时,在 DOM 中移除上个实例 if (codePreviewInstance !== null && codePreviewApp !== null) { codePreviewApp.unmount() codePreviewInstance = null codePreviewApp = null } let { fileInfo, isEdit } = obj return new Promise((resolve) => { const mountNode = initInstanceCodePreview(fileInfo, isEdit, (res) => { resolve(res) // 服务取消时卸载 DOM if (res === 'cancel' && codePreviewInstance !== null) { codePreviewApp.unmount() document.body.removeChild(mountNode) codePreviewInstance = null codePreviewApp = null } }) document.body.appendChild(mountNode) // 挂载 DOM // 使用 setTimeout 确保组件已完全挂载 setTimeout(() => { if (codePreviewInstance) { codePreviewInstance.visible = true // 打开代码预览遮罩层 } }, 0) }) } export default showCodePreviewBox