import pgMeta from '@supabase/pg-meta' import { QueryClient, useQuery } from '@tanstack/react-query' import { z } from 'zod' import { databaseKeys } from './keys' import { executeSql } from '@/data/sql/execute-sql-mutation' import { EMPTY_ARR } from '@/lib/void' import { ResponseError, UseCustomQueryOptions } from '@/types' export type SchemasVariables = { projectRef?: string connectionString?: string | null } export type Schema = z.infer const pgMetaSchemasList = pgMeta.schemas.list() export type SchemasData = z.infer export type SchemasError = ResponseError export async function getSchemas( { projectRef, connectionString }: SchemasVariables, signal?: AbortSignal ) { const { result } = await executeSql( { projectRef, connectionString, sql: pgMetaSchemasList.sql, queryKey: ['schemas'], }, signal ) return Array.isArray(result) ? result : EMPTY_ARR } export const useSchemasQuery = ( { projectRef, connectionString }: SchemasVariables, { enabled = true, ...options }: UseCustomQueryOptions = {} ) => useQuery({ queryKey: databaseKeys.schemas(projectRef), queryFn: ({ signal }) => getSchemas({ projectRef, connectionString }, signal), enabled: enabled && typeof projectRef !== 'undefined', ...options, }) export function invalidateSchemasQuery(client: QueryClient, projectRef: string | undefined) { return client.invalidateQueries({ queryKey: databaseKeys.schemas(projectRef) }) } export function prefetchSchemas( client: QueryClient, { projectRef, connectionString }: SchemasVariables ) { return client.fetchQuery({ queryKey: databaseKeys.schemas(projectRef), queryFn: ({ signal }) => getSchemas({ projectRef, connectionString }, signal), }) }