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';
9d8d79196SBartosz Kaszubowskiimport {
10d8d79196SBartosz Kaszubowski  MethodDefinitionData,
11d8d79196SBartosz Kaszubowski  MethodSignatureData,
12d8d79196SBartosz Kaszubowski  PropData,
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,
18c4c6b9d1SBartosz Kaszubowski  getTagNamesList,
19abded2bbSBartosz Kaszubowski  listParams,
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,
27299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
28299f02f2SBartosz Kaszubowski
29299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
30e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
31299f02f2SBartosz Kaszubowski  apiName?: string;
321b3dce65SBartosz Kaszubowski  header?: string;
33299f02f2SBartosz Kaszubowski};
34299f02f2SBartosz Kaszubowski
354c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = {
364c73bbf6SBartosz Kaszubowski  apiName?: string;
374c73bbf6SBartosz Kaszubowski  header?: string;
384c73bbf6SBartosz Kaszubowski  exposeInSidebar?: boolean;
394c73bbf6SBartosz Kaszubowski};
404c73bbf6SBartosz Kaszubowski
41d8d79196SBartosz Kaszubowskiexport const renderMethod = (
42d8d79196SBartosz Kaszubowski  { signatures = [] }: MethodDefinitionData | PropData,
434c73bbf6SBartosz Kaszubowski  { apiName, header, exposeInSidebar = true }: RenderMethodOptions = {}
441886d870SBartosz Kaszubowski): JSX.Element[] => {
451886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
461886d870SBartosz Kaszubowski  return signatures.map(({ name, parameters, comment, type }: MethodSignatureData) => (
476a5c065cSBartosz Kaszubowski    <div
486a5c065cSBartosz Kaszubowski      key={`method-signature-${name}-${parameters?.length || 0}`}
496a5c065cSBartosz Kaszubowski      css={[STYLES_APIBOX, !exposeInSidebar && STYLES_APIBOX_NESTED]}>
5025b16883SBartosz Kaszubowski      <APISectionDeprecationNote comment={comment} />
51b3bd70ceSTomasz Sapeta      <APISectionPlatformTags comment={comment} prefix="Only for:" firstElement />
52c4c6b9d1SBartosz Kaszubowski      <HeaderComponent tags={getTagNamesList(comment)}>
53*f8204ef0SBartosz Kaszubowski        <InlineCode css={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}>
54c8c9d6e8SBartosz Kaszubowski          {apiName && `${apiName}.`}
55abded2bbSBartosz Kaszubowski          {header !== 'Hooks' ? `${name}(${listParams(parameters)})` : name}
56299f02f2SBartosz Kaszubowski        </InlineCode>
571886d870SBartosz Kaszubowski      </HeaderComponent>
587534da61SBartosz Kaszubowski      {parameters && renderParams(parameters)}
597534da61SBartosz Kaszubowski      <CommentTextBlock comment={comment} includePlatforms={false} />
606a5c065cSBartosz Kaszubowski      {resolveTypeName(type) !== 'undefined' && (
61af644ed4SBartosz Kaszubowski        <>
626a5c065cSBartosz Kaszubowski          <div css={STYLES_NESTED_SECTION_HEADER}>
63299f02f2SBartosz Kaszubowski            <H4>Returns</H4>
646a5c065cSBartosz Kaszubowski          </div>
653e972ef8SBartosz Kaszubowski          <UL hideBullets>
663e972ef8SBartosz Kaszubowski            <LI>
673e972ef8SBartosz Kaszubowski              <UndoIcon color={theme.icon.secondary} size={iconSize.small} css={returnIconStyles} />
68299f02f2SBartosz Kaszubowski              <InlineCode>{resolveTypeName(type)}</InlineCode>
69299f02f2SBartosz Kaszubowski            </LI>
70299f02f2SBartosz Kaszubowski          </UL>
71c8c9d6e8SBartosz Kaszubowski          {comment?.returns && (
72dc379e46SBartosz Kaszubowski            <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown>
73c8c9d6e8SBartosz Kaszubowski          )}
74af644ed4SBartosz Kaszubowski        </>
756a5c065cSBartosz Kaszubowski      )}
76299f02f2SBartosz Kaszubowski    </div>
77299f02f2SBartosz Kaszubowski  ));
781886d870SBartosz Kaszubowski};
79299f02f2SBartosz Kaszubowski
80558a63feSBartosz Kaszubowskiconst APISectionMethods = ({ data, apiName, header = 'Methods' }: APISectionMethodsProps) =>
81299f02f2SBartosz Kaszubowski  data?.length ? (
82299f02f2SBartosz Kaszubowski    <>
831b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
844c73bbf6SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData) =>
854c73bbf6SBartosz Kaszubowski        renderMethod(method, { apiName, header })
86e3060685SBartosz Kaszubowski      )}
87299f02f2SBartosz Kaszubowski    </>
88299f02f2SBartosz Kaszubowski  ) : null;
89299f02f2SBartosz Kaszubowski
903e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({
913e972ef8SBartosz Kaszubowski  transform: 'rotate(180deg)',
923e972ef8SBartosz Kaszubowski  marginRight: spacing[2],
933e972ef8SBartosz Kaszubowski  verticalAlign: 'middle',
943e972ef8SBartosz Kaszubowski});
953e972ef8SBartosz Kaszubowski
96299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
97