Files
supabase/studio/hooks/analytics/useDbQuery.tsx
T
2023-03-01 19:37:06 +08:00

55 lines
1.5 KiB
TypeScript

import { useQuery } from '@tanstack/react-query'
import { DEFAULT_QUERY_PARAMS } from 'components/interfaces/Reports/Reports.constants'
import {
BaseReportParams,
DbQueryData,
DbQueryHandler,
MetaQueryResponse,
ReportQuery,
} from 'components/interfaces/Reports/Reports.types'
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
import { executeSql } from 'data/sql/execute-sql-query'
type UseDbQuery = (
sql: ReportQuery['sql'],
params?: BaseReportParams
) => [DbQueryData, DbQueryHandler]
const useDbQuery: UseDbQuery = (sql, params = DEFAULT_QUERY_PARAMS) => {
const { project } = useProjectContext()
const resolvedSql = typeof sql === 'function' ? sql([]) : sql
const {
data,
error: rqError,
isLoading,
isRefetching,
refetch,
} = useQuery(
['projects', project?.ref, 'db', { ...params, sql: resolvedSql }],
({ signal }) => {
return executeSql(
{
projectRef: project?.ref,
connectionString: project?.connectionString,
sql: resolvedSql,
},
signal
).then((res) => res.result) as Promise<MetaQueryResponse>
},
{
enabled: Boolean(resolvedSql),
refetchOnWindowFocus: false,
refetchOnReconnect: false,
}
)
const error = rqError || (typeof data === 'object' ? data?.error : '')
return [
{ error, data, isLoading: isLoading || isRefetching, params },
{ runQuery: () => refetch() },
]
}
export default useDbQuery