const state = { visitedViews: [], cachedViews: [], iframeViews: [], }; const mutations = { ADD_IFRAME_VIEW: (state, view) => { if (state.iframeViews.some((v) => v.path === view.path)) return; state.iframeViews.push( Object.assign({}, view, { title: view.meta.title || "no-name", }) ); }, ADD_VISITED_VIEW: (state, view) => { if (state.visitedViews.some((v) => v.path === view.path)) return; state.visitedViews.push( Object.assign({}, view, { title: view.meta.title || "no-name", }) ); }, ADD_CACHED_VIEW: (state, view) => { if (state.cachedViews.includes(view.name)) return; if (view.meta && !view.meta.noCache) { state.cachedViews.push(view.name); } }, DEL_VISITED_VIEW: (state, view) => { for (const [i, v] of state.visitedViews.entries()) { if (v.path === view.path) { state.visitedViews.splice(i, 1); break; } } state.iframeViews = state.iframeViews.filter( (item) => item.path !== view.path ); }, DEL_IFRAME_VIEW: (state, view) => { state.iframeViews = state.iframeViews.filter( (item) => item.path !== view.path ); }, DEL_CACHED_VIEW: (state, view) => { const index = state.cachedViews.indexOf(view.name); index > -1 && state.cachedViews.splice(index, 1); }, DEL_OTHERS_VISITED_VIEWS: (state, view) => { state.visitedViews = state.visitedViews.filter((v) => { return v.meta.affix || v.path === view.path; }); state.iframeViews = state.iframeViews.filter( (item) => item.path === view.path ); }, DEL_OTHERS_CACHED_VIEWS: (state, view) => { const index = state.cachedViews.indexOf(view.name); if (index > -1) { state.cachedViews = state.cachedViews.slice(index, index + 1); } else { state.cachedViews = []; } }, DEL_ALL_VISITED_VIEWS: (state) => { // keep affix tags const affixTags = state.visitedViews.filter((tag) => tag.meta.affix); state.visitedViews = affixTags; state.iframeViews = []; }, DEL_ALL_CACHED_VIEWS: (state) => { state.cachedViews = []; }, UPDATE_VISITED_VIEW: (state, view) => { for (let v of state.visitedViews) { if (v.path === view.path) { v = Object.assign(v, view); break; } } }, DEL_RIGHT_VIEWS: (state, view) => { const index = state.visitedViews.findIndex((v) => v.path === view.path); if (index === -1) { return; } state.visitedViews = state.visitedViews.filter((item, idx) => { if (idx <= index || (item.meta && item.meta.affix)) { return true; } const i = state.cachedViews.indexOf(item.name); if (i > -1) { state.cachedViews.splice(i, 1); } if (item.meta.link) { const fi = state.iframeViews.findIndex((v) => v.path === item.path); state.iframeViews.splice(fi, 1); } return false; }); }, DEL_LEFT_VIEWS: (state, view) => { const index = state.visitedViews.findIndex((v) => v.path === view.path); if (index === -1) { return; } state.visitedViews = state.visitedViews.filter((item, idx) => { if (idx >= index || (item.meta && item.meta.affix)) { return true; } const i = state.cachedViews.indexOf(item.name); if (i > -1) { state.cachedViews.splice(i, 1); } if (item.meta.link) { const fi = state.iframeViews.findIndex((v) => v.path === item.path); state.iframeViews.splice(fi, 1); } return false; }); }, }; const actions = { addView({ dispatch }, view) { dispatch("addVisitedView", view); dispatch("addCachedView", view); }, addIframeView({ commit }, view) { commit("ADD_IFRAME_VIEW", view); }, addVisitedView({ commit }, view) { commit("ADD_VISITED_VIEW", view); }, addCachedView({ commit }, view) { commit("ADD_CACHED_VIEW", view); }, delView({ dispatch, state }, view) { return new Promise((resolve) => { dispatch("delVisitedView", view); dispatch("delCachedView", view); resolve({ visitedViews: [...state.visitedViews], cachedViews: [...state.cachedViews], }); }); }, delVisitedView({ commit, state }, view) { return new Promise((resolve) => { commit("DEL_VISITED_VIEW", view); resolve([...state.visitedViews]); }); }, delIframeView({ commit, state }, view) { return new Promise((resolve) => { commit("DEL_IFRAME_VIEW", view); resolve([...state.iframeViews]); }); }, delCachedView({ commit, state }, view) { return new Promise((resolve) => { commit("DEL_CACHED_VIEW", view); resolve([...state.cachedViews]); }); }, delOthersViews({ dispatch, state }, view) { return new Promise((resolve) => { dispatch("delOthersVisitedViews", view); dispatch("delOthersCachedViews", view); resolve({ visitedViews: [...state.visitedViews], cachedViews: [...state.cachedViews], }); }); }, delOthersVisitedViews({ commit, state }, view) { return new Promise((resolve) => { commit("DEL_OTHERS_VISITED_VIEWS", view); resolve([...state.visitedViews]); }); }, delOthersCachedViews({ commit, state }, view) { return new Promise((resolve) => { commit("DEL_OTHERS_CACHED_VIEWS", view); resolve([...state.cachedViews]); }); }, delAllViews({ dispatch, state }, view) { return new Promise((resolve) => { dispatch("delAllVisitedViews", view); dispatch("delAllCachedViews", view); resolve({ visitedViews: [...state.visitedViews], cachedViews: [...state.cachedViews], }); }); }, delAllVisitedViews({ commit, state }) { return new Promise((resolve) => { commit("DEL_ALL_VISITED_VIEWS"); resolve([...state.visitedViews]); }); }, delAllCachedViews({ commit, state }) { return new Promise((resolve) => { commit("DEL_ALL_CACHED_VIEWS"); resolve([...state.cachedViews]); }); }, updateVisitedView({ commit }, view) { commit("UPDATE_VISITED_VIEW", view); }, delRightTags({ commit }, view) { return new Promise((resolve) => { commit("DEL_RIGHT_VIEWS", view); resolve([...state.visitedViews]); }); }, delLeftTags({ commit }, view) { return new Promise((resolve) => { commit("DEL_LEFT_VIEWS", view); resolve([...state.visitedViews]); }); }, }; export default { namespaced: true, state, mutations, actions, };