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 
 | 
} 
 |