DocsTab.tsx 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import { useParams } from 'common'
  2. import { useMemo, useState } from 'react'
  3. import { ShimmeringLoader } from 'ui-patterns'
  4. import type { ShowApiKey } from '../../Docs/Docs.types'
  5. import { LangSelector } from '../../Docs/LangSelector'
  6. import { DataApiDisabledState } from '@/components/interfaces/Integrations/DataApi/DataApiDisabledState'
  7. import { DocsMenu } from '@/components/interfaces/Integrations/DataApi/DocsMenu'
  8. import { DocsMobileNav } from '@/components/interfaces/Integrations/DataApi/DocsMobileNav'
  9. import { DocView } from '@/components/interfaces/Integrations/DataApi/DocView'
  10. import { generateDocsMenu, getActivePage } from '@/components/layouts/DocsLayout/DocsLayout.utils'
  11. import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query'
  12. import { useIsDataApiEnabled } from '@/hooks/misc/useIsDataApiEnabled'
  13. import { useIsFeatureEnabled } from '@/hooks/misc/useIsFeatureEnabled'
  14. import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject'
  15. import { PROJECT_STATUS } from '@/lib/constants'
  16. export const DataApiDocsTab = () => {
  17. const DEFAULT_KEY = { name: 'hide', key: 'BRIVEN_KEY' }
  18. const { ref: projectRef, page, resource, rpc } = useParams()
  19. const { data: project } = useSelectedProjectQuery()
  20. const { projectAuthAll: authEnabled } = useIsFeatureEnabled(['project_auth:all'])
  21. const isPaused = project?.status === PROJECT_STATUS.INACTIVE
  22. const [selectedLang, setSelectedLang] = useState<'js' | 'bash'>('js')
  23. const [selectedApiKey, setSelectedApiKey] = useState<ShowApiKey>(DEFAULT_KEY)
  24. const { isEnabled, isPending: isConfigLoading } = useIsDataApiEnabled({ projectRef })
  25. const { data: openApiSpec } = useOpenAPISpecQuery(
  26. { projectRef },
  27. {
  28. enabled: !!projectRef && !isPaused && isEnabled,
  29. }
  30. )
  31. const tableNames = useMemo(
  32. () => (openApiSpec?.tables ?? []).map((table) => table.name),
  33. [openApiSpec]
  34. )
  35. const functionNames = useMemo(
  36. () => (openApiSpec?.functions ?? []).map((fn) => fn.name),
  37. [openApiSpec]
  38. )
  39. const activePage = useMemo(() => getActivePage({ page, resource, rpc }), [page, resource, rpc])
  40. const docsBasePath = projectRef ? `/project/${projectRef}/integrations/data_api/docs` : undefined
  41. const menu = useMemo(() => {
  42. if (!projectRef) return []
  43. return generateDocsMenu(projectRef, tableNames, functionNames, { authEnabled }, docsBasePath)
  44. }, [projectRef, tableNames, functionNames, authEnabled, docsBasePath])
  45. if (isConfigLoading) {
  46. return (
  47. <div className="flex w-full bg-surface-100 flex-1 items-stretch p-10">
  48. <ShimmeringLoader className="w-full h-full" />
  49. </div>
  50. )
  51. }
  52. if (!isEnabled) {
  53. return <DataApiDisabledState description="view the documentation" />
  54. }
  55. return (
  56. <div className="flex w-full bg-surface-100 flex-1 items-stretch">
  57. <aside className="hidden lg:flex flex-col gap-y-6 w-60 shrink-0 p-10">
  58. <LangSelector
  59. selectedLang={selectedLang}
  60. selectedApiKey={selectedApiKey}
  61. setSelectedLang={(lang: 'js' | 'bash') => setSelectedLang(lang)}
  62. setSelectedApiKey={setSelectedApiKey}
  63. />
  64. <DocsMenu activePage={activePage} menu={menu} />
  65. </aside>
  66. <div className="flex-1 min-w-0 relative">
  67. <DocsMobileNav
  68. activePage={activePage}
  69. menu={menu}
  70. selectedLang={selectedLang}
  71. selectedApiKey={selectedApiKey}
  72. setSelectedLang={setSelectedLang}
  73. setSelectedApiKey={setSelectedApiKey}
  74. />
  75. <DocView selectedLang={selectedLang} selectedApiKey={selectedApiKey} />
  76. </div>
  77. </div>
  78. )
  79. }