13e972ef8SBartosz Kaszubowskiimport { css } from '@emotion/react';
23e972ef8SBartosz Kaszubowskiimport { theme, spacing, UndoIcon, iconSize } from '@expo/styleguide';
3299f02f2SBartosz Kaszubowskiimport React from 'react';
4299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown';
5299f02f2SBartosz Kaszubowski
6299f02f2SBartosz Kaszubowskiimport { InlineCode } from '~/components/base/code';
7299f02f2SBartosz Kaszubowskiimport { LI, UL } from '~/components/base/list';
81886d870SBartosz Kaszubowskiimport { H2, H3Code, H4, H4Code } from '~/components/plugins/Headings';
9504f93b3SBartosz Kaszubowskiimport { APIDataType } from '~/components/plugins/api/APIDataType';
10d8d79196SBartosz Kaszubowskiimport {
11*6b7802baSBartosz Kaszubowski  AccessorDefinitionData,
12d8d79196SBartosz Kaszubowski  MethodDefinitionData,
13d8d79196SBartosz Kaszubowski  MethodSignatureData,
14d8d79196SBartosz Kaszubowski  PropData,
15dd9570b9SBartosz Kaszubowski  TypeSignaturesData,
16d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
1725b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote';
18b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
19299f02f2SBartosz Kaszubowskiimport {
20299f02f2SBartosz Kaszubowski  CommentTextBlock,
21adede39aSŁukasz Kosmaty  getMethodName,
22c4c6b9d1SBartosz Kaszubowski  getTagNamesList,
23dc379e46SBartosz Kaszubowski  mdComponents,
247534da61SBartosz Kaszubowski  renderParams,
25299f02f2SBartosz Kaszubowski  resolveTypeName,
266a5c065cSBartosz Kaszubowski  STYLES_APIBOX,
276a5c065cSBartosz Kaszubowski  STYLES_APIBOX_NESTED,
286a5c065cSBartosz Kaszubowski  STYLES_NESTED_SECTION_HEADER,
296a5c065cSBartosz Kaszubowski  STYLES_NOT_EXPOSED_HEADER,
30adede39aSŁukasz Kosmaty  TypeDocKind,
31299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
32299f02f2SBartosz Kaszubowski
33299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
34e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
35299f02f2SBartosz Kaszubowski  apiName?: string;
361b3dce65SBartosz Kaszubowski  header?: string;
37adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
38299f02f2SBartosz Kaszubowski};
39299f02f2SBartosz Kaszubowski
404c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = {
414c73bbf6SBartosz Kaszubowski  apiName?: string;
424c73bbf6SBartosz Kaszubowski  header?: string;
434c73bbf6SBartosz Kaszubowski  exposeInSidebar?: boolean;
444c73bbf6SBartosz Kaszubowski};
454c73bbf6SBartosz Kaszubowski
46d8d79196SBartosz Kaszubowskiexport const renderMethod = (
47*6b7802baSBartosz Kaszubowski  method: MethodDefinitionData | AccessorDefinitionData | PropData,
48dd9570b9SBartosz Kaszubowski  { apiName, exposeInSidebar = true }: RenderMethodOptions = {}
491886d870SBartosz Kaszubowski): JSX.Element[] => {
50*6b7802baSBartosz Kaszubowski  const signatures =
51*6b7802baSBartosz Kaszubowski    (method as MethodDefinitionData).signatures ||
52*6b7802baSBartosz Kaszubowski    (method as PropData)?.type?.declaration?.signatures ||
53*6b7802baSBartosz Kaszubowski    (method as AccessorDefinitionData)?.getSignature ||
54*6b7802baSBartosz Kaszubowski    [];
551886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
56dd9570b9SBartosz Kaszubowski  return signatures.map(
57dd9570b9SBartosz Kaszubowski    ({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => (
586a5c065cSBartosz Kaszubowski      <div
59dd9570b9SBartosz Kaszubowski        key={`method-signature-${method.name || name}-${parameters?.length || 0}`}
606a5c065cSBartosz Kaszubowski        css={[STYLES_APIBOX, !exposeInSidebar && STYLES_APIBOX_NESTED]}>
6125b16883SBartosz Kaszubowski        <APISectionDeprecationNote comment={comment} />
62d9bd5b6cSBartosz Kaszubowski        <APISectionPlatformTags comment={comment} prefix="Only for:" />
63c4c6b9d1SBartosz Kaszubowski        <HeaderComponent tags={getTagNamesList(comment)}>
64f8204ef0SBartosz Kaszubowski          <InlineCode css={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}>
65adede39aSŁukasz Kosmaty            {getMethodName(method as MethodDefinitionData, apiName, name, parameters)}
66299f02f2SBartosz Kaszubowski          </InlineCode>
671886d870SBartosz Kaszubowski        </HeaderComponent>
68adede39aSŁukasz Kosmaty        {parameters && parameters.length > 0 && renderParams(parameters)}
697534da61SBartosz Kaszubowski        <CommentTextBlock comment={comment} includePlatforms={false} />
706a5c065cSBartosz Kaszubowski        {resolveTypeName(type) !== 'undefined' && (
71af644ed4SBartosz Kaszubowski          <>
726a5c065cSBartosz Kaszubowski            <div css={STYLES_NESTED_SECTION_HEADER}>
73299f02f2SBartosz Kaszubowski              <H4>Returns</H4>
746a5c065cSBartosz Kaszubowski            </div>
753e972ef8SBartosz Kaszubowski            <UL hideBullets>
763e972ef8SBartosz Kaszubowski              <LI>
77dd9570b9SBartosz Kaszubowski                <UndoIcon
78dd9570b9SBartosz Kaszubowski                  color={theme.icon.secondary}
79dd9570b9SBartosz Kaszubowski                  size={iconSize.small}
80dd9570b9SBartosz Kaszubowski                  css={returnIconStyles}
81dd9570b9SBartosz Kaszubowski                />
82504f93b3SBartosz Kaszubowski                <APIDataType typeDefinition={type} />
83299f02f2SBartosz Kaszubowski              </LI>
84299f02f2SBartosz Kaszubowski            </UL>
85c8c9d6e8SBartosz Kaszubowski            {comment?.returns && (
86dc379e46SBartosz Kaszubowski              <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown>
87c8c9d6e8SBartosz Kaszubowski            )}
88af644ed4SBartosz Kaszubowski          </>
896a5c065cSBartosz Kaszubowski        )}
90299f02f2SBartosz Kaszubowski      </div>
91dd9570b9SBartosz Kaszubowski    )
92dd9570b9SBartosz Kaszubowski  );
931886d870SBartosz Kaszubowski};
94299f02f2SBartosz Kaszubowski
95adede39aSŁukasz Kosmatyconst APISectionMethods = ({
96adede39aSŁukasz Kosmaty  data,
97adede39aSŁukasz Kosmaty  apiName,
98adede39aSŁukasz Kosmaty  header = 'Methods',
99adede39aSŁukasz Kosmaty  exposeInSidebar = true,
100adede39aSŁukasz Kosmaty}: APISectionMethodsProps) =>
101299f02f2SBartosz Kaszubowski  data?.length ? (
102299f02f2SBartosz Kaszubowski    <>
1031b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
1044c73bbf6SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData) =>
105adede39aSŁukasz Kosmaty        renderMethod(method, { apiName, header, exposeInSidebar })
106e3060685SBartosz Kaszubowski      )}
107299f02f2SBartosz Kaszubowski    </>
108299f02f2SBartosz Kaszubowski  ) : null;
109299f02f2SBartosz Kaszubowski
1103e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({
1113e972ef8SBartosz Kaszubowski  transform: 'rotate(180deg)',
1123e972ef8SBartosz Kaszubowski  marginRight: spacing[2],
1133e972ef8SBartosz Kaszubowski  verticalAlign: 'middle',
1143e972ef8SBartosz Kaszubowski});
1153e972ef8SBartosz Kaszubowski
116299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
117adede39aSŁukasz Kosmaty
118adede39aSŁukasz Kosmatyexport const APIMethod = ({
119adede39aSŁukasz Kosmaty  name,
120adede39aSŁukasz Kosmaty  comment,
121adede39aSŁukasz Kosmaty  returnTypeName,
122adede39aSŁukasz Kosmaty  isProperty = false,
123adede39aSŁukasz Kosmaty  isReturnTypeReference = false,
124adede39aSŁukasz Kosmaty  exposeInSidebar = false,
125adede39aSŁukasz Kosmaty  parameters = [],
126c468593bSŁukasz Kosmaty  platforms = [],
127adede39aSŁukasz Kosmaty}: {
128adede39aSŁukasz Kosmaty  exposeInSidebar?: boolean;
129adede39aSŁukasz Kosmaty  name: string;
130adede39aSŁukasz Kosmaty  comment: string;
131adede39aSŁukasz Kosmaty  returnTypeName: string;
132adede39aSŁukasz Kosmaty  isProperty: boolean;
133adede39aSŁukasz Kosmaty  isReturnTypeReference: boolean;
134c468593bSŁukasz Kosmaty  platforms: ('Android' | 'iOS' | 'Web')[];
135adede39aSŁukasz Kosmaty  parameters: {
136adede39aSŁukasz Kosmaty    name: string;
137adede39aSŁukasz Kosmaty    comment?: string;
138adede39aSŁukasz Kosmaty    typeName: string;
139adede39aSŁukasz Kosmaty    isReference?: boolean;
140adede39aSŁukasz Kosmaty  }[];
141adede39aSŁukasz Kosmaty}): JSX.Element[] => {
142adede39aSŁukasz Kosmaty  const parsedParameters = parameters.map(param => ({
143adede39aSŁukasz Kosmaty    name: param.name,
144adede39aSŁukasz Kosmaty    type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' },
145adede39aSŁukasz Kosmaty    comment: {
146adede39aSŁukasz Kosmaty      text: param.comment,
147adede39aSŁukasz Kosmaty    },
148adede39aSŁukasz Kosmaty  }));
149adede39aSŁukasz Kosmaty  return renderMethod(
150adede39aSŁukasz Kosmaty    {
151adede39aSŁukasz Kosmaty      name,
152adede39aSŁukasz Kosmaty      signatures: [
153adede39aSŁukasz Kosmaty        {
154adede39aSŁukasz Kosmaty          name,
155adede39aSŁukasz Kosmaty          parameters: parsedParameters,
156adede39aSŁukasz Kosmaty          comment: {
157adede39aSŁukasz Kosmaty            text: comment,
158c468593bSŁukasz Kosmaty            tags: platforms.map(text => ({
159c468593bSŁukasz Kosmaty              tag: 'platform',
160c468593bSŁukasz Kosmaty              text,
161c468593bSŁukasz Kosmaty            })),
162adede39aSŁukasz Kosmaty          },
163adede39aSŁukasz Kosmaty          type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' },
164adede39aSŁukasz Kosmaty        },
165adede39aSŁukasz Kosmaty      ],
166adede39aSŁukasz Kosmaty      kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function,
167adede39aSŁukasz Kosmaty    },
168adede39aSŁukasz Kosmaty    { exposeInSidebar }
169adede39aSŁukasz Kosmaty  );
170adede39aSŁukasz Kosmaty};
171