|
|
|
|
@ -1,38 +1,53 @@
|
|
|
|
|
import { TagView, RouteRecordNormalized, RouteLocationNormalized } from 'vue-router';
|
|
|
|
|
import { RouteLocationNormalized } from 'vue-router';
|
|
|
|
|
|
|
|
|
|
export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
const visitedViews = ref<TagView[]>([]);
|
|
|
|
|
const visitedViews = ref<RouteLocationNormalized[]>([]);
|
|
|
|
|
const cachedViews = ref<string[]>([]);
|
|
|
|
|
const iframeViews = ref<TagView[]>([]);
|
|
|
|
|
const iframeViews = ref<RouteLocationNormalized[]>([]);
|
|
|
|
|
|
|
|
|
|
const addView = (view: TagView) => {
|
|
|
|
|
const getVisitedViews = (): RouteLocationNormalized[] => {
|
|
|
|
|
return visitedViews.value;
|
|
|
|
|
};
|
|
|
|
|
const getIframeViews = (): RouteLocationNormalized[] => {
|
|
|
|
|
return iframeViews.value;
|
|
|
|
|
};
|
|
|
|
|
const getCachedViews = (): string[] => {
|
|
|
|
|
return cachedViews.value;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const addView = (view: RouteLocationNormalized) => {
|
|
|
|
|
addVisitedView(view);
|
|
|
|
|
addCachedView(view);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const addIframeView = (view: TagView): void => {
|
|
|
|
|
if (iframeViews.value.some((v: TagView) => v.path === view.path)) return;
|
|
|
|
|
const addIframeView = (view: RouteLocationNormalized): void => {
|
|
|
|
|
if (iframeViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return;
|
|
|
|
|
iframeViews.value.push(
|
|
|
|
|
Object.assign({}, view, {
|
|
|
|
|
title: view.meta?.title || 'no-name'
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
const delIframeView = (view: TagView): Promise<TagView[]> => {
|
|
|
|
|
const delIframeView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
iframeViews.value = iframeViews.value.filter((item: TagView) => item.path !== view.path);
|
|
|
|
|
iframeViews.value = iframeViews.value.filter((item: RouteLocationNormalized) => item.path !== view.path);
|
|
|
|
|
resolve([...iframeViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const addVisitedView = (view: TagView): void => {
|
|
|
|
|
if (visitedViews.value.some((v: TagView) => v.path === view.path)) return;
|
|
|
|
|
const addVisitedView = (view: RouteLocationNormalized): void => {
|
|
|
|
|
if (visitedViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return;
|
|
|
|
|
visitedViews.value.push(
|
|
|
|
|
Object.assign({}, view, {
|
|
|
|
|
title: view.meta?.title || 'no-name'
|
|
|
|
|
})
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
const delView = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => {
|
|
|
|
|
const delView = (
|
|
|
|
|
view: RouteLocationNormalized
|
|
|
|
|
): Promise<{
|
|
|
|
|
visitedViews: RouteLocationNormalized[];
|
|
|
|
|
cachedViews: string[];
|
|
|
|
|
}> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
delVisitedView(view);
|
|
|
|
|
if (!isDynamicRoute(view)) {
|
|
|
|
|
@ -45,7 +60,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const delVisitedView = (view: TagView): Promise<TagView[]> => {
|
|
|
|
|
const delVisitedView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
for (const [i, v] of visitedViews.value.entries()) {
|
|
|
|
|
if (v.path === view.path) {
|
|
|
|
|
@ -56,7 +71,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
resolve([...visitedViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const delCachedView = (view?: TagView): Promise<string[]> => {
|
|
|
|
|
const delCachedView = (view?: RouteLocationNormalized): Promise<string[]> => {
|
|
|
|
|
let viewName = '';
|
|
|
|
|
if (view) {
|
|
|
|
|
viewName = view.name as string;
|
|
|
|
|
@ -67,7 +82,12 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
resolve([...cachedViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const delOthersViews = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => {
|
|
|
|
|
const delOthersViews = (
|
|
|
|
|
view: RouteLocationNormalized
|
|
|
|
|
): Promise<{
|
|
|
|
|
visitedViews: RouteLocationNormalized[];
|
|
|
|
|
cachedViews: string[];
|
|
|
|
|
}> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
delOthersVisitedViews(view);
|
|
|
|
|
delOthersCachedViews(view);
|
|
|
|
|
@ -78,15 +98,15 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const delOthersVisitedViews = (view: TagView): Promise<TagView[]> => {
|
|
|
|
|
const delOthersVisitedViews = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((v: TagView) => {
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((v: RouteLocationNormalized) => {
|
|
|
|
|
return v.meta?.affix || v.path === view.path;
|
|
|
|
|
});
|
|
|
|
|
resolve([...visitedViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const delOthersCachedViews = (view: TagView): Promise<string[]> => {
|
|
|
|
|
const delOthersCachedViews = (view: RouteLocationNormalized): Promise<string[]> => {
|
|
|
|
|
const viewName = view.name as string;
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
const index = cachedViews.value.indexOf(viewName);
|
|
|
|
|
@ -99,7 +119,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const delAllViews = (): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => {
|
|
|
|
|
const delAllViews = (): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[] }> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
delAllVisitedViews();
|
|
|
|
|
delAllCachedViews();
|
|
|
|
|
@ -109,9 +129,9 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const delAllVisitedViews = (): Promise<TagView[]> => {
|
|
|
|
|
const delAllVisitedViews = (): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((tag: TagView) => tag.meta?.affix);
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((tag: RouteLocationNormalized) => tag.meta?.affix);
|
|
|
|
|
resolve([...visitedViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
@ -123,7 +143,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const updateVisitedView = (view: TagView): void => {
|
|
|
|
|
const updateVisitedView = (view: RouteLocationNormalized): void => {
|
|
|
|
|
for (let v of visitedViews.value) {
|
|
|
|
|
if (v.path === view.path) {
|
|
|
|
|
v = Object.assign(v, view);
|
|
|
|
|
@ -131,13 +151,13 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
const delRightTags = (view: TagView): Promise<TagView[]> => {
|
|
|
|
|
const delRightTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path);
|
|
|
|
|
const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path);
|
|
|
|
|
if (index === -1) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => {
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => {
|
|
|
|
|
if (idx <= index || (item.meta && item.meta.affix)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -150,13 +170,13 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
resolve([...visitedViews.value]);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
const delLeftTags = (view: TagView): Promise<TagView[]> => {
|
|
|
|
|
const delLeftTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => {
|
|
|
|
|
return new Promise((resolve) => {
|
|
|
|
|
const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path);
|
|
|
|
|
const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path);
|
|
|
|
|
if (index === -1) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => {
|
|
|
|
|
visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => {
|
|
|
|
|
if (idx >= index || (item.meta && item.meta.affix)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
@ -170,7 +190,7 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const addCachedView = (view: TagView): void => {
|
|
|
|
|
const addCachedView = (view: RouteLocationNormalized): void => {
|
|
|
|
|
const viewName = view.name as string;
|
|
|
|
|
if (!viewName) return;
|
|
|
|
|
if (cachedViews.value.includes(viewName)) return;
|
|
|
|
|
@ -179,15 +199,20 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const isDynamicRoute = (view: any): boolean => {
|
|
|
|
|
const isDynamicRoute = (view: RouteLocationNormalized): boolean => {
|
|
|
|
|
// 检查匹配的路由记录中是否有动态段
|
|
|
|
|
return view.matched.some((m: RouteRecordNormalized) => m.path.includes(':'));
|
|
|
|
|
return view.matched.some((m) => m.path.includes(':'));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
visitedViews,
|
|
|
|
|
cachedViews,
|
|
|
|
|
iframeViews,
|
|
|
|
|
|
|
|
|
|
getVisitedViews,
|
|
|
|
|
getIframeViews,
|
|
|
|
|
getCachedViews,
|
|
|
|
|
|
|
|
|
|
addVisitedView,
|
|
|
|
|
addCachedView,
|
|
|
|
|
delVisitedView,
|
|
|
|
|
@ -205,5 +230,4 @@ export const useTagsViewStore = defineStore('tagsView', () => {
|
|
|
|
|
delIframeView
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
export default useTagsViewStore;
|
|
|
|
|
|