import { useQuery } from '@tanstack/react-query' import type { components } from 'api-types' import { z } from 'zod' import { gitHubConfigTomlSchema } from '@/components/interfaces/ConfigDrift/github-config.types' import { get, handleError } from '@/data/fetchers' import type { UseCustomQueryOptions } from '@/types' export type GitHubConfigVariables = { connectionId?: number branch?: string } type GithubConfigQueryResponse = components['schemas']['GetGitHubConnectionConfigResponse'] & { config: z.infer } export const githubConfigKeys = { all: ['github-config'] as const, connection: (connectionId?: number, branch?: string) => [...githubConfigKeys.all, connectionId, branch] as const, } export async function getGitHubConfig( { connectionId, branch }: GitHubConfigVariables, signal?: AbortSignal ) { if (!connectionId) throw new Error('connectionId is required') const { data, error } = await get( '/platform/integrations/github/connections/{connection_id}/config', { params: { path: { connection_id: connectionId }, query: { ref: branch }, }, signal, } ) if (error) return handleError(error) const parsed = gitHubConfigTomlSchema.safeParse(data.config) if (parsed.error) { return handleError( new Error(`Invalid response from Github config API: ${parsed.error.message}`) ) } return { ...data, config: parsed.data, } } export const useGitHubConfigQuery = ( variables: GitHubConfigVariables, { enabled = true, ...options }: UseCustomQueryOptions = {} ) => useQuery({ // eslint-disable-next-line @tanstack/query/exhaustive-deps queryKey: githubConfigKeys.connection(variables.connectionId, variables.branch), queryFn: ({ signal }) => getGitHubConfig(variables, signal), enabled: enabled && typeof variables.connectionId !== 'undefined', staleTime: 30_000, ...options, })