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