TeamSettings.utils.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { PermissionAction } from '@supabase/shared-types/out/constants'
  2. import type { OrganizationMember } from '@/data/organizations/organization-members-query'
  3. import { doPermissionsCheck, useGetPermissions } from '@/hooks/misc/useCheckPermissions'
  4. import type { Permission, Role } from '@/types'
  5. export const useGetRolesManagementPermissions = (
  6. orgSlug?: string,
  7. roles?: Role[],
  8. permissions?: Permission[]
  9. ): { rolesAddable: Number[]; rolesRemovable: Number[] } => {
  10. const { permissions: allPermissions, organizationSlug } = useGetPermissions(
  11. permissions,
  12. orgSlug,
  13. permissions !== undefined && orgSlug !== undefined
  14. )
  15. const rolesAddable: Number[] = []
  16. const rolesRemovable: Number[] = []
  17. if (!roles || !orgSlug) return { rolesAddable, rolesRemovable }
  18. roles.forEach((role: Role) => {
  19. const canAdd = doPermissionsCheck(
  20. allPermissions,
  21. PermissionAction.CREATE,
  22. 'auth.subject_roles',
  23. {
  24. resource: { role_id: role.id },
  25. },
  26. organizationSlug
  27. )
  28. if (canAdd) rolesAddable.push(role.id)
  29. const canRemove = doPermissionsCheck(
  30. allPermissions,
  31. PermissionAction.DELETE,
  32. 'auth.subject_roles',
  33. {
  34. resource: { role_id: role.id },
  35. },
  36. organizationSlug
  37. )
  38. if (canRemove) rolesRemovable.push(role.id)
  39. })
  40. return { rolesAddable, rolesRemovable }
  41. }
  42. export const hasMultipleOwners = (members: OrganizationMember[] = [], roles: Role[] = []) => {
  43. const membersWhoAreOwners = members.filter((member) => {
  44. const [memberRoleId] = member.role_ids ?? []
  45. const role = roles.find((role: Role) => role.id === memberRoleId)
  46. return role?.name === 'Owner' && !member.invited_at
  47. })
  48. return membersWhoAreOwners.length > 1
  49. }