1import React from 'react'; 2import ReactMarkdown from 'react-markdown'; 3 4import { InlineCode } from '~/components/base/code'; 5import { LI, UL } from '~/components/base/list'; 6import { H2, H3Code, H4 } from '~/components/plugins/Headings'; 7import { MethodDefinitionData, MethodSignatureData } from '~/components/plugins/api/APIDataTypes'; 8import { 9 CommentTextBlock, 10 mdRenderers, 11 renderParam, 12 resolveTypeName, 13} from '~/components/plugins/api/APISectionUtils'; 14 15export type APISectionMethodsProps = { 16 data: MethodDefinitionData[]; 17 apiName?: string; 18 header?: string; 19}; 20 21const renderMethod = ( 22 { signatures }: MethodDefinitionData, 23 index: number, 24 dataLength?: number, 25 apiName?: string 26): JSX.Element[] => 27 signatures.map(({ name, parameters, comment, type }: MethodSignatureData) => ( 28 <div key={`method-signature-${name}-${parameters?.length || 0}`}> 29 <H3Code> 30 <InlineCode> 31 {apiName ? `${apiName}.` : ''} 32 {name}({parameters?.map(param => param.name).join(', ')}) 33 </InlineCode> 34 </H3Code> 35 <CommentTextBlock 36 comment={comment} 37 beforeContent={ 38 parameters ? ( 39 <> 40 <H4>Arguments</H4> 41 <UL>{parameters?.map(renderParam)}</UL> 42 </> 43 ) : undefined 44 } 45 /> 46 {resolveTypeName(type) !== 'undefined' ? ( 47 <div> 48 <H4>Returns</H4> 49 <UL> 50 <LI returnType> 51 <InlineCode>{resolveTypeName(type)}</InlineCode> 52 </LI> 53 </UL> 54 {comment?.returns ? ( 55 <ReactMarkdown renderers={mdRenderers}>{comment.returns}</ReactMarkdown> 56 ) : null} 57 </div> 58 ) : null} 59 {index + 1 !== dataLength ? <hr /> : null} 60 </div> 61 )); 62 63const APISectionMethods: React.FC<APISectionMethodsProps> = ({ 64 data, 65 apiName, 66 header = 'Methods', 67}) => 68 data?.length ? ( 69 <> 70 <H2 key="methods-header">{header}</H2> 71 {data.map((method, index) => renderMethod(method, index, data.length, apiName))} 72 </> 73 ) : null; 74 75export default APISectionMethods; 76