tabbar.js 1.81 KB
import { defineStore } from 'pinia'
import { getTabbarConfigAPI } from '@/api/tabbar'
import {
  getDefaultTabbarItem,
  getDefaultTabbarItems,
  normalizeTabbarItems,
} from '@/utils/tabbar'

let tabbarRequestPromise = null

export const useTabbarStore = defineStore('tabbar', {
  state: () => ({
    tabItems: getDefaultTabbarItems(),
    loaded: false,
    loading: false,
  }),
  getters: {
    visibleTabItems: (state) => state.tabItems.filter((item) => item.visible !== false),
    getTabItem: (state) => (key) => {
      const normalizedKey = String(key || '').trim()
      return state.tabItems.find((item) => item.key === normalizedKey) || getDefaultTabbarItem(normalizedKey)
    },
  },
  actions: {
    async fetchTabbarConfig(force = false) {
      if (!force && this.loaded) {
        return this.tabItems
      }

      if (this.loading && tabbarRequestPromise) {
        return tabbarRequestPromise
      }

      this.loading = true

      tabbarRequestPromise = (async () => {
        try {
          const response = await getTabbarConfigAPI()
          const rawTabItems = response?.data?.tab_items || response?.data?.tabs || response?.data?.list || []

          if (response?.code === 1) {
            this.tabItems = normalizeTabbarItems(rawTabItems)
          } else {
            this.tabItems = getDefaultTabbarItems()
          }
        } catch (error) {
          console.error('获取底部导航配置失败:', error)
          this.tabItems = getDefaultTabbarItems()
        } finally {
          this.loaded = true
          this.loading = false
          tabbarRequestPromise = null
        }

        return this.tabItems
      })()

      return tabbarRequestPromise
    },
    async ensureLoaded() {
      if (this.loaded) {
        return this.tabItems
      }

      return this.fetchTabbarConfig()
    },
  },
})