diff --git a/apps/web/src/hooks/usePermissions.ts b/apps/web/src/hooks/usePermissions.ts new file mode 100644 index 00000000..c44ec4db --- /dev/null +++ b/apps/web/src/hooks/usePermissions.ts @@ -0,0 +1,71 @@ +import type { Permission } from "@kan/shared"; + +import { useWorkspace } from "~/providers/workspace"; +import { api } from "~/utils/api"; + +interface UsePermissionsResult { + permissions: Permission[]; + role: string | null; + isLoading: boolean; + hasPermission: (permission: Permission) => boolean; + canViewCard: boolean; + canCreateCard: boolean; + canEditCard: boolean; + canDeleteCard: boolean; + canCreateList: boolean; + canEditList: boolean; + canDeleteList: boolean; + canCreateBoard: boolean; + canEditBoard: boolean; + canDeleteBoard: boolean; + canViewComment: boolean; + canCreateComment: boolean; + canEditComment: boolean; + canDeleteComment: boolean; + canInviteMember: boolean; + canEditMember: boolean; + canRemoveMember: boolean; +} + +export function usePermissions(): UsePermissionsResult { + const { workspace } = useWorkspace(); + + const { data, isLoading } = api.permission.getMyPermissions.useQuery( + { workspacePublicId: workspace.publicId }, + { + enabled: !!workspace.publicId, + }, + ); + + const permissions = (data?.permissions ?? []) as Permission[]; + const role = data?.role ?? null; + + const hasPermission = (permission: Permission): boolean => { + return permissions.includes(permission); + }; + + return { + permissions, + role, + isLoading, + hasPermission, + canViewCard: hasPermission("card:view"), + canCreateCard: hasPermission("card:create"), + canEditCard: hasPermission("card:edit"), + canDeleteCard: hasPermission("card:delete"), + canCreateList: hasPermission("list:create"), + canEditList: hasPermission("list:edit"), + canDeleteList: hasPermission("list:delete"), + canCreateBoard: hasPermission("board:create"), + canEditBoard: hasPermission("board:edit"), + canDeleteBoard: hasPermission("board:delete"), + canViewComment: hasPermission("comment:view"), + canCreateComment: hasPermission("comment:create"), + canEditComment: hasPermission("comment:edit"), + canDeleteComment: hasPermission("comment:delete"), + canInviteMember: hasPermission("member:invite"), + canEditMember: hasPermission("member:edit"), + canRemoveMember: hasPermission("member:remove"), + }; +} + diff --git a/apps/web/src/views/board/components/List.tsx b/apps/web/src/views/board/components/List.tsx index c2654ae7..18a3cb83 100644 --- a/apps/web/src/views/board/components/List.tsx +++ b/apps/web/src/views/board/components/List.tsx @@ -10,6 +10,7 @@ import { } from "react-icons/hi2"; import Dropdown from "~/components/Dropdown"; +import { usePermissions } from "~/hooks/usePermissions"; import { useModal } from "~/providers/modal"; import { api } from "~/utils/api"; @@ -39,8 +40,10 @@ export default function List({ setSelectedPublicListId, }: ListProps) { const { openModal } = useModal(); + const { canCreateCard, canDeleteList } = usePermissions(); const openNewCardForm = (publicListId: PublicListId) => { + if (!canCreateCard) return; openModal("NEW_CARD"); setSelectedPublicListId(publicListId); }; @@ -94,32 +97,42 @@ export default function List({ />
- {t`Get started by creating a new list`} + {canCreateList + ? t`Get started by creating a new list` + : t`No lists have been created yet`}