diff --git a/src/App.vue b/src/App.vue index bce09de..9aaab10 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,5 +1,5 @@ + @@ -199,6 +207,7 @@ onMounted(async () => { + diff --git a/src/class/PluginCenter.ts b/src/class/PluginCenter.ts index 04145ee..32e440e 100644 --- a/src/class/PluginCenter.ts +++ b/src/class/PluginCenter.ts @@ -1,124 +1,109 @@ -import useVirtualPages from '@/hooks/useVirtualPages' -import VirtualDirectory, { VirtualFile } from './VirtualDirectory' -import { ShallowRef, shallowRef } from 'vue' +import useVirtualPages from "@/hooks/useVirtualPages"; +import VirtualDirectory, { VirtualFile } from "./VirtualDirectory"; +import { ShallowRef, shallowRef } from "vue"; +import { alertTipType } from "@/types/type"; export enum PluginGroup { - default = 'default', - mainMenu = 'mainMenu' + default = "default", + mainMenu = "mainMenu" } export interface registerComponentOption { - key: string - name: string - icon?: any - getComponent: () => Promise - group?: PluginGroup[] - filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean - disable?: boolean - exitConfirm?: boolean + key: string; + name: string; + icon?: any; + getComponent: () => Promise; + group?: PluginGroup[]; + filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean; + disable?: boolean; + exitConfirm?: boolean; } type Plugin = { - // 用于显示的名字 - name: string - // 代表插件的icon - icon?: ShallowRef - // 是否禁用插件 - disable: boolean - // 插件所属的group,用于区分插件使用的场合 - group: PluginGroup[] - // 判断在未禁用时是否可以使用这个组件 - // 使用组件即调用下面的func - filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean - func: ( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[], - ...args: any[] - ) => void -} + // 用于显示的名字 + name: string; + // 代表插件的icon + icon?: ShallowRef; + // 是否禁用插件 + disable: boolean; + // 插件所属的group,用于区分插件使用的场合 + group: PluginGroup[]; + // 判断在未禁用时是否可以使用这个组件 + // 使用组件即调用下面的func + filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean; + func: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[], ...args: any[]) => void; +}; export default class PluginCenter { - constructor() { - this.pluginsMap = {} - } - pluginsMap: { - [key: string]: Plugin - } + constructor(globalAlertTip: alertTipType) { + this.pluginsMap = {}; + this.globalAlertTip = globalAlertTip; + } + pluginsMap: { + [key: string]: Plugin; + }; - register(key: string, plugin: Plugin) { - this.pluginsMap[key] = plugin - } + globalAlertTip: alertTipType; - /** - * 便捷地注册一个组件为插件,触发时直接用新页面打开 - */ - registerComponent(option: registerComponentOption): void { - const { - key, - name, - getComponent, - icon, - filter, - group = [PluginGroup.default], - disable = false, - exitConfirm = false - } = option - let _component: any - const views = useVirtualPages() - this.register(key, { - name, - filter, - icon: shallowRef(icon), - group, - disable, - func: async ( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[] - ) => { - if (filter(VDirectories, VFiles) === false) { - return - } - if (_component === undefined) _component = await getComponent() - views.push(_component, VDirectories, VFiles, { - VirtualPageOption: { - exitConfirm - } - }) - } - }) - } + register(key: string, plugin: Plugin) { + this.pluginsMap[key] = plugin; + } - getUsablePlugin( - VDirectories: VirtualDirectory[], - VFiles: VirtualFile[], - option?: { - group?: PluginGroup[] - } - ) { - const { group = [PluginGroup.default] } = option ?? {} - const usableList = [] - for (let key of Object.keys(this.pluginsMap)) { - const _plugin = this.pluginsMap[key] - if ( - !_plugin.disable && - _plugin.group.filter((v) => group.includes(v)).length > 0 && - _plugin.filter(VDirectories, VFiles) - ) { - usableList.push(key) - } - } - return usableList.map((key) => ({ - key, - ...this.pluginsMap[key] - })) - } + /** + * 便捷地注册一个组件为插件,触发时直接用新页面打开 + */ + registerComponent(option: registerComponentOption): void { + const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false } = option; + let _component: any; + const views = useVirtualPages(); + this.register(key, { + name, + filter, + icon: shallowRef(icon), + group, + disable, + func: async (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => { + if (filter(VDirectories, VFiles) === false) { + return; + } - usePlugin( - key: string, - VDirectories?: VirtualDirectory[], - VFiles?: VirtualFile[], - ...args: any[] - ) { - this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], ...args) - } + const setAlertTip = key !== 'miaoDirectory' && this.globalAlertTip(`加载 ${name} 插件中`); + if (_component === undefined) _component = await getComponent(); + setAlertTip && setAlertTip(`加载 ${name} 插件完成`, { + type: "success", + timeout: 2000 + }); + views.push(_component, VDirectories, VFiles, { + VirtualPageOption: { + exitConfirm + } + }); + } + }); + } + + getUsablePlugin( + VDirectories: VirtualDirectory[], + VFiles: VirtualFile[], + option?: { + group?: PluginGroup[]; + } + ) { + const { group = [PluginGroup.default] } = option ?? {}; + const usableList = []; + for (let key of Object.keys(this.pluginsMap)) { + const _plugin = this.pluginsMap[key]; + if (!_plugin.disable && _plugin.group.filter(v => group.includes(v)).length > 0 && _plugin.filter(VDirectories, VFiles)) { + usableList.push(key); + } + } + return usableList.map(key => ({ + key, + ...this.pluginsMap[key] + })); + } + + usePlugin(key: string, VDirectories?: VirtualDirectory[], VFiles?: VirtualFile[], ...args: any[]) { + this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], ...args); + } } diff --git a/src/components/miaoMessageProvider.vue b/src/components/miaoAlertTipProvider.vue similarity index 92% rename from src/components/miaoMessageProvider.vue rename to src/components/miaoAlertTipProvider.vue index 5210b2e..f5cba1e 100644 --- a/src/components/miaoMessageProvider.vue +++ b/src/components/miaoAlertTipProvider.vue @@ -18,12 +18,7 @@ import generateId from '@/hooks/generateId'; import { NIcon } from 'naive-ui'; import { computed, onMounted, ref, shallowReactive } from 'vue'; import { InformationCircle, CheckmarkCircle, CloseCircle } from '@vicons/ionicons5' - -interface MessageOptions { - type?: 'info' | 'success' | 'error' - timeout?: number - id?: number -} +import { AlertTipMessageOptions } from '@/types/type'; interface Message { icon: any, @@ -48,7 +43,7 @@ const messageList = computed(() => { ...messageMap[v], })) }) -const message = (content: string, options?: MessageOptions) => { +const alertTip = (content: string, options?: AlertTipMessageOptions) => { let timer: any const { timeout = 0, type = 'info', id = generateId() } = options ?? {} if (timeout > 0) { @@ -63,10 +58,10 @@ const message = (content: string, options?: MessageOptions) => { content, timer } - return (newContent: string, newOptions?: MessageOptions) => { + return (newContent: string, newOptions?: AlertTipMessageOptions) => { newOptions = newOptions ?? {} newOptions.id = id - message(newContent, newOptions) + alertTip(newContent, newOptions) } } @@ -86,7 +81,7 @@ onMounted(async () => { }) -defineExpose({ message }); +defineExpose({ alertTip });