import { useState } from 'react' import { useParams } from 'common/hooks' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { useProjectApiQuery } from 'data/config/project-api-query' import { useProjectJsonSchemaQuery } from 'data/docs/project-json-schema-query' import { useTableQuery } from 'data/tables/table-query' import { snakeToCamel } from 'lib/helpers' import { IconBookOpen, SidePanel } from 'ui' import { ResourceContent } from '../Docs' import GeneratingTypes from '../Docs/GeneratingTypes' import LangSelector from '../Docs/LangSelector' import ActionBar from './SidePanelEditor/ActionBar' export interface APIDocumentationPanelProps { visible: boolean onClose: () => void } const APIDocumentationPanel = ({ visible, onClose }: APIDocumentationPanelProps) => { const { project } = useProjectContext() const { ref, page, id: _id } = useParams() const id = _id ? Number(_id) : undefined const { data: table } = useTableQuery({ projectRef: project?.ref, connectionString: project?.connectionString, id, }) const { data: jsonSchema, error: jsonSchemaError, isError: isErrorJSONSchema, isSuccess: isSuccessJSONSchema, refetch, } = useProjectJsonSchemaQuery({ projectRef: ref }) const { data: settings } = useProjectApiQuery({ projectRef: ref }) const DEFAULT_KEY = { name: 'hide', key: 'SUPABASE_KEY' } const [selectedLang, setSelectedLang] = useState('js') const [showApiKey, setShowApiKey] = useState(DEFAULT_KEY) const autoApiService = { ...settings?.autoApiService, endpoint: `${settings?.autoApiService.protocol ?? 'https'}://${ settings?.autoApiService.endpoint ?? '-' }`, } const apiService = settings?.autoApiService const anonKey = apiService?.service_api_keys.find((x) => x.name === 'anon key') ? apiService.defaultApiKey : undefined const resources = getResourcesFromJsonSchema(jsonSchema) function getResourcesFromJsonSchema(value: any) { const { paths } = value || {} const functionPath = 'rpc/' let resources: any = {} Object.entries(paths || []).forEach(([name, val]) => { let trimmed = name.slice(1) let id = trimmed.replace(functionPath, '') let displayName = id.replace(/_/g, ' ') let camelCase = snakeToCamel(id) let enriched = { id, displayName, camelCase } if (!trimmed.length) return else resources[id] = enriched }) return resources } return ( onClose()} header={ API } customFooter={ onClose()} /> } >
{isErrorJSONSchema && (

Error connecting to API

{`${jsonSchemaError}`}

)} {isSuccessJSONSchema && ( <> {jsonSchema ? ( <>
{jsonSchema?.definitions && ( await refetch()} /> )}
) : (

Building docs ...

)} )}
) } export default APIDocumentationPanel