1*f4b1168bSBartosz Kaszubowskiimport { CornerDownRightIcon } from '@expo/styleguide-icons';
2299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown';
3299f02f2SBartosz Kaszubowski
4504f93b3SBartosz Kaszubowskiimport { APIDataType } from '~/components/plugins/api/APIDataType';
5d8d79196SBartosz Kaszubowskiimport {
66b7802baSBartosz Kaszubowski  AccessorDefinitionData,
7d8d79196SBartosz Kaszubowski  MethodDefinitionData,
85990cc31SBartosz Kaszubowski  MethodParamData,
9d8d79196SBartosz Kaszubowski  MethodSignatureData,
10d8d79196SBartosz Kaszubowski  PropData,
11dd9570b9SBartosz Kaszubowski  TypeSignaturesData,
12d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
1325b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote';
14b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
15299f02f2SBartosz Kaszubowskiimport {
16299f02f2SBartosz Kaszubowski  CommentTextBlock,
17adede39aSŁukasz Kosmaty  getMethodName,
18c4c6b9d1SBartosz Kaszubowski  getTagNamesList,
19dc379e46SBartosz Kaszubowski  mdComponents,
207534da61SBartosz Kaszubowski  renderParams,
21299f02f2SBartosz Kaszubowski  resolveTypeName,
226a5c065cSBartosz Kaszubowski  STYLES_APIBOX,
236a5c065cSBartosz Kaszubowski  STYLES_APIBOX_NESTED,
246a5c065cSBartosz Kaszubowski  STYLES_NOT_EXPOSED_HEADER,
25adede39aSŁukasz Kosmaty  TypeDocKind,
26a16a3d18SBartosz Kaszubowski  H3Code,
27a16a3d18SBartosz Kaszubowski  H4Code,
285990cc31SBartosz Kaszubowski  getTagData,
295990cc31SBartosz Kaszubowski  getCommentContent,
30be43ea08SBartosz Kaszubowski  BoxSectionHeader,
31299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
323324c13cSBartosz Kaszubowskiimport { H2, LI, UL, MONOSPACE } from '~/ui/components/Text';
33299f02f2SBartosz Kaszubowski
34299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
35e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
36299f02f2SBartosz Kaszubowski  apiName?: string;
371b3dce65SBartosz Kaszubowski  header?: string;
38adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
39299f02f2SBartosz Kaszubowski};
40299f02f2SBartosz Kaszubowski
414c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = {
424c73bbf6SBartosz Kaszubowski  apiName?: string;
434c73bbf6SBartosz Kaszubowski  header?: string;
444c73bbf6SBartosz Kaszubowski  exposeInSidebar?: boolean;
454c73bbf6SBartosz Kaszubowski};
464c73bbf6SBartosz Kaszubowski
47d8d79196SBartosz Kaszubowskiexport const renderMethod = (
486b7802baSBartosz Kaszubowski  method: MethodDefinitionData | AccessorDefinitionData | PropData,
49dd9570b9SBartosz Kaszubowski  { apiName, exposeInSidebar = true }: RenderMethodOptions = {}
505990cc31SBartosz Kaszubowski) => {
516b7802baSBartosz Kaszubowski  const signatures =
526b7802baSBartosz Kaszubowski    (method as MethodDefinitionData).signatures ||
535990cc31SBartosz Kaszubowski    (method as PropData)?.type?.declaration?.signatures || [
545990cc31SBartosz Kaszubowski      (method as AccessorDefinitionData)?.getSignature,
555990cc31SBartosz Kaszubowski    ] ||
566b7802baSBartosz Kaszubowski    [];
571886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
58dd9570b9SBartosz Kaszubowski  return signatures.map(
595990cc31SBartosz Kaszubowski    ({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => {
605990cc31SBartosz Kaszubowski      const returnComment = getTagData('returns', comment);
615990cc31SBartosz Kaszubowski      return (
626a5c065cSBartosz Kaszubowski        <div
63dd9570b9SBartosz Kaszubowski          key={`method-signature-${method.name || name}-${parameters?.length || 0}`}
6412abeb84SBartosz Kaszubowski          css={[STYLES_APIBOX, STYLES_APIBOX_NESTED]}>
6525b16883SBartosz Kaszubowski          <APISectionDeprecationNote comment={comment} />
66d9bd5b6cSBartosz Kaszubowski          <APISectionPlatformTags comment={comment} prefix="Only for:" />
67c4c6b9d1SBartosz Kaszubowski          <HeaderComponent tags={getTagNamesList(comment)}>
683324c13cSBartosz Kaszubowski            <MONOSPACE weight="medium" css={!exposeInSidebar && STYLES_NOT_EXPOSED_HEADER}>
69adede39aSŁukasz Kosmaty              {getMethodName(method as MethodDefinitionData, apiName, name, parameters)}
703324c13cSBartosz Kaszubowski            </MONOSPACE>
711886d870SBartosz Kaszubowski          </HeaderComponent>
7212abeb84SBartosz Kaszubowski          {parameters && parameters.length > 0 && (
7312abeb84SBartosz Kaszubowski            <>
7412abeb84SBartosz Kaszubowski              {renderParams(parameters)}
7512abeb84SBartosz Kaszubowski              <br />
7612abeb84SBartosz Kaszubowski            </>
7712abeb84SBartosz Kaszubowski          )}
787534da61SBartosz Kaszubowski          <CommentTextBlock comment={comment} includePlatforms={false} />
796a5c065cSBartosz Kaszubowski          {resolveTypeName(type) !== 'undefined' && (
80af644ed4SBartosz Kaszubowski            <>
81be43ea08SBartosz Kaszubowski              <BoxSectionHeader text="Returns" />
82*f4b1168bSBartosz Kaszubowski              <UL className="!list-none !ml-0">
833e972ef8SBartosz Kaszubowski                <LI>
84*f4b1168bSBartosz Kaszubowski                  <CornerDownRightIcon className="inline-block icon-sm text-icon-secondary align-middle mr-2" />
85504f93b3SBartosz Kaszubowski                  <APIDataType typeDefinition={type} />
86299f02f2SBartosz Kaszubowski                </LI>
87299f02f2SBartosz Kaszubowski              </UL>
8812abeb84SBartosz Kaszubowski              <>
8912abeb84SBartosz Kaszubowski                <br />
905990cc31SBartosz Kaszubowski                {returnComment ? (
915990cc31SBartosz Kaszubowski                  <ReactMarkdown components={mdComponents}>
925990cc31SBartosz Kaszubowski                    {getCommentContent(returnComment.content)}
935990cc31SBartosz Kaszubowski                  </ReactMarkdown>
945990cc31SBartosz Kaszubowski                ) : undefined}
9512abeb84SBartosz Kaszubowski              </>
96af644ed4SBartosz Kaszubowski            </>
976a5c065cSBartosz Kaszubowski          )}
98299f02f2SBartosz Kaszubowski        </div>
995990cc31SBartosz Kaszubowski      );
1005990cc31SBartosz Kaszubowski    }
101dd9570b9SBartosz Kaszubowski  );
1021886d870SBartosz Kaszubowski};
103299f02f2SBartosz Kaszubowski
104adede39aSŁukasz Kosmatyconst APISectionMethods = ({
105adede39aSŁukasz Kosmaty  data,
106adede39aSŁukasz Kosmaty  apiName,
107adede39aSŁukasz Kosmaty  header = 'Methods',
108adede39aSŁukasz Kosmaty  exposeInSidebar = true,
109adede39aSŁukasz Kosmaty}: APISectionMethodsProps) =>
110299f02f2SBartosz Kaszubowski  data?.length ? (
111299f02f2SBartosz Kaszubowski    <>
11207ffa84cSBartosz Kaszubowski      <H2 key={`${header}-header`}>{header}</H2>
1134c73bbf6SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData) =>
114adede39aSŁukasz Kosmaty        renderMethod(method, { apiName, header, exposeInSidebar })
115e3060685SBartosz Kaszubowski      )}
116299f02f2SBartosz Kaszubowski    </>
117299f02f2SBartosz Kaszubowski  ) : null;
118299f02f2SBartosz Kaszubowski
119299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
120adede39aSŁukasz Kosmaty
121adede39aSŁukasz Kosmatyexport const APIMethod = ({
122adede39aSŁukasz Kosmaty  name,
123adede39aSŁukasz Kosmaty  comment,
124adede39aSŁukasz Kosmaty  returnTypeName,
125adede39aSŁukasz Kosmaty  isProperty = false,
126adede39aSŁukasz Kosmaty  isReturnTypeReference = false,
127adede39aSŁukasz Kosmaty  exposeInSidebar = false,
128adede39aSŁukasz Kosmaty  parameters = [],
129c468593bSŁukasz Kosmaty  platforms = [],
130adede39aSŁukasz Kosmaty}: {
131adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
132adede39aSŁukasz Kosmaty  name: string;
133adede39aSŁukasz Kosmaty  comment: string;
134adede39aSŁukasz Kosmaty  returnTypeName: string;
135adede39aSŁukasz Kosmaty  isProperty: boolean;
136adede39aSŁukasz Kosmaty  isReturnTypeReference: boolean;
137c468593bSŁukasz Kosmaty  platforms: ('Android' | 'iOS' | 'Web')[];
138adede39aSŁukasz Kosmaty  parameters: {
139adede39aSŁukasz Kosmaty    name: string;
140adede39aSŁukasz Kosmaty    comment?: string;
141adede39aSŁukasz Kosmaty    typeName: string;
142adede39aSŁukasz Kosmaty    isReference?: boolean;
143adede39aSŁukasz Kosmaty  }[];
1445990cc31SBartosz Kaszubowski}) => {
1455990cc31SBartosz Kaszubowski  const parsedParameters = parameters.map(
1465990cc31SBartosz Kaszubowski    param =>
1475990cc31SBartosz Kaszubowski      ({
148adede39aSŁukasz Kosmaty        name: param.name,
149adede39aSŁukasz Kosmaty        type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' },
150adede39aSŁukasz Kosmaty        comment: {
1515990cc31SBartosz Kaszubowski          summary: [{ kind: 'text', text: param.comment }],
152adede39aSŁukasz Kosmaty        },
1535990cc31SBartosz Kaszubowski      } as MethodParamData)
1545990cc31SBartosz Kaszubowski  );
155adede39aSŁukasz Kosmaty  return renderMethod(
156adede39aSŁukasz Kosmaty    {
157adede39aSŁukasz Kosmaty      name,
158adede39aSŁukasz Kosmaty      signatures: [
159adede39aSŁukasz Kosmaty        {
160adede39aSŁukasz Kosmaty          name,
161adede39aSŁukasz Kosmaty          parameters: parsedParameters,
162adede39aSŁukasz Kosmaty          comment: {
1635990cc31SBartosz Kaszubowski            summary: [{ kind: 'text', text: comment }],
1645990cc31SBartosz Kaszubowski            blockTags: platforms.map(text => ({
165c468593bSŁukasz Kosmaty              tag: 'platform',
1665990cc31SBartosz Kaszubowski              content: [{ kind: 'text', text }],
167c468593bSŁukasz Kosmaty            })),
168adede39aSŁukasz Kosmaty          },
169adede39aSŁukasz Kosmaty          type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' },
170adede39aSŁukasz Kosmaty        },
171adede39aSŁukasz Kosmaty      ],
172adede39aSŁukasz Kosmaty      kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function,
173adede39aSŁukasz Kosmaty    },
174adede39aSŁukasz Kosmaty    { exposeInSidebar }
175adede39aSŁukasz Kosmaty  );
176adede39aSŁukasz Kosmaty};
177