import {APIFunction} from '@sanity/tsdoc' import {TSDocAppParams} from '@sanity/tsdoc/store' import {Box, Card, Stack} from '@sanity/ui' import {useMemo} from 'react' import {TSDocSymbol, TSDocSymbolPreview} from '../../app' import {CommentExampleBlocks, CommentRemarks, CommentReturnType} from '../../comment' import {H, P} from '../../lib/ui' import {Members} from '../members' import {_getMembers} from '../members/helpers' import {TSDocCode} from '../TSDocCode' export function FunctionContent(props: {data: APIFunction}): React.ReactNode { const {data} = props const {comment, name, parameters, propsType, returnType, typeParameters} = data const propsTypeMembers = useMemo(() => propsType && _getMembers(propsType), [propsType]) const codePrefix = useMemo( () => [ `function ${name}`, typeParameters.length > 0 ? `<${typeParameters .map((p) => { let n = p.name if (p.constraintType && p.constraintType.length > 0) { n = `${n} extends ${p.constraintType.map((t) => t.text).join('')}` } if (p.defaultType.length > 0) { n = `${n} = ${p.defaultType.map((t) => t.text).join('')}` } return n }) .join(', ')}>` : '', `(${parameters .map((param) => `${param.name}: ${param.type.map((t) => t.text).join('')}`) .join(', ')}): `, ].join(''), [name, parameters, typeParameters], ) const propsTypeLinkParams: TSDocAppParams | null = useMemo( () => propsType?.export?.path && propsType?.package?.name && propsType?.name && propsType.release?.version ? { exportPath: propsType.export.path, packageName: propsType.package.name, packageScope: propsType.package.scope || null, memberName: propsType.name, releaseVersion: propsType.release.version, } : null, [propsType], ) return ( <> Signature {propsType && propsTypeLinkParams && propsTypeMembers && ( <> Props

Defined by the{' '} {' '} interface.

{propsTypeMembers.length > 0 && } {propsTypeMembers.length === 0 && ( <>

No members.

)} )} {returnType.length > 0 ? ( <> Returns {comment && } ) : null} {comment && } {comment && } ) }