import type { RouteLocationNormalized, Router } from 'vue-router'; import { useRouter } from 'vue-router'; import { unref } from 'vue'; import { useMultipleTabStore } from '@/stores/multiTabs'; // import { useAppStore } from '/@/store/modules/app'; enum TableActionEnum { REFRESH, CLOSE_ALL, CLOSE_LEFT, CLOSE_RIGHT, CLOSE_OTHER, CLOSE_CURRENT, CLOSE, } export function useTabs(_router?: Router) { // const appStore = useAppStore(); function canIUseTabs(): boolean { // const { show } = appStore.getMultiTabsSetting; const show = true; if (!show) { throw new Error('The multi-tab page is currently not open, please open it in the settings!'); } return !!show; } const tabStore = useMultipleTabStore(); const router = _router || useRouter(); const { currentRoute } = router; function getCurrentTab() { const route = unref(currentRoute); return tabStore.getTabList.find((item) => item.path === route.path)!; } async function updateTabTitle(title: string, tab?: RouteLocationNormalized) { const canIUse = canIUseTabs; if (!canIUse) { return; } const targetTab = tab || getCurrentTab(); await tabStore.setTabTitle(title, targetTab); } async function updateTabPath(path: string, tab?: RouteLocationNormalized) { const canIUse = canIUseTabs; if (!canIUse) { return; } const targetTab = tab || getCurrentTab(); await tabStore.updateTabPath(path, targetTab); } async function handleTabAction(action: TableActionEnum, tab?: RouteLocationNormalized) { const canIUse = canIUseTabs; if (!canIUse) { return; } const currentTab = getCurrentTab(); switch (action) { case TableActionEnum.REFRESH: await tabStore.refreshPage(router); break; case TableActionEnum.CLOSE_ALL: await tabStore.closeAllTab(router); break; case TableActionEnum.CLOSE_LEFT: await tabStore.closeLeftTabs(currentTab, router); break; case TableActionEnum.CLOSE_RIGHT: await tabStore.closeRightTabs(tab || currentTab, router); break; case TableActionEnum.CLOSE_OTHER: await tabStore.closeOtherTabs(tab || currentTab, router); break; case TableActionEnum.CLOSE_CURRENT: case TableActionEnum.CLOSE: await tabStore.closeTab(tab || currentTab, router); break; } } return { refreshPage: () => handleTabAction(TableActionEnum.REFRESH), closeAll: () => handleTabAction(TableActionEnum.CLOSE_ALL), closeLeft: () => handleTabAction(TableActionEnum.CLOSE_LEFT), closeRight: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE_RIGHT, tab), closeOther: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE_OTHER, tab), closeCurrent: () => handleTabAction(TableActionEnum.CLOSE_CURRENT), close: (tab?: RouteLocationNormalized) => handleTabAction(TableActionEnum.CLOSE, tab), setTitle: (title: string, tab?: RouteLocationNormalized) => updateTabTitle(title, tab), updatePath: (fullPath: string, tab?: RouteLocationNormalized) => updateTabPath(fullPath, tab), }; }