import { useQuery } from '@tanstack/react-query' import { components } from 'api-types' import { remapSqlContentFields } from './content-remap' import { contentKeys } from './keys' import { get, handleError } from '@/data/fetchers' import type { Dashboards, LogSqlSnippets, Notebooks, SqlSnippets, UseCustomQueryOptions, } from '@/types' // TODO — Charis 2026-08-06 // Temporary widening until we have API support for notebooks export type ContentBase = Omit< components['schemas']['GetUserContentResponse']['data'][number], 'type' > & { type: components['schemas']['GetUserContentResponse']['data'][number]['type'] | 'notebook' } export type Content = Omit & ( | { type: 'sql' content: SqlSnippets.Content } | { type: 'report' content: Dashboards.Content } | { type: 'log_sql' content: LogSqlSnippets.Content } | { type: 'notebook' content: Notebooks.Content } ) export type ContentType = Content['type'] // Narrows the full Content union down to a single content type — for call sites that already // know (from the `type` they queried with) which member they're holding, since useContentQuery // et al. don't parameterize their return type by the `type` argument. export type ContentOfType = Extract interface GetContentVariables { projectRef?: string type: ContentType name?: string limit?: number } export async function getContent( { projectRef, type, name, limit = 10 }: GetContentVariables, signal?: AbortSignal, headers?: HeadersInit ) { if (typeof projectRef === 'undefined') { throw new Error('projectRef is required for getContent') } const { data, error } = await get('/platform/projects/{ref}/content', { params: { path: { ref: projectRef }, // TODO — Charis 2026-08-06 // Cast until the generated query param type picks up 'notebook' (see ContentBase above) query: { type: type as 'sql' | 'report' | 'log_sql', name, limit: limit.toString() }, }, headers, signal, }) if (error) handleError(error) return { cursor: data.cursor, content: remapSqlContentFields(data.data as unknown as Content[]), } } export type ContentData = Awaited> export type ContentError = unknown /** @deprecated Use useContentInfiniteQuery from content-infinite-query instead */ export const useContentQuery = ( { projectRef, type, name, limit }: GetContentVariables, { enabled = true, ...options }: UseCustomQueryOptions = {} ) => useQuery({ queryKey: contentKeys.list(projectRef, { type, name, limit }), queryFn: ({ signal }) => getContent({ projectRef, type, name, limit }, signal), enabled: enabled && typeof projectRef !== 'undefined', ...options, })