import { safeSql } from '@supabase/pg-meta/src/pg-format' import { QueryClient, useQuery, UseQueryOptions } from '@tanstack/react-query' import { z } from 'zod' import { stripeSyncKeys } from './keys' import { executeSql } from '@/data/sql/execute-sql-mutation' import { ResponseError } from '@/types' export type DbConnection = { projectRef: string connectionString?: string | null } const StripeSyncStateSchema = z .object({ started_at: z.string().nullable(), closed_at: z.string().nullable(), status: z.enum(['running', 'pending', 'complete', 'error']).nullable(), }) .nullable() export type StripeSyncState = z.infer export type StripeSyncStateData = z.infer export type StripeSyncStateError = ResponseError export async function getStripeSyncState( { projectRef, connectionString }: DbConnection, signal?: AbortSignal ) { const { result } = await executeSql( { projectRef, connectionString, sql: safeSql` SELECT started_at, closed_at, status FROM stripe.sync_runs WHERE status != 'pending' ORDER BY started_at DESC LIMIT 1; `, queryKey: stripeSyncKeys.syncState(projectRef), }, signal ) return result.length > 0 ? StripeSyncStateSchema.parse(result[0]) : null } export const useStripeSyncingState = ( { projectRef, connectionString }: DbConnection, { enabled = true, ...options }: Omit< UseQueryOptions, 'queryKey' | 'queryFn' > = {} ) => { return useQuery({ queryKey: stripeSyncKeys.syncState(projectRef), queryFn: ({ signal }) => getStripeSyncState({ projectRef, connectionString }, signal), enabled: enabled && typeof projectRef !== 'undefined', ...options, }) } export function invalidateStripeSyncStateQuery(client: QueryClient, projectRef: string) { return client.invalidateQueries({ queryKey: stripeSyncKeys.syncState(projectRef) }) }