11886d870SBartosz Kaszubowskiimport { css } from '@emotion/react';
2299f02f2SBartosz Kaszubowskiimport React from 'react';
3299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown';
4299f02f2SBartosz Kaszubowski
5299f02f2SBartosz Kaszubowskiimport { InlineCode } from '~/components/base/code';
6299f02f2SBartosz Kaszubowskiimport { LI, UL } from '~/components/base/list';
71886d870SBartosz Kaszubowskiimport { H2, H3Code, H4, H4Code } from '~/components/plugins/Headings';
8d8d79196SBartosz Kaszubowskiimport {
9d8d79196SBartosz Kaszubowski  MethodDefinitionData,
10d8d79196SBartosz Kaszubowski  MethodSignatureData,
11d8d79196SBartosz Kaszubowski  PropData,
12d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes';
13299f02f2SBartosz Kaszubowskiimport {
14299f02f2SBartosz Kaszubowski  CommentTextBlock,
15d0262524SBartosz Kaszubowski  getPlatformTags,
16abded2bbSBartosz Kaszubowski  listParams,
17dc379e46SBartosz Kaszubowski  mdComponents,
18299f02f2SBartosz Kaszubowski  renderParam,
19299f02f2SBartosz Kaszubowski  resolveTypeName,
20299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils';
21299f02f2SBartosz Kaszubowski
22299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = {
23e3060685SBartosz Kaszubowski  data: (MethodDefinitionData | PropData)[];
24299f02f2SBartosz Kaszubowski  apiName?: string;
251b3dce65SBartosz Kaszubowski  header?: string;
26299f02f2SBartosz Kaszubowski};
27299f02f2SBartosz Kaszubowski
281886d870SBartosz Kaszubowskiconst STYLES_NOT_EXPOSED_HEADER = css({ marginTop: 20, marginBottom: 10, display: 'inline-block' });
291886d870SBartosz Kaszubowski
30d8d79196SBartosz Kaszubowskiexport const renderMethod = (
31d8d79196SBartosz Kaszubowski  { signatures = [] }: MethodDefinitionData | PropData,
32d8d79196SBartosz Kaszubowski  index?: number,
33299f02f2SBartosz Kaszubowski  dataLength?: number,
34f128dd42SBartosz Kaszubowski  apiName?: string,
351886d870SBartosz Kaszubowski  header?: string,
361886d870SBartosz Kaszubowski  exposeInSidebar: boolean = true
371886d870SBartosz Kaszubowski): JSX.Element[] => {
381886d870SBartosz Kaszubowski  const HeaderComponent = exposeInSidebar ? H3Code : H4Code;
391886d870SBartosz Kaszubowski  return signatures.map(({ name, parameters, comment, type }: MethodSignatureData) => (
40299f02f2SBartosz Kaszubowski    <div key={`method-signature-${name}-${parameters?.length || 0}`}>
411886d870SBartosz Kaszubowski      <HeaderComponent>
421886d870SBartosz Kaszubowski        <InlineCode customCss={STYLES_NOT_EXPOSED_HEADER}>
43c8c9d6e8SBartosz Kaszubowski          {apiName && `${apiName}.`}
44abded2bbSBartosz Kaszubowski          {header !== 'Hooks' ? `${name}(${listParams(parameters)})` : name}
45299f02f2SBartosz Kaszubowski        </InlineCode>
461886d870SBartosz Kaszubowski      </HeaderComponent>
47d0262524SBartosz Kaszubowski      {getPlatformTags(comment)}
48ffc1cfa8SBartosz Kaszubowski      <CommentTextBlock
49ffc1cfa8SBartosz Kaszubowski        comment={comment}
50ffc1cfa8SBartosz Kaszubowski        beforeContent={
51c8c9d6e8SBartosz Kaszubowski          parameters && (
52ffc1cfa8SBartosz Kaszubowski            <>
53ffc1cfa8SBartosz Kaszubowski              <H4>Arguments</H4>
54ffc1cfa8SBartosz Kaszubowski              <UL>{parameters?.map(renderParam)}</UL>
55ffc1cfa8SBartosz Kaszubowski            </>
56c8c9d6e8SBartosz Kaszubowski          )
57ffc1cfa8SBartosz Kaszubowski        }
58d0262524SBartosz Kaszubowski        includePlatforms={false}
59ffc1cfa8SBartosz Kaszubowski      />
60299f02f2SBartosz Kaszubowski      {resolveTypeName(type) !== 'undefined' ? (
61*af644ed4SBartosz Kaszubowski        <>
62299f02f2SBartosz Kaszubowski          <H4>Returns</H4>
63299f02f2SBartosz Kaszubowski          <UL>
64299f02f2SBartosz Kaszubowski            <LI returnType>
65299f02f2SBartosz Kaszubowski              <InlineCode>{resolveTypeName(type)}</InlineCode>
66299f02f2SBartosz Kaszubowski            </LI>
67299f02f2SBartosz Kaszubowski          </UL>
68c8c9d6e8SBartosz Kaszubowski          {comment?.returns && (
69dc379e46SBartosz Kaszubowski            <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown>
70c8c9d6e8SBartosz Kaszubowski          )}
71*af644ed4SBartosz Kaszubowski        </>
72299f02f2SBartosz Kaszubowski      ) : null}
73d8d79196SBartosz Kaszubowski      {index !== undefined ? index + 1 !== dataLength && <hr /> : null}
74299f02f2SBartosz Kaszubowski    </div>
75299f02f2SBartosz Kaszubowski  ));
761886d870SBartosz Kaszubowski};
77299f02f2SBartosz Kaszubowski
78558a63feSBartosz Kaszubowskiconst APISectionMethods = ({ data, apiName, header = 'Methods' }: APISectionMethodsProps) =>
79299f02f2SBartosz Kaszubowski  data?.length ? (
80299f02f2SBartosz Kaszubowski    <>
811b3dce65SBartosz Kaszubowski      <H2 key="methods-header">{header}</H2>
82e3060685SBartosz Kaszubowski      {data.map((method: MethodDefinitionData | PropData, index: number) =>
83e3060685SBartosz Kaszubowski        renderMethod(method, index, data.length, apiName, header)
84e3060685SBartosz Kaszubowski      )}
85299f02f2SBartosz Kaszubowski    </>
86299f02f2SBartosz Kaszubowski  ) : null;
87299f02f2SBartosz Kaszubowski
88299f02f2SBartosz Kaszubowskiexport default APISectionMethods;
89