RPC.tsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { useParams } from 'common'
  2. import { useEffect } from 'react'
  3. import { Badge } from 'ui'
  4. import { DOCS_RESOURCE_CONTENT } from '../ProjectAPIDocs.constants'
  5. import ResourceContent from '../ResourceContent'
  6. import type { ContentProps } from './Content.types'
  7. import Table from '@/components/to-be-cleaned/Table'
  8. import { useProjectJsonSchemaQuery } from '@/data/docs/project-json-schema-query'
  9. import { useOpenAPISpecQuery } from '@/data/open-api/api-spec-query'
  10. import { useAppStateSnapshot } from '@/state/app-state'
  11. export const RPC = ({ language }: ContentProps) => {
  12. const { ref } = useParams()
  13. const snap = useAppStateSnapshot()
  14. const { data: jsonSchema, refetch: refetchJsonSchema } = useProjectJsonSchemaQuery({
  15. projectRef: ref,
  16. })
  17. const { data, refetch: refetchOpenAPISpec } = useOpenAPISpecQuery({ projectRef: ref })
  18. const functions = data?.functions ?? []
  19. const rpcName = snap.activeDocsSection[1]
  20. const rpc = functions.find((fn) => fn.name === rpcName)
  21. const {
  22. post: { parameters: postParameters },
  23. } = rpc ?? {}
  24. const rpcJsonSchema = jsonSchema?.paths[rpc?.path]
  25. const summary = rpcJsonSchema?.post?.summary
  26. const rpcParamsObject =
  27. postParameters &&
  28. postParameters[0] &&
  29. postParameters[0].schema &&
  30. postParameters[0].schema.properties
  31. ? postParameters[0].schema.properties
  32. : {}
  33. const parameters: { name: string; format: string; type: string; required: boolean }[] =
  34. Object.entries(rpcParamsObject)
  35. .map(([k, v]: any) => ({
  36. name: k,
  37. ...v,
  38. required: postParameters[0].schema.required.includes(k),
  39. }))
  40. .filter((x) => !!x.name)
  41. useEffect(() => {
  42. if (rpcName !== undefined) {
  43. refetchJsonSchema()
  44. refetchOpenAPISpec()
  45. }
  46. }, [rpcName])
  47. if (rpc === undefined) return null
  48. return (
  49. <div className="divide-y">
  50. <div className="space-y-1 px-4 py-4">
  51. <h2>{rpc.name}</h2>
  52. <p className="text-sm text-foreground-light">{summary ?? 'No description available'}</p>
  53. </div>
  54. <div className="space-y-2 px-4 py-4">
  55. <p className="text-sm text-foreground-light">Function arguments</p>
  56. <Table
  57. head={[
  58. <Table.th key="name">Name</Table.th>,
  59. <Table.th key="format">Format</Table.th>,
  60. <Table.th key="type">Type</Table.th>,
  61. <Table.th key="required"></Table.th>,
  62. ]}
  63. body={parameters.map((parameter) => (
  64. <Table.tr key={parameter.name}>
  65. <Table.td title={parameter.name}>
  66. <p className="font-mono text-xs text-foreground truncate">{parameter.name}</p>
  67. </Table.td>
  68. <Table.td title={parameter.format}>{parameter.format}</Table.td>
  69. <Table.td title={parameter.type}>{parameter.type}</Table.td>
  70. <Table.td>
  71. {parameter.required ? (
  72. <Badge variant="warning">Required</Badge>
  73. ) : (
  74. <Badge variant="default">Optional</Badge>
  75. )}
  76. </Table.td>
  77. </Table.tr>
  78. ))}
  79. />
  80. </div>
  81. <ResourceContent
  82. selectedLanguage={language}
  83. snippet={DOCS_RESOURCE_CONTENT.rpcSingle}
  84. codeSnippets={DOCS_RESOURCE_CONTENT.rpcSingle.code({
  85. rpcName,
  86. rpcParams: parameters,
  87. endpoint: 'endpoint',
  88. apiKey: 'apiKey',
  89. showBearer: true,
  90. })}
  91. />
  92. </div>
  93. )
  94. }