app.js 4.51 KB
import { getByAppId, getAppCurrentMenus } from '@/api/appCenter.js'
import { translateTreeToData } from '@/utils'
import defaultSettings from '@/config'

const { tabsBar, layout, header, themeBar, style, themeColor } = defaultSettings

const topMenus = [
  { id: '163', type: 163, name: '邮件中心' },
  { id: '164', type: 164, name: '消息中心' },
]

const state = () => ({
  menus: [],
  tileMenus: [],
  appInfo: {},
  logo: null,
  visitedMenus: [],
  activeMenu: null,
  indexMenu: {},
  tabsBar: tabsBar,
  layout: layout,
  header: header,
  themeBar: themeBar,
  style: style,
  themeColor: themeColor,
})

const getters = {
  menus: (state) => state.menus,
  appInfo: (state) => state.appInfo,
  logo: (state) => state.logo,
  visitedMenus: (state) => state.visitedMenus,
  activeMenu: (state) => state.activeMenu,
  tileMenus: (state) => state.tileMenus,
  tabsBar: (state) => state.tabsBar,
  layout: (state) => state.layout,
  header: (state) => state.header,
  themeBar: (state) => state.themeBar,
  style: (state) => state.style,
  themeColor: (state) => state.themeColor,
}

const mutations = {
  setAppInfo(state, appInfo) {
    state.appInfo = appInfo
  },
  setMenus(state, menus) {
    state.menus = menus
    state.tileMenus = translateTreeToData([...topMenus, ...menus], 'name')
  },
  setLogo(state, logo) {
    state.logo = logo
  },
  addVisitedMenus(state, menu) {
    state.visitedMenus.push(menu)
  },
  delVisitedMenus(state, menu) {
    state.visitedMenus.forEach((item, index) => {
      if (item.id === menu.id) state.visitedMenus.splice(index, 1)
    })
  },
  setActiveMenu(state, menu) {
    state.activeMenu = menu
  },
  setVisitedMenus(state, menus) {
    state.visitedMenus = menus
  },
  setIndexMenu(state, menu) {
    state.indexMenu = menu
  },
  changeLayout: (state, layout) => {
    if (layout) state.layout = layout
  },
  changeStyle: (state, style) => {
    if (style) state.style = style
  },
  changeThemeColor: (state, themeColor) => {
    if (style) state.themeColor = themeColor
  },
  changeHeader: (state, header) => {
    if (header) state.header = header
  },
  changeTabsBar: (state, tabsBar) => {
    if (tabsBar) state.tabsBar = tabsBar
  },
}

const actions = {
  getMenus({ commit, state, dispatch }, appId) {
    getAppCurrentMenus(appId).then((data) => {
      commit('setMenus', data)
      let firstMenu = state.tileMenus
        .filter((item) => item.menuType === 'page')
        .find((menu) => !topMenus.map((item) => item.id).includes(menu.id))
      commit('setIndexMenu', firstMenu)
      dispatch('setVisitedMenus', [])
      dispatch('addVisitedMenus', firstMenu.id)
    })
  },
  getAppInfo({ commit, state }, appId) {
    return getByAppId(appId).then((data) => {
      commit('setAppInfo', data)
      commit('setLogo', data.icon)
    })
  },
  addVisitedMenus({ commit, state }, selectedMenuId) {
    let selectedMenu = state.tileMenus.find(
      (menu) => menu.id === selectedMenuId
    )
    commit('setActiveMenu', selectedMenu)
    if (
      !state.visitedMenus.some(
        (visitedMenu) => visitedMenu.id === selectedMenu.id
      )
    ) {
      commit('addVisitedMenus', selectedMenu)
    }
  },
  addVisitedMenuByObject({ commit, state }, selectedMenu) {
    commit('setActiveMenu', selectedMenu)
    if (
      !state.visitedMenus.some(
        (visitedMenu) => visitedMenu.id === selectedMenu.id
      )
    ) {
      commit('addVisitedMenus', selectedMenu)
    }
  },
  delVisitedMenus({ commit, state }, menu) {
    commit('delVisitedMenus', menu)
  },
  setActiveMenu({ commit, state }, menu) {
    commit('setActiveMenu', menu)
  },
  delAllVisitedMenus({ commit, state }) {
    commit('setVisitedMenus', [])
  },
  setVisitedMenus({ commit, state }, menus) {
    commit('setVisitedMenus', menus)
  },
  delOtherMenus({ commit }, menu) {
    commit('setVisitedMenus', [menu])
  },
  delLeftMenus({ commit, state }, index) {
    commit(
      'setVisitedMenus',
      state.visitedMenus.slice(index, state.visitedMenus.length)
    )
  },
  delRightMenus({ commit, state }, index) {
    commit('setVisitedMenus', state.visitedMenus.slice(0, index + 1))
  },
  changeStyle({ commit }, style) {
    commit('changeStyle', style)
  },
  changeLayout({ commit }, layout) {
    commit('changeLayout', layout)
  },
  changeThemeColor({ commit }, themeColor) {
    commit('changeThemeColor', themeColor)
  },
  changeHeader({ commit }, header) {
    commit('changeHeader', header)
  },
  changeTabsBar({ commit }, tabsBar) {
    commit('changeTabsBar', tabsBar)
  },
}

export default { state, getters, mutations, actions }