From 6fe85fac137acf25d39b1d35f6f9867e2f647298 Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Sat, 18 Oct 2025 13:40:08 +0700 Subject: [PATCH 1/3] feat(FE-113): add Client, Permission, Role, and RoleWithPermission types --- src/types/api/api-general.d.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/types/api/api-general.d.ts b/src/types/api/api-general.d.ts index cf3e57f7..c118b5a4 100644 --- a/src/types/api/api-general.d.ts +++ b/src/types/api/api-general.d.ts @@ -24,6 +24,36 @@ export type LogoutResponse = BaseApiResponse; export type GetMeResponse = BaseApiResponse; +export type Client = { + id: number; + name: stirng; + alias: string; + created_at: string; + updated_at: string; +}; + +export type Permission = { + id: number; + name: string; + action: string; + client: Omit; + created_at: string; + updated_at: string; +}; + +export type Role = { + id: number; + key: string; + name: string; + client: Omit; + created_at: string; + updated_at: string; +}; + +export type RoleWithPermissions = Omit & { + permissions: Omit[]; +}; + export type User = { id: number; email: string; From 2b3aa9c3eed4a11593b1d75035acc81be3faf4ee Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Sat, 18 Oct 2025 13:40:32 +0700 Subject: [PATCH 2/3] feat(FE-113): create permissionCheck helper function --- src/services/hooks/useAuth.tsx | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/services/hooks/useAuth.tsx b/src/services/hooks/useAuth.tsx index 86bf43ed..79fa8981 100644 --- a/src/services/hooks/useAuth.tsx +++ b/src/services/hooks/useAuth.tsx @@ -6,22 +6,43 @@ type AuthStore = { isLoadingUser?: boolean; setUser: (newUserData?: UserWithRoles) => void; setIsLoadingUser: (isLoading?: boolean) => void; + permissionCheck: (permissionName: string) => boolean; }; -const useAuthStore = create()((set) => ({ +const useAuthStore = create()((set, get) => ({ user: undefined, isLoadingUser: false, setUser: (newUserData) => set({ user: newUserData }), setIsLoadingUser: (isLoading) => set({ isLoadingUser: Boolean(isLoading) }), + + permissionCheck: (name) => { + const { user, isLoadingUser } = get(); + + if (!isLoadingUser && user) { + const isAllowed = user.roles.some((role) => { + const isPermissionNameAllowed = role.permissions.some( + (permission) => permission.name === name + ); + + return isPermissionNameAllowed; + }); + + return isAllowed; + } + + return false; + }, })); export const useAuth = () => { - const { user, setUser, isLoadingUser, setIsLoadingUser } = useAuthStore(); + const { user, setUser, isLoadingUser, setIsLoadingUser, permissionCheck } = + useAuthStore(); return { user, setUser, isLoadingUser, setIsLoadingUser, + permissionCheck, }; }; From 376fa29f7edf4da9df926566f270f6053895f6de Mon Sep 17 00:00:00 2001 From: ValdiANS Date: Mon, 20 Oct 2025 09:55:08 +0700 Subject: [PATCH 3/3] fix(FE-40): wrap master data detail with SuspenseHelper --- src/app/master-data/customer/detail/layout.tsx | 11 +++++++++++ src/app/master-data/supplier/detail/layout.tsx | 11 +++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/app/master-data/customer/detail/layout.tsx create mode 100644 src/app/master-data/supplier/detail/layout.tsx diff --git a/src/app/master-data/customer/detail/layout.tsx b/src/app/master-data/customer/detail/layout.tsx new file mode 100644 index 00000000..7220dfa1 --- /dev/null +++ b/src/app/master-data/customer/detail/layout.tsx @@ -0,0 +1,11 @@ +import SuspenseHelper from '@/components/helper/SuspenseHelper'; + +const Layout = ({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) => { + return {children}; +}; + +export default Layout; diff --git a/src/app/master-data/supplier/detail/layout.tsx b/src/app/master-data/supplier/detail/layout.tsx new file mode 100644 index 00000000..7220dfa1 --- /dev/null +++ b/src/app/master-data/supplier/detail/layout.tsx @@ -0,0 +1,11 @@ +import SuspenseHelper from '@/components/helper/SuspenseHelper'; + +const Layout = ({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) => { + return {children}; +}; + +export default Layout;