Files
admin-web/src/core/access/accessPreview.ts
T
2026-08-19 16:45:51 +08:00

83 lines
2.5 KiB
TypeScript

import { computed, ref } from 'vue'
import { defineStore } from 'pinia'
import {
adminNavigation,
filterAdminNavigation,
getFirstNavigationLeaf,
} from '@/core/navigation/adminNavigation'
import { useAuthStore } from '@/core/auth/auth'
const LOCAL_FULL_ACCESS_STORAGE_KEY = 'baiyue-admin-local-full-access'
class LocalFullAccessPermissionSet extends Set<string> {
override has(_permissionCode: string): boolean {
return true
}
}
export function isLocalFullAccessHost(hostname: string): boolean {
return hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1'
}
export const useAccessPreviewStore = defineStore('access-preview', () => {
const auth = useAuthStore()
const initialized = ref(false)
const localFullAccessAvailable = import.meta.env.DEV
&& typeof window !== 'undefined'
&& isLocalFullAccessHost(window.location.hostname)
const localFullAccessEnabled = ref(
localFullAccessAvailable
&& window.localStorage.getItem(LOCAL_FULL_ACCESS_STORAGE_KEY) === 'true',
)
const permissionCodes = computed<ReadonlySet<string>>(() => (
localFullAccessEnabled.value
? new LocalFullAccessPermissionSet(auth.permissionCodes)
: auth.permissionCodes
))
const permissionSignature = computed(() => (
localFullAccessEnabled.value
? '__LOCAL_FULL_ACCESS__'
: [...permissionCodes.value].sort().join('|')
))
const filteredNavigation = computed(() => filterAdminNavigation(adminNavigation, permissionCodes.value))
const firstAccessiblePath = computed(() => getFirstNavigationLeaf(filteredNavigation.value)?.path ?? null)
function initializeAfterLogin() {
initialized.value = auth.isAuthenticated
}
function can(permissionCode: string): boolean {
return permissionCodes.value.has(permissionCode)
}
function setLocalFullAccessEnabled(enabled: boolean) {
if (!localFullAccessAvailable) return
localFullAccessEnabled.value = enabled
if (enabled) window.localStorage.setItem(LOCAL_FULL_ACCESS_STORAGE_KEY, 'true')
else window.localStorage.removeItem(LOCAL_FULL_ACCESS_STORAGE_KEY)
}
function toggleLocalFullAccess() {
setLocalFullAccessEnabled(!localFullAccessEnabled.value)
}
function reset() {
initialized.value = false
}
return {
initialized,
localFullAccessAvailable,
localFullAccessEnabled,
permissionCodes,
permissionSignature,
filteredNavigation,
firstAccessiblePath,
initializeAfterLogin,
can,
setLocalFullAccessEnabled,
toggleLocalFullAccess,
reset,
}
})