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'; 9504f93b3SBartosz Kaszubowskiimport { APIDataType } from '~/components/plugins/api/APIDataType'; 10d8d79196SBartosz Kaszubowskiimport { 11*6b7802baSBartosz Kaszubowski AccessorDefinitionData, 12d8d79196SBartosz Kaszubowski MethodDefinitionData, 13d8d79196SBartosz Kaszubowski MethodSignatureData, 14d8d79196SBartosz Kaszubowski PropData, 15dd9570b9SBartosz Kaszubowski TypeSignaturesData, 16d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes'; 1725b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote'; 18b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags'; 19299f02f2SBartosz Kaszubowskiimport { 20299f02f2SBartosz Kaszubowski CommentTextBlock, 21adede39aSŁukasz Kosmaty getMethodName, 22c4c6b9d1SBartosz Kaszubowski getTagNamesList, 23dc379e46SBartosz Kaszubowski mdComponents, 247534da61SBartosz Kaszubowski renderParams, 25299f02f2SBartosz Kaszubowski resolveTypeName, 266a5c065cSBartosz Kaszubowski STYLES_APIBOX, 276a5c065cSBartosz Kaszubowski STYLES_APIBOX_NESTED, 286a5c065cSBartosz Kaszubowski STYLES_NESTED_SECTION_HEADER, 296a5c065cSBartosz Kaszubowski STYLES_NOT_EXPOSED_HEADER, 30adede39aSŁukasz Kosmaty TypeDocKind, 31299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils'; 32299f02f2SBartosz Kaszubowski 33299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = { 34e3060685SBartosz Kaszubowski data: (MethodDefinitionData | PropData)[]; 35299f02f2SBartosz Kaszubowski apiName?: string; 361b3dce65SBartosz Kaszubowski header?: string; 37adede39aSŁukasz Kosmaty exposeInSidebar?: boolean; 38299f02f2SBartosz Kaszubowski}; 39299f02f2SBartosz Kaszubowski 404c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = { 414c73bbf6SBartosz Kaszubowski apiName?: string; 424c73bbf6SBartosz Kaszubowski header?: string; 434c73bbf6SBartosz Kaszubowski exposeInSidebar?: boolean; 444c73bbf6SBartosz Kaszubowski}; 454c73bbf6SBartosz Kaszubowski 46d8d79196SBartosz Kaszubowskiexport const renderMethod = ( 47*6b7802baSBartosz Kaszubowski method: MethodDefinitionData | AccessorDefinitionData | PropData, 48dd9570b9SBartosz Kaszubowski { apiName, exposeInSidebar = true }: RenderMethodOptions = {} 491886d870SBartosz Kaszubowski): JSX.Element[] => { 50*6b7802baSBartosz Kaszubowski const signatures = 51*6b7802baSBartosz Kaszubowski (method as MethodDefinitionData).signatures || 52*6b7802baSBartosz Kaszubowski (method as PropData)?.type?.declaration?.signatures || 53*6b7802baSBartosz Kaszubowski (method as AccessorDefinitionData)?.getSignature || 54*6b7802baSBartosz Kaszubowski []; 551886d870SBartosz Kaszubowski const HeaderComponent = exposeInSidebar ? H3Code : H4Code; 56dd9570b9SBartosz Kaszubowski return signatures.map( 57dd9570b9SBartosz Kaszubowski ({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => ( 586a5c065cSBartosz Kaszubowski <div 59dd9570b9SBartosz Kaszubowski key={`method-signature-${method.name || name}-${parameters?.length || 0}`} 606a5c065cSBartosz Kaszubowski css={[STYLES_APIBOX, !exposeInSidebar && STYLES_APIBOX_NESTED]}> 6125b16883SBartosz Kaszubowski <APISectionDeprecationNote comment={comment} /> 62d9bd5b6cSBartosz Kaszubowski <APISectionPlatformTags comment={comment} prefix="Only for:" /> 63c4c6b9d1SBartosz Kaszubowski <HeaderComponent tags={getTagNamesList(comment)}> 64f8204ef0SBartosz Kaszubowski <InlineCode css={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}> 65adede39aSŁukasz Kosmaty {getMethodName(method as MethodDefinitionData, apiName, name, parameters)} 66299f02f2SBartosz Kaszubowski </InlineCode> 671886d870SBartosz Kaszubowski </HeaderComponent> 68adede39aSŁukasz Kosmaty {parameters && parameters.length > 0 && renderParams(parameters)} 697534da61SBartosz Kaszubowski <CommentTextBlock comment={comment} includePlatforms={false} /> 706a5c065cSBartosz Kaszubowski {resolveTypeName(type) !== 'undefined' && ( 71af644ed4SBartosz Kaszubowski <> 726a5c065cSBartosz Kaszubowski <div css={STYLES_NESTED_SECTION_HEADER}> 73299f02f2SBartosz Kaszubowski <H4>Returns</H4> 746a5c065cSBartosz Kaszubowski </div> 753e972ef8SBartosz Kaszubowski <UL hideBullets> 763e972ef8SBartosz Kaszubowski <LI> 77dd9570b9SBartosz Kaszubowski <UndoIcon 78dd9570b9SBartosz Kaszubowski color={theme.icon.secondary} 79dd9570b9SBartosz Kaszubowski size={iconSize.small} 80dd9570b9SBartosz Kaszubowski css={returnIconStyles} 81dd9570b9SBartosz Kaszubowski /> 82504f93b3SBartosz Kaszubowski <APIDataType typeDefinition={type} /> 83299f02f2SBartosz Kaszubowski </LI> 84299f02f2SBartosz Kaszubowski </UL> 85c8c9d6e8SBartosz Kaszubowski {comment?.returns && ( 86dc379e46SBartosz Kaszubowski <ReactMarkdown components={mdComponents}>{comment.returns}</ReactMarkdown> 87c8c9d6e8SBartosz Kaszubowski )} 88af644ed4SBartosz Kaszubowski </> 896a5c065cSBartosz Kaszubowski )} 90299f02f2SBartosz Kaszubowski </div> 91dd9570b9SBartosz Kaszubowski ) 92dd9570b9SBartosz Kaszubowski ); 931886d870SBartosz Kaszubowski}; 94299f02f2SBartosz Kaszubowski 95adede39aSŁukasz Kosmatyconst APISectionMethods = ({ 96adede39aSŁukasz Kosmaty data, 97adede39aSŁukasz Kosmaty apiName, 98adede39aSŁukasz Kosmaty header = 'Methods', 99adede39aSŁukasz Kosmaty exposeInSidebar = true, 100adede39aSŁukasz Kosmaty}: APISectionMethodsProps) => 101299f02f2SBartosz Kaszubowski data?.length ? ( 102299f02f2SBartosz Kaszubowski <> 1031b3dce65SBartosz Kaszubowski <H2 key="methods-header">{header}</H2> 1044c73bbf6SBartosz Kaszubowski {data.map((method: MethodDefinitionData | PropData) => 105adede39aSŁukasz Kosmaty renderMethod(method, { apiName, header, exposeInSidebar }) 106e3060685SBartosz Kaszubowski )} 107299f02f2SBartosz Kaszubowski </> 108299f02f2SBartosz Kaszubowski ) : null; 109299f02f2SBartosz Kaszubowski 1103e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({ 1113e972ef8SBartosz Kaszubowski transform: 'rotate(180deg)', 1123e972ef8SBartosz Kaszubowski marginRight: spacing[2], 1133e972ef8SBartosz Kaszubowski verticalAlign: 'middle', 1143e972ef8SBartosz Kaszubowski}); 1153e972ef8SBartosz Kaszubowski 116299f02f2SBartosz Kaszubowskiexport default APISectionMethods; 117adede39aSŁukasz Kosmaty 118adede39aSŁukasz Kosmatyexport const APIMethod = ({ 119adede39aSŁukasz Kosmaty name, 120adede39aSŁukasz Kosmaty comment, 121adede39aSŁukasz Kosmaty returnTypeName, 122adede39aSŁukasz Kosmaty isProperty = false, 123adede39aSŁukasz Kosmaty isReturnTypeReference = false, 124adede39aSŁukasz Kosmaty exposeInSidebar = false, 125adede39aSŁukasz Kosmaty parameters = [], 126c468593bSŁukasz Kosmaty platforms = [], 127adede39aSŁukasz Kosmaty}: { 128adede39aSŁukasz Kosmaty exposeInSidebar?: boolean; 129adede39aSŁukasz Kosmaty name: string; 130adede39aSŁukasz Kosmaty comment: string; 131adede39aSŁukasz Kosmaty returnTypeName: string; 132adede39aSŁukasz Kosmaty isProperty: boolean; 133adede39aSŁukasz Kosmaty isReturnTypeReference: boolean; 134c468593bSŁukasz Kosmaty platforms: ('Android' | 'iOS' | 'Web')[]; 135adede39aSŁukasz Kosmaty parameters: { 136adede39aSŁukasz Kosmaty name: string; 137adede39aSŁukasz Kosmaty comment?: string; 138adede39aSŁukasz Kosmaty typeName: string; 139adede39aSŁukasz Kosmaty isReference?: boolean; 140adede39aSŁukasz Kosmaty }[]; 141adede39aSŁukasz Kosmaty}): JSX.Element[] => { 142adede39aSŁukasz Kosmaty const parsedParameters = parameters.map(param => ({ 143adede39aSŁukasz Kosmaty name: param.name, 144adede39aSŁukasz Kosmaty type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' }, 145adede39aSŁukasz Kosmaty comment: { 146adede39aSŁukasz Kosmaty text: param.comment, 147adede39aSŁukasz Kosmaty }, 148adede39aSŁukasz Kosmaty })); 149adede39aSŁukasz Kosmaty return renderMethod( 150adede39aSŁukasz Kosmaty { 151adede39aSŁukasz Kosmaty name, 152adede39aSŁukasz Kosmaty signatures: [ 153adede39aSŁukasz Kosmaty { 154adede39aSŁukasz Kosmaty name, 155adede39aSŁukasz Kosmaty parameters: parsedParameters, 156adede39aSŁukasz Kosmaty comment: { 157adede39aSŁukasz Kosmaty text: comment, 158c468593bSŁukasz Kosmaty tags: platforms.map(text => ({ 159c468593bSŁukasz Kosmaty tag: 'platform', 160c468593bSŁukasz Kosmaty text, 161c468593bSŁukasz Kosmaty })), 162adede39aSŁukasz Kosmaty }, 163adede39aSŁukasz Kosmaty type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' }, 164adede39aSŁukasz Kosmaty }, 165adede39aSŁukasz Kosmaty ], 166adede39aSŁukasz Kosmaty kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function, 167adede39aSŁukasz Kosmaty }, 168adede39aSŁukasz Kosmaty { exposeInSidebar } 169adede39aSŁukasz Kosmaty ); 170adede39aSŁukasz Kosmaty}; 171