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