Path: blob/main/components/dashboard/src/data/organizations/members-query.ts
2501 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { OrganizationMember, OrganizationRole } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";7import { useQuery, useQueryClient } from "@tanstack/react-query";8import { useCallback, useMemo } from "react";9import { organizationClient } from "../../service/public-api";10import { useCurrentUser } from "../../user-context";11import { useCurrentOrg } from "./orgs-query";1213export function useOrganizationMembersInvalidator() {14const organizationId = useCurrentOrg().data?.id;15const queryClient = useQueryClient();16return useCallback(() => {17queryClient.invalidateQueries(getQueryKey(organizationId));18}, [organizationId, queryClient]);19}2021export function useListOrganizationMembers() {22const organizationId = useCurrentOrg().data?.id;23const query = useQuery<OrganizationMember[], Error>(24getQueryKey(organizationId),25async () => {26const response = await organizationClient.listOrganizationMembers({27organizationId,28pagination: {29pageSize: 1000,30},31});32return response.members;33},34{35enabled: !!organizationId,36},37);38return query;39}4041export function useIsOwner(): boolean {42const role = useMemberRole();43return role === OrganizationRole.OWNER;44}4546export function useMemberRole(): OrganizationRole {47const user = useCurrentUser();48const members = useListOrganizationMembers();49return useMemo(50() => members.data?.find((m) => m.userId === user?.id)?.role ?? OrganizationRole.UNSPECIFIED,51[members.data, user?.id],52);53}5455const roleScore: Record<OrganizationRole, number> = {56[OrganizationRole.UNSPECIFIED]: 0,57[OrganizationRole.COLLABORATOR]: 1,58[OrganizationRole.MEMBER]: 2,59[OrganizationRole.OWNER]: 3,60};6162// Would be better to align schema.yaml but we can do it simple for now63export function useHasRolePermission(role: OrganizationRole): boolean {64const userRole = useMemberRole();65return useMemo(() => {66if (userRole === OrganizationRole.UNSPECIFIED) {67return false;68}69return roleScore[userRole] >= roleScore[role];70}, [role, userRole]);71}7273function getQueryKey(organizationId: string | undefined) {74return ["listOrganizationMembers", organizationId || "undefined"];75}767778