import { useMutation, useQueryClient } from '@tanstack/react-query' import { integrationKeys } from './keys' import { handleError, post } from '@/data/fetchers' import type { ResponseError, UseCustomMutationOptions } from '@/types' export type VercelIntegrationCreateVariables = { code: string configurationId: string orgSlug: string metadata: { [key: string]: string } source: string // teamId is only present when a team is being installed // personal accounts (hobby) will not have this value defined teamId?: string } export async function createVercelIntegration({ code, configurationId, orgSlug, metadata, source, teamId, }: VercelIntegrationCreateVariables) { const { data, error } = await post('/platform/integrations/vercel', { body: { code, configuration_id: configurationId, organization_slug: orgSlug, metadata: metadata as Record, source, teamId, }, }) if (error) handleError(error) // [Joshen] API isn't typed on this endpoint // https://github.com/supabase/platform/blob/develop/api/src/routes/platform/integrations/vercel/vercel-integration.controller.ts#L50 return data as { id: string } } type VercelIntegrationCreateData = Awaited> export const useVercelIntegrationCreateMutation = ({ onSuccess, onError, ...options }: Omit< UseCustomMutationOptions< VercelIntegrationCreateData, ResponseError, VercelIntegrationCreateVariables >, 'mutationFn' > = {}) => { const queryClient = useQueryClient() return useMutation({ mutationFn: (vars) => createVercelIntegration(vars), async onSuccess(data, variables, context) { await Promise.all([ queryClient.invalidateQueries({ queryKey: integrationKeys.integrationsList() }), queryClient.invalidateQueries({ queryKey: integrationKeys.integrationsListWithOrg(variables.orgSlug), }), queryClient.invalidateQueries({ queryKey: integrationKeys.vercelProjectList(data.id) }), ]) await onSuccess?.(data, variables, context) }, async onError(data, variables, context) { await onError?.(data, variables, context) }, ...options, }) }