1*3e972ef8SBartosz Kaszubowskiimport { css } from '@emotion/react';
2*3e972ef8SBartosz 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';
9d8d79196SBartosz Kaszubowskiimport {
10d8d79196SBartosz Kaszubowski  MethodDefinitionData,
11d8d79196SBartosz Kaszubowski  MethodSignatureData,
12d8d79196SBartosz Kaszubowski  PropData,
13d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
146a5c065cSBartosz Kaszubowskiimport { PlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
15299f02f2SBartosz Kaszubowskiimport {
16299f02f2SBartosz Kaszubowski  CommentTextBlock,
17abded2bbSBartosz Kaszubowski  listParams,
18dc379e46SBartosz Kaszubowski  mdComponents,
197534da61SBartosz Kaszubowski  renderParams,
20299f02f2SBartosz Kaszubowski  resolveTypeName,
216a5c065cSBartosz Kaszubowski  STYLES_APIBOX,
226a5c065cSBartosz Kaszubowski  STYLES_APIBOX_NESTED,
236a5c065cSBartosz Kaszubowski  STYLES_NESTED_SECTION_HEADER,
246a5c065cSBartosz Kaszubowski  STYLES_NOT_EXPOSED_HEADER,
25299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
26299f02f2SBartosz Kaszubowski
27299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
28e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
29299f02f2SBartosz Kaszubowski  apiName?: string;
301b3dce65SBartosz Kaszubowski  header?: string;
31299f02f2SBartosz Kaszubowski};
32299f02f2SBartosz Kaszubowski
33d8d79196SBartosz Kaszubowskiexport const renderMethod = (
34d8d79196SBartosz Kaszubowski  { signatures = [] }: MethodDefinitionData | PropData,
35d8d79196SBartosz Kaszubowski  index?: number,
36299f02f2SBartosz Kaszubowski  dataLength?: number,
37f128dd42SBartosz Kaszubowski  apiName?: string,
381886d870SBartosz Kaszubowski  header?: string,
391886d870SBartosz Kaszubowski  exposeInSidebar: boolean = true
401886d870SBartosz Kaszubowski): JSX.Element[] => {
411886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
421886d870SBartosz Kaszubowski  return signatures.map(({ name, parameters, comment, type }: MethodSignatureData) => (
436a5c065cSBartosz Kaszubowski    <div
446a5c065cSBartosz Kaszubowski      key={`method-signature-${name}-${parameters?.length || 0}`}
456a5c065cSBartosz Kaszubowski      css={[STYLES_APIBOX, !exposeInSidebar && STYLES_APIBOX_NESTED]}>
466a5c065cSBartosz Kaszubowski      <PlatformTags comment={comment} prefix="Only for:" firstElement />
471886d870SBartosz Kaszubowski      <HeaderComponent>
486a5c065cSBartosz Kaszubowski        <InlineCode customCss={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}>
49c8c9d6e8SBartosz Kaszubowski          {apiName && `${apiName}.`}
50abded2bbSBartosz Kaszubowski          {header !== 'Hooks' ? `${name}(${listParams(parameters)})` : name}
51299f02f2SBartosz Kaszubowski        </InlineCode>
521886d870SBartosz Kaszubowski      </HeaderComponent>
537534da61SBartosz Kaszubowski      {parameters && renderParams(parameters)}
547534da61SBartosz Kaszubowski      <CommentTextBlock comment={comment} includePlatforms={false} />
556a5c065cSBartosz Kaszubowski      {resolveTypeName(type) !== 'undefined' && (
56af644ed4SBartosz Kaszubowski        <>
576a5c065cSBartosz Kaszubowski          <div css={STYLES_NESTED_SECTION_HEADER}>
58299f02f2SBartosz Kaszubowski            <H4>Returns</H4>
596a5c065cSBartosz Kaszubowski          </div>
60*3e972ef8SBartosz Kaszubowski          <UL hideBullets>
61*3e972ef8SBartosz Kaszubowski            <LI>
62*3e972ef8SBartosz Kaszubowski              <UndoIcon color={theme.icon.secondary} size={iconSize.small} css={returnIconStyles} />
63299f02f2SBartosz Kaszubowski              <InlineCode>{resolveTypeName(type)}</InlineCode>
64299f02f2SBartosz Kaszubowski            </LI>
65299f02f2SBartosz Kaszubowski          </UL>
66c8c9d6e8SBartosz Kaszubowski          {comment?.returns && (
67dc379e46SBartosz Kaszubowski            <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown>
68c8c9d6e8SBartosz Kaszubowski          )}
69af644ed4SBartosz Kaszubowski        </>
706a5c065cSBartosz Kaszubowski      )}
71299f02f2SBartosz Kaszubowski    </div>
72299f02f2SBartosz Kaszubowski  ));
731886d870SBartosz Kaszubowski};
74299f02f2SBartosz Kaszubowski
75558a63feSBartosz Kaszubowskiconst APISectionMethods = ({ data, apiName, header = 'Methods' }: APISectionMethodsProps) =>
76299f02f2SBartosz Kaszubowski  data?.length ? (
77299f02f2SBartosz Kaszubowski    <>
781b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
79e3060685SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData, index: number) =>
80e3060685SBartosz Kaszubowski        renderMethod(method, index, data.length, apiName, header)
81e3060685SBartosz Kaszubowski      )}
82299f02f2SBartosz Kaszubowski    </>
83299f02f2SBartosz Kaszubowski  ) : null;
84299f02f2SBartosz Kaszubowski
85*3e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({
86*3e972ef8SBartosz Kaszubowski  transform: 'rotate(180deg)',
87*3e972ef8SBartosz Kaszubowski  marginRight: spacing[2],
88*3e972ef8SBartosz Kaszubowski  verticalAlign: 'middle',
89*3e972ef8SBartosz Kaszubowski});
90*3e972ef8SBartosz Kaszubowski
91299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
92