auth.ts 1.84 KB
import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import type { AuthUser, LoginResponse, MenuNode } from '@/types/auth'
import { findFirstMenuPath, flattenMenuPaths } from '@/utils/menu'

export const useAuthStore = defineStore('auth', () => {
  const token = ref(localStorage.getItem('token') || '')
  const user = ref<AuthUser | null>(JSON.parse(localStorage.getItem('user') || 'null'))
  const menus = ref<MenuNode[]>(JSON.parse(localStorage.getItem('menus') || '[]'))
  const homePath = ref(localStorage.getItem('homePath') || '')

  const isAdmin = computed(() => user.value?.role === 'admin')
  const flatMenuPaths = computed(() => flattenMenuPaths(menus.value))
  const fallbackHomePath = computed(() => homePath.value || findFirstMenuPath(menus.value) || '/dashboard')

  function setToken(t: string) {
    token.value = t
    localStorage.setItem('token', t)
  }

  function setSession(payload: LoginResponse) {
    token.value = payload.token
    user.value = payload.user
    menus.value = payload.menus || []
    homePath.value = payload.homePath || findFirstMenuPath(menus.value) || '/dashboard'
    localStorage.setItem('token', token.value)
    localStorage.setItem('user', JSON.stringify(user.value))
    localStorage.setItem('menus', JSON.stringify(menus.value))
    localStorage.setItem('homePath', homePath.value)
  }

  function hasPath(path: string) {
    return flatMenuPaths.value.includes(path)
  }

  function logout() {
    token.value = ''
    user.value = null
    menus.value = []
    homePath.value = ''
    localStorage.removeItem('token')
    localStorage.removeItem('user')
    localStorage.removeItem('menus')
    localStorage.removeItem('homePath')
  }

  return {
    token,
    user,
    menus,
    homePath,
    isAdmin,
    flatMenuPaths,
    fallbackHomePath,
    setToken,
    setSession,
    hasPath,
    logout,
  }
})