diff --git a/src/frontend/apps/desk/src/features/members/api/index.ts b/src/frontend/apps/desk/src/features/members/api/index.ts index 19da771..f7b78f2 100644 --- a/src/frontend/apps/desk/src/features/members/api/index.ts +++ b/src/frontend/apps/desk/src/features/members/api/index.ts @@ -1,4 +1,5 @@ export * from './useCreateInvitation'; +export * from './useCreateTeamAccess'; export * from './useTeamsAccesses'; export * from './useUpdateTeamAccess'; export * from './useUsers'; diff --git a/src/frontend/apps/desk/src/features/members/api/useCreateTeamAccess.tsx b/src/frontend/apps/desk/src/features/members/api/useCreateTeamAccess.tsx new file mode 100644 index 0000000..b111785 --- /dev/null +++ b/src/frontend/apps/desk/src/features/members/api/useCreateTeamAccess.tsx @@ -0,0 +1,58 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; + +import { APIError, errorCauses, fetchAPI } from '@/api'; +import { User } from '@/features/auth'; +import { KEY_LIST_TEAM, KEY_TEAM, Team } from '@/features/teams'; + +import { Access, Role } from '../types'; + +import { KEY_LIST_TEAM_ACCESSES } from '.'; + +interface CreateTeamAccessParams { + name: User['name']; + role: Role; + teamId: Team['id']; + userId: User['id']; +} + +export const createTeamAccess = async ({ + userId, + name, + role, + teamId, +}: CreateTeamAccessParams): Promise => { + const response = await fetchAPI(`teams/${teamId}/accesses/`, { + method: 'POST', + body: JSON.stringify({ + user: userId, + role, + }), + }); + + if (!response.ok) { + throw new APIError( + `Failed to add ${name} in the team.`, + await errorCauses(response), + ); + } + + return response.json() as Promise; +}; + +export function useCreateTeamAccess() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: createTeamAccess, + onSuccess: () => { + void queryClient.invalidateQueries({ + queryKey: [KEY_LIST_TEAM], + }); + void queryClient.invalidateQueries({ + queryKey: [KEY_LIST_TEAM_ACCESSES], + }); + void queryClient.invalidateQueries({ + queryKey: [KEY_TEAM], + }); + }, + }); +}