13e972ef8SBartosz Kaszubowskiimport { css } from '@emotion/react';
23e972ef8SBartosz Kaszubowskiimport { theme, spacing, UndoIcon, iconSize } from '@expo/styleguide';
3299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown';
4299f02f2SBartosz Kaszubowski
51886d870SBartosz Kaszubowskiimport { H2, H3Code, H4, H4Code } from '~/components/plugins/Headings';
6504f93b3SBartosz Kaszubowskiimport { APIDataType } from '~/components/plugins/api/APIDataType';
7d8d79196SBartosz Kaszubowskiimport {
86b7802baSBartosz Kaszubowski  AccessorDefinitionData,
9d8d79196SBartosz Kaszubowski  MethodDefinitionData,
10d8d79196SBartosz Kaszubowski  MethodSignatureData,
11d8d79196SBartosz Kaszubowski  PropData,
12dd9570b9SBartosz Kaszubowski  TypeSignaturesData,
13d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
1425b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote';
15b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
16299f02f2SBartosz Kaszubowskiimport {
17299f02f2SBartosz Kaszubowski  CommentTextBlock,
18adede39aSŁukasz Kosmaty  getMethodName,
19c4c6b9d1SBartosz Kaszubowski  getTagNamesList,
20dc379e46SBartosz Kaszubowski  mdComponents,
217534da61SBartosz Kaszubowski  renderParams,
22299f02f2SBartosz Kaszubowski  resolveTypeName,
236a5c065cSBartosz Kaszubowski  STYLES_APIBOX,
246a5c065cSBartosz Kaszubowski  STYLES_APIBOX_NESTED,
256a5c065cSBartosz Kaszubowski  STYLES_NESTED_SECTION_HEADER,
266a5c065cSBartosz Kaszubowski  STYLES_NOT_EXPOSED_HEADER,
27adede39aSŁukasz Kosmaty  TypeDocKind,
28299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
29*12abeb84SBartosz Kaszubowskiimport { LI, UL, CODE } from '~/ui/components/Text';
30299f02f2SBartosz Kaszubowski
31299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
32e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
33299f02f2SBartosz Kaszubowski  apiName?: string;
341b3dce65SBartosz Kaszubowski  header?: string;
35adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
36299f02f2SBartosz Kaszubowski};
37299f02f2SBartosz Kaszubowski
384c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = {
394c73bbf6SBartosz Kaszubowski  apiName?: string;
404c73bbf6SBartosz Kaszubowski  header?: string;
414c73bbf6SBartosz Kaszubowski  exposeInSidebar?: boolean;
424c73bbf6SBartosz Kaszubowski};
434c73bbf6SBartosz Kaszubowski
44d8d79196SBartosz Kaszubowskiexport const renderMethod = (
456b7802baSBartosz Kaszubowski  method: MethodDefinitionData | AccessorDefinitionData | PropData,
46dd9570b9SBartosz Kaszubowski  { apiName, exposeInSidebar = true }: RenderMethodOptions = {}
471886d870SBartosz Kaszubowski): JSX.Element[] => {
486b7802baSBartosz Kaszubowski  const signatures =
496b7802baSBartosz Kaszubowski    (method as MethodDefinitionData).signatures ||
506b7802baSBartosz Kaszubowski    (method as PropData)?.type?.declaration?.signatures ||
516b7802baSBartosz Kaszubowski    (method as AccessorDefinitionData)?.getSignature ||
526b7802baSBartosz Kaszubowski    [];
531886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
54dd9570b9SBartosz Kaszubowski  return signatures.map(
55dd9570b9SBartosz Kaszubowski    ({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => (
566a5c065cSBartosz Kaszubowski      <div
57dd9570b9SBartosz Kaszubowski        key={`method-signature-${method.name || name}-${parameters?.length || 0}`}
58*12abeb84SBartosz Kaszubowski        css={[STYLES_APIBOX, STYLES_APIBOX_NESTED]}>
5925b16883SBartosz Kaszubowski        <APISectionDeprecationNote comment={comment} />
60d9bd5b6cSBartosz Kaszubowski        <APISectionPlatformTags comment={comment} prefix="Only for:" />
61c4c6b9d1SBartosz Kaszubowski        <HeaderComponent tags={getTagNamesList(comment)}>
62*12abeb84SBartosz Kaszubowski          <CODE css={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}>
63adede39aSŁukasz Kosmaty            {getMethodName(method as MethodDefinitionData, apiName, name, parameters)}
64*12abeb84SBartosz Kaszubowski          </CODE>
651886d870SBartosz Kaszubowski        </HeaderComponent>
66*12abeb84SBartosz Kaszubowski        {parameters && parameters.length > 0 && (
67*12abeb84SBartosz Kaszubowski          <>
68*12abeb84SBartosz Kaszubowski            {renderParams(parameters)}
69*12abeb84SBartosz Kaszubowski            <br />
70*12abeb84SBartosz Kaszubowski          </>
71*12abeb84SBartosz Kaszubowski        )}
727534da61SBartosz Kaszubowski        <CommentTextBlock comment={comment} includePlatforms={false} />
736a5c065cSBartosz Kaszubowski        {resolveTypeName(type) !== 'undefined' && (
74af644ed4SBartosz Kaszubowski          <>
756a5c065cSBartosz Kaszubowski            <div css={STYLES_NESTED_SECTION_HEADER}>
76299f02f2SBartosz Kaszubowski              <H4>Returns</H4>
776a5c065cSBartosz Kaszubowski            </div>
78*12abeb84SBartosz Kaszubowski            <UL css={STYLES_NO_BULLET_LIST}>
793e972ef8SBartosz Kaszubowski              <LI>
80dd9570b9SBartosz Kaszubowski                <UndoIcon
81dd9570b9SBartosz Kaszubowski                  color={theme.icon.secondary}
82dd9570b9SBartosz Kaszubowski                  size={iconSize.small}
83dd9570b9SBartosz Kaszubowski                  css={returnIconStyles}
84dd9570b9SBartosz Kaszubowski                />
85504f93b3SBartosz Kaszubowski                <APIDataType typeDefinition={type} />
86299f02f2SBartosz Kaszubowski              </LI>
87299f02f2SBartosz Kaszubowski            </UL>
88*12abeb84SBartosz Kaszubowski            <>
89*12abeb84SBartosz Kaszubowski              <br />
90*12abeb84SBartosz Kaszubowski              <ReactMarkdown components={mdComponents}>{comment?.returns ?? ''}</ReactMarkdown>
91*12abeb84SBartosz Kaszubowski            </>
92af644ed4SBartosz Kaszubowski          </>
936a5c065cSBartosz Kaszubowski        )}
94299f02f2SBartosz Kaszubowski      </div>
95dd9570b9SBartosz Kaszubowski    )
96dd9570b9SBartosz Kaszubowski  );
971886d870SBartosz Kaszubowski};
98299f02f2SBartosz Kaszubowski
99adede39aSŁukasz Kosmatyconst APISectionMethods = ({
100adede39aSŁukasz Kosmaty  data,
101adede39aSŁukasz Kosmaty  apiName,
102adede39aSŁukasz Kosmaty  header = 'Methods',
103adede39aSŁukasz Kosmaty  exposeInSidebar = true,
104adede39aSŁukasz Kosmaty}: APISectionMethodsProps) =>
105299f02f2SBartosz Kaszubowski  data?.length ? (
106299f02f2SBartosz Kaszubowski    <>
1071b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
1084c73bbf6SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData) =>
109adede39aSŁukasz Kosmaty        renderMethod(method, { apiName, header, exposeInSidebar })
110e3060685SBartosz Kaszubowski      )}
111299f02f2SBartosz Kaszubowski    </>
112299f02f2SBartosz Kaszubowski  ) : null;
113299f02f2SBartosz Kaszubowski
1143e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({
1153e972ef8SBartosz Kaszubowski  transform: 'rotate(180deg)',
1163e972ef8SBartosz Kaszubowski  marginRight: spacing[2],
1173e972ef8SBartosz Kaszubowski  verticalAlign: 'middle',
1183e972ef8SBartosz Kaszubowski});
1193e972ef8SBartosz Kaszubowski
120299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
121adede39aSŁukasz Kosmaty
122adede39aSŁukasz Kosmatyexport const APIMethod = ({
123adede39aSŁukasz Kosmaty  name,
124adede39aSŁukasz Kosmaty  comment,
125adede39aSŁukasz Kosmaty  returnTypeName,
126adede39aSŁukasz Kosmaty  isProperty = false,
127adede39aSŁukasz Kosmaty  isReturnTypeReference = false,
128adede39aSŁukasz Kosmaty  exposeInSidebar = false,
129adede39aSŁukasz Kosmaty  parameters = [],
130c468593bSŁukasz Kosmaty  platforms = [],
131adede39aSŁukasz Kosmaty}: {
132adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
133adede39aSŁukasz Kosmaty  name: string;
134adede39aSŁukasz Kosmaty  comment: string;
135adede39aSŁukasz Kosmaty  returnTypeName: string;
136adede39aSŁukasz Kosmaty  isProperty: boolean;
137adede39aSŁukasz Kosmaty  isReturnTypeReference: boolean;
138c468593bSŁukasz Kosmaty  platforms: ('Android' | 'iOS' | 'Web')[];
139adede39aSŁukasz Kosmaty  parameters: {
140adede39aSŁukasz Kosmaty    name: string;
141adede39aSŁukasz Kosmaty    comment?: string;
142adede39aSŁukasz Kosmaty    typeName: string;
143adede39aSŁukasz Kosmaty    isReference?: boolean;
144adede39aSŁukasz Kosmaty  }[];
145adede39aSŁukasz Kosmaty}): JSX.Element[] => {
146adede39aSŁukasz Kosmaty  const parsedParameters = parameters.map(param => ({
147adede39aSŁukasz Kosmaty    name: param.name,
148adede39aSŁukasz Kosmaty    type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' },
149adede39aSŁukasz Kosmaty    comment: {
150adede39aSŁukasz Kosmaty      text: param.comment,
151adede39aSŁukasz Kosmaty    },
152adede39aSŁukasz Kosmaty  }));
153adede39aSŁukasz Kosmaty  return renderMethod(
154adede39aSŁukasz Kosmaty    {
155adede39aSŁukasz Kosmaty      name,
156adede39aSŁukasz Kosmaty      signatures: [
157adede39aSŁukasz Kosmaty        {
158adede39aSŁukasz Kosmaty          name,
159adede39aSŁukasz Kosmaty          parameters: parsedParameters,
160adede39aSŁukasz Kosmaty          comment: {
161adede39aSŁukasz Kosmaty            text: comment,
162c468593bSŁukasz Kosmaty            tags: platforms.map(text => ({
163c468593bSŁukasz Kosmaty              tag: 'platform',
164c468593bSŁukasz Kosmaty              text,
165c468593bSŁukasz Kosmaty            })),
166adede39aSŁukasz Kosmaty          },
167adede39aSŁukasz Kosmaty          type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' },
168adede39aSŁukasz Kosmaty        },
169adede39aSŁukasz Kosmaty      ],
170adede39aSŁukasz Kosmaty      kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function,
171adede39aSŁukasz Kosmaty    },
172adede39aSŁukasz Kosmaty    { exposeInSidebar }
173adede39aSŁukasz Kosmaty  );
174adede39aSŁukasz Kosmaty};
175*12abeb84SBartosz Kaszubowski
176*12abeb84SBartosz Kaszubowskiconst STYLES_NO_BULLET_LIST = css({
177*12abeb84SBartosz Kaszubowski  listStyle: 'none',
178*12abeb84SBartosz Kaszubowski  marginLeft: spacing[2],
179*12abeb84SBartosz Kaszubowski});
180