import { store, event } from '@wisdom-utils/utils'; import BaseDirective from '../BaseDirective'; import CloseSingleDirective from './CloseSingleDirective'; import config from '../../config'; class CloseMenuDirective extends BaseDirective { static name = '关闭菜单或者模糊匹配关闭菜单'; static beforeLoadDirectives = [CloseSingleDirective] match() { const { text } = this; let result = null; if(!result) { result = text.match(new RegExp(`关闭(所有).*(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`)) } if (!result) { result = text.match(new RegExp(`关闭(当前).*(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`)) } if (!result) { result = text.match(/关闭(.*)(?=(?:菜单|功能|路径))/); } if (!result) { result = text.match(new RegExp(`关闭(.*)(?=(?:[${Array.from(config.punctuationMark).join("|")}]?))`)) } if (result && result.length >= 2 && !this.matchResult) { this.matchResult = result[1]; } return !!this.matchResult; } async excute({ sendMsg = function () { } }) { let widgets = null; if (this.matchResult == '所有') { return sendMsg(this.closeAllMenu()); } if (this.matchResult == '当前') { return sendMsg(this.closeCurrentMenu()); } widgets = this.getIsOneWdiget(); if (!widgets) { widgets = this.getCompleteMenus(); } if (!widgets) { return sendMsg('已打开菜单中没有查找到此菜单,请检查语音是否正确'); } if (widgets.length == 1) { event.emit('event:closeMenuByName', widgets[0].name); return sendMsg(`关闭${widgets[0].name}菜单成功`); } this.data = {}; this.data.type = 'widgets'; this.data.widgets = widgets; return sendMsg(this.widgetsToMsg(widgets)); } widgetsToMsg(widgets) { return `有以下${widgets.length}个菜单打开\n${widgets .map((widget, index) => `${index + 1}.${widget.name}`) .join('\n')},\n请语音确认一下关闭第几个菜单`; } closeAllMenu() { event.emit('event:closeAllMenu', true); return `成功关闭所有菜单`; } closeCurrentMenu() { const menus = this.getOpenedMenus(); const menu = location.pathname.match(/\/civbase(.*)/); if (!menu || menu.length <= 1) { return '系统发生匹配错误'; } const currentMenu = menus.find(item => item.location.pathname == decodeURI(menu[1])); if (!currentMenu) { return '系统发生异常'; } const isHome = currentMenu.name == '首页'; if (isHome) { return `当前菜单为首页,不能被关闭`; } event.emit('event:closeMenuByName', currentMenu.name); return `关闭${currentMenu.name}菜单成功`; } getCompleteMenus() { const widgets = this.getOpenedMenus(); const reg = new RegExp(this.matchResult); const results = widgets.filter(i => reg.test(i.name)); return results.length > 0 ? results : null; } getIsOneWdiget() { const widgets = this.getOpenedMenus(); const widget = widgets.find(i => i.name == this.matchResult); return widget ? [widget] : null; } getOpenedMenus() { const menus = store.get('event:openedMenus'); return Array.from(menus.current.values()); } } export default CloseMenuDirective