Files
supabase/apps/studio/data/platform-apps/platform-app-query.ts
T
kemal.earth a9a1326b92 feat(studio): private apps ui (#43382)
## I have read the
[CONTRIBUTING.md](https://github.com/supabase/supabase/blob/master/CONTRIBUTING.md)
file.

YES

## What kind of change does this PR introduce?

This is a prototype for private apps UI. There are no endpoints at the
minute, just wanted to see what a potential flow could look like.
2026-03-23 10:51:04 -06:00

49 lines
1.6 KiB
TypeScript

import { useQuery } from '@tanstack/react-query'
import type { components } from 'api-types'
import { constructHeaders, fetchHandler, handleError } from 'data/fetchers'
import { API_URL } from 'lib/constants'
import type { ResponseError, UseCustomQueryOptions } from 'types'
import { platformAppKeys } from './keys'
export type PlatformAppVariables = {
slug?: string
id?: string
}
export type PlatformAppDetail = components['schemas']['GetPlatformAppResponse']
export async function getPlatformApp({ slug, id }: PlatformAppVariables, signal?: AbortSignal) {
if (!slug) throw new Error('slug is required')
if (!id) throw new Error('id is required')
const baseUrl = API_URL?.replace('/platform', '')
const url = `${baseUrl}/platform/organizations/${slug}/apps/${id}`
const headers = await constructHeaders()
const res = await fetchHandler(url, { method: 'GET', headers, signal })
if (!res.ok) {
const body = await res.json().catch(() => ({}))
handleError(body)
}
return res.json() as Promise<PlatformAppDetail>
}
export type PlatformAppData = Awaited<ReturnType<typeof getPlatformApp>>
export type PlatformAppError = ResponseError
export const usePlatformAppQuery = <TData = PlatformAppData>(
{ slug, id }: PlatformAppVariables,
{
enabled = true,
...options
}: UseCustomQueryOptions<PlatformAppData, PlatformAppError, TData> = {}
) =>
useQuery<PlatformAppData, PlatformAppError, TData>({
queryKey: platformAppKeys.detail(slug, id),
queryFn: ({ signal }) => getPlatformApp({ slug, id }, signal),
enabled: enabled && typeof slug !== 'undefined' && typeof id !== 'undefined',
...options,
})