From d6420f4e274ca2e45418d73c30245cd8d78261cc Mon Sep 17 00:00:00 2001 From: iven Date: Sat, 25 Apr 2026 23:24:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E6=B7=BB=E5=8A=A0=20usePermission?= =?UTF-8?q?=20hook=20+=20AuthButton/AuthGuard=20=E5=A3=B0=E6=98=8E?= =?UTF-8?q?=E5=BC=8F=E6=9D=83=E9=99=90=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web/src/components/AuthButton.tsx | 13 +++++++++++++ apps/web/src/components/AuthGuard.tsx | 13 +++++++++++++ apps/web/src/hooks/usePermission.ts | 6 ++++++ 3 files changed, 32 insertions(+) create mode 100644 apps/web/src/components/AuthButton.tsx create mode 100644 apps/web/src/components/AuthGuard.tsx create mode 100644 apps/web/src/hooks/usePermission.ts diff --git a/apps/web/src/components/AuthButton.tsx b/apps/web/src/components/AuthButton.tsx new file mode 100644 index 0000000..31b9c81 --- /dev/null +++ b/apps/web/src/components/AuthButton.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from 'react'; +import { usePermission } from '../hooks/usePermission'; + +interface AuthButtonProps { + code: string; + children: ReactNode; +} + +export function AuthButton({ code, children }: AuthButtonProps) { + const { hasPermission } = usePermission(code); + if (!hasPermission) return null; + return <>{children}; +} diff --git a/apps/web/src/components/AuthGuard.tsx b/apps/web/src/components/AuthGuard.tsx new file mode 100644 index 0000000..aad6ffe --- /dev/null +++ b/apps/web/src/components/AuthGuard.tsx @@ -0,0 +1,13 @@ +import type { ReactNode } from 'react'; +import { usePermission } from '../hooks/usePermission'; + +interface AuthGuardProps { + code: string; + children: ReactNode; +} + +export function AuthGuard({ code, children }: AuthGuardProps) { + const { hasPermission } = usePermission(code); + if (!hasPermission) return null; + return <>{children}; +} diff --git a/apps/web/src/hooks/usePermission.ts b/apps/web/src/hooks/usePermission.ts new file mode 100644 index 0000000..8d11f9a --- /dev/null +++ b/apps/web/src/hooks/usePermission.ts @@ -0,0 +1,6 @@ +import { useAuthStore } from '../stores/auth'; + +export function usePermission(code: string): { hasPermission: boolean } { + const permissions = useAuthStore((s) => s.permissions); + return { hasPermission: permissions.includes(code) }; +}