Files
labelmain-demo/components/label/hooks/useAuth.ts
2026-03-27 16:18:44 +08:00

122 lines
3.1 KiB
TypeScript

"use client"
import { usePermissionStore } from "@/components/label/store/auth"
import { usePathname } from "next/navigation"
interface PermissionItem {
[x: string]: [boolean, null, string]
}
type PermissionMap = {
[x: string]: PermissionItem
}
const mappingList: { [x: string]: [string, string] } = {
"/project/own": ["project", "config"],
"/management/team/employee": ["user", "view"],
"/management/team/organization": ["user", "group_view"],
"/management/team/dailypaper": ["daily_work", "team_view"],
"/management/team/cost": ["settlement_form", "view"],
"/management/team/workload": ["workload", "view"],
"/management/team/sync_server": ["data_sync", "server_view"],
"/management/team/sync_task": ["data_sync", "task_view"],
"/management/team/board": ["user", "view"],
}
export const headerBarCheckItems = (data: PermissionMap) => {
const projectTitle = [
["daily_work", "self_view"],
["label_schema", "view"],
["project", "view"],
["task", "view"],
] as const
let projectVisible = false
projectTitle.forEach(([prop, subProp]) => {
if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
projectVisible = true
}
})
const staffTitle = [
["daily_work", "team_view"],
["user", "view"],
["user", "group_view"],
] as const
let staffVisible = false
staffTitle.forEach(([prop, subProp]) => {
if (data[prop] && data[prop][subProp] && data[prop][subProp][0]) {
staffVisible = true
}
})
return [projectVisible, staffVisible]
}
const useAuth = () => {
const pathname = usePathname()
const detailInfo = usePermissionStore((s) => s.detailInfo)
const permission = detailInfo?.permissions as PermissionMap | undefined
const roleName: string[] = detailInfo?.role_name ?? []
return {
hasPermission: () => {
if (
[
"/",
"/login",
"/management",
"/management/person/dashboard",
"/management/team",
].includes(pathname)
) {
return true
}
if (!permission) return false
if (mappingList[pathname]) {
const [prop, subProp] = mappingList[pathname]
return (
!!permission[prop] &&
!!permission[prop][subProp] &&
!!permission[prop][subProp][0]
)
}
return false
},
// path 跳转是否可见
canNv: (path: string, type = "view") => {
if (!permission) return false
if (mappingList[path]) {
const [prop] = mappingList[path]
return (
!!permission[prop] &&
!!permission[prop][type] &&
!!permission[prop][type][0]
)
}
return false
},
// 当前页面是否可见某个操作
isShow: (type = "view") => {
if (!permission) return false
if (mappingList[pathname]) {
const [prop] = mappingList[pathname]
return (
!!permission[prop] &&
!!permission[prop][type] &&
!!permission[prop][type][0]
)
}
return false
},
checkRole: (name: string) => {
if (!name) return false
return roleName.includes(name)
},
}
}
export default useAuth