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';
156a5c065cSBartosz Kaszubowskiimport { PlatformTags } from '~/components/plugins/api/APISectionPlatformTags';
16299f02f2SBartosz Kaszubowskiimport {
17299f02f2SBartosz Kaszubowski  CommentTextBlock,
18abded2bbSBartosz Kaszubowski  listParams,
19dc379e46SBartosz Kaszubowski  mdComponents,
207534da61SBartosz Kaszubowski  renderParams,
21299f02f2SBartosz Kaszubowski  resolveTypeName,
226a5c065cSBartosz Kaszubowski  STYLES_APIBOX,
236a5c065cSBartosz Kaszubowski  STYLES_APIBOX_NESTED,
246a5c065cSBartosz Kaszubowski  STYLES_NESTED_SECTION_HEADER,
256a5c065cSBartosz Kaszubowski  STYLES_NOT_EXPOSED_HEADER,
26299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
27299f02f2SBartosz Kaszubowski
28299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
29e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
30299f02f2SBartosz Kaszubowski  apiName?: string;
311b3dce65SBartosz Kaszubowski  header?: string;
32299f02f2SBartosz Kaszubowski};
33299f02f2SBartosz Kaszubowski
34*4c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = {
35*4c73bbf6SBartosz Kaszubowski  apiName?: string;
36*4c73bbf6SBartosz Kaszubowski  header?: string;
37*4c73bbf6SBartosz Kaszubowski  exposeInSidebar?: boolean;
38*4c73bbf6SBartosz Kaszubowski};
39*4c73bbf6SBartosz Kaszubowski
40d8d79196SBartosz Kaszubowskiexport const renderMethod = (
41d8d79196SBartosz Kaszubowski  { signatures = [] }: MethodDefinitionData | PropData,
42*4c73bbf6SBartosz Kaszubowski  { apiName, header, exposeInSidebar = true }: RenderMethodOptions = {}
431886d870SBartosz Kaszubowski): JSX.Element[] => {
441886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
451886d870SBartosz Kaszubowski  return signatures.map(({ name, parameters, comment, type }: MethodSignatureData) => (
466a5c065cSBartosz Kaszubowski    <div
476a5c065cSBartosz Kaszubowski      key={`method-signature-${name}-${parameters?.length || 0}`}
486a5c065cSBartosz Kaszubowski      css={[STYLES_APIBOX, !exposeInSidebar && STYLES_APIBOX_NESTED]}>
4925b16883SBartosz Kaszubowski      <APISectionDeprecationNote comment={comment} />
506a5c065cSBartosz Kaszubowski      <PlatformTags comment={comment} prefix="Only for:" firstElement />
511886d870SBartosz Kaszubowski      <HeaderComponent>
526a5c065cSBartosz Kaszubowski        <InlineCode customCss={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}>
53c8c9d6e8SBartosz Kaszubowski          {apiName && `${apiName}.`}
54abded2bbSBartosz Kaszubowski          {header !== 'Hooks' ? `${name}(${listParams(parameters)})` : name}
55299f02f2SBartosz Kaszubowski        </InlineCode>
561886d870SBartosz Kaszubowski      </HeaderComponent>
577534da61SBartosz Kaszubowski      {parameters && renderParams(parameters)}
587534da61SBartosz Kaszubowski      <CommentTextBlock comment={comment} includePlatforms={false} />
596a5c065cSBartosz Kaszubowski      {resolveTypeName(type) !== 'undefined' && (
60af644ed4SBartosz Kaszubowski        <>
616a5c065cSBartosz Kaszubowski          <div css={STYLES_NESTED_SECTION_HEADER}>
62299f02f2SBartosz Kaszubowski            <H4>Returns</H4>
636a5c065cSBartosz Kaszubowski          </div>
643e972ef8SBartosz Kaszubowski          <UL hideBullets>
653e972ef8SBartosz Kaszubowski            <LI>
663e972ef8SBartosz Kaszubowski              <UndoIcon color={theme.icon.secondary} size={iconSize.small} css={returnIconStyles} />
67299f02f2SBartosz Kaszubowski              <InlineCode>{resolveTypeName(type)}</InlineCode>
68299f02f2SBartosz Kaszubowski            </LI>
69299f02f2SBartosz Kaszubowski          </UL>
70c8c9d6e8SBartosz Kaszubowski          {comment?.returns && (
71dc379e46SBartosz Kaszubowski            <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown>
72c8c9d6e8SBartosz Kaszubowski          )}
73af644ed4SBartosz Kaszubowski        </>
746a5c065cSBartosz Kaszubowski      )}
75299f02f2SBartosz Kaszubowski    </div>
76299f02f2SBartosz Kaszubowski  ));
771886d870SBartosz Kaszubowski};
78299f02f2SBartosz Kaszubowski
79558a63feSBartosz Kaszubowskiconst APISectionMethods = ({ data, apiName, header = 'Methods' }: APISectionMethodsProps) =>
80299f02f2SBartosz Kaszubowski  data?.length ? (
81299f02f2SBartosz Kaszubowski    <>
821b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
83*4c73bbf6SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData) =>
84*4c73bbf6SBartosz Kaszubowski        renderMethod(method, { apiName, header })
85e3060685SBartosz Kaszubowski      )}
86299f02f2SBartosz Kaszubowski    </>
87299f02f2SBartosz Kaszubowski  ) : null;
88299f02f2SBartosz Kaszubowski
893e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({
903e972ef8SBartosz Kaszubowski  transform: 'rotate(180deg)',
913e972ef8SBartosz Kaszubowski  marginRight: spacing[2],
923e972ef8SBartosz Kaszubowski  verticalAlign: 'middle',
933e972ef8SBartosz Kaszubowski});
943e972ef8SBartosz Kaszubowski
95299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
96