import { CornerDownRightIcon } from '@expo/styleguide-icons';
import ReactMarkdown from 'react-markdown';
import { APIDataType } from '~/components/plugins/api/APIDataType';
import {
AccessorDefinitionData,
MethodDefinitionData,
MethodParamData,
MethodSignatureData,
PropData,
TypeSignaturesData,
} from '~/components/plugins/api/APIDataTypes';
import { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote';
import { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
import {
CommentTextBlock,
getMethodName,
getTagNamesList,
mdComponents,
renderParams,
resolveTypeName,
STYLES_APIBOX,
STYLES_APIBOX_NESTED,
STYLES_NOT_EXPOSED_HEADER,
TypeDocKind,
H3Code,
H4Code,
getTagData,
getCommentContent,
BoxSectionHeader,
} from '~/components/plugins/api/APISectionUtils';
import { H2, LI, UL, MONOSPACE } from '~/ui/components/Text';
export type APISectionMethodsProps = {
data: (MethodDefinitionData | PropData)[];
apiName?: string;
header?: string;
exposeInSidebar?: boolean;
};
export type RenderMethodOptions = {
apiName?: string;
header?: string;
exposeInSidebar?: boolean;
};
export const renderMethod = (
method: MethodDefinitionData | AccessorDefinitionData | PropData,
{ apiName, exposeInSidebar = true }: RenderMethodOptions = {}
) => {
const signatures =
(method as MethodDefinitionData).signatures ||
(method as PropData)?.type?.declaration?.signatures || [
(method as AccessorDefinitionData)?.getSignature,
] ||
[];
const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
return signatures.map(
({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => {
const returnComment = getTagData('returns', comment);
return (
{getMethodName(method as MethodDefinitionData, apiName, name, parameters)}
{parameters && parameters.length > 0 && (
<>
{renderParams(parameters)}
>
)}
{resolveTypeName(type) !== 'undefined' && (
<>
<>
{returnComment ? (
{getCommentContent(returnComment.content)}
) : undefined}
>
>
)}
);
}
);
};
const APISectionMethods = ({
data,
apiName,
header = 'Methods',
exposeInSidebar = true,
}: APISectionMethodsProps) =>
data?.length ? (
<>
{header}
{data.map((method: MethodDefinitionData | PropData) =>
renderMethod(method, { apiName, header, exposeInSidebar })
)}
>
) : null;
export default APISectionMethods;
export const APIMethod = ({
name,
comment,
returnTypeName,
isProperty = false,
isReturnTypeReference = false,
exposeInSidebar = false,
parameters = [],
platforms = [],
}: {
exposeInSidebar?: boolean;
name: string;
comment: string;
returnTypeName: string;
isProperty: boolean;
isReturnTypeReference: boolean;
platforms: ('Android' | 'iOS' | 'Web')[];
parameters: {
name: string;
comment?: string;
typeName: string;
isReference?: boolean;
}[];
}) => {
const parsedParameters = parameters.map(
param =>
({
name: param.name,
type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' },
comment: {
summary: [{ kind: 'text', text: param.comment }],
},
} as MethodParamData)
);
return renderMethod(
{
name,
signatures: [
{
name,
parameters: parsedParameters,
comment: {
summary: [{ kind: 'text', text: comment }],
blockTags: platforms.map(text => ({
tag: 'platform',
content: [{ kind: 'text', text }],
})),
},
type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' },
},
],
kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function,
},
{ exposeInSidebar }
);
};