13e972ef8SBartosz Kaszubowskiimport { css } from '@emotion/react'; 23e972ef8SBartosz Kaszubowskiimport { theme, spacing, UndoIcon, iconSize } from '@expo/styleguide'; 3299f02f2SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown'; 4299f02f2SBartosz Kaszubowski 51886d870SBartosz Kaszubowskiimport { H2, H3Code, H4, H4Code } from '~/components/plugins/Headings'; 6504f93b3SBartosz Kaszubowskiimport { APIDataType } from '~/components/plugins/api/APIDataType'; 7d8d79196SBartosz Kaszubowskiimport { 86b7802baSBartosz Kaszubowski AccessorDefinitionData, 9d8d79196SBartosz Kaszubowski MethodDefinitionData, 10d8d79196SBartosz Kaszubowski MethodSignatureData, 11d8d79196SBartosz Kaszubowski PropData, 12dd9570b9SBartosz Kaszubowski TypeSignaturesData, 13d8d79196SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes'; 1425b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote'; 15b3bd70ceSTomasz Sapetaimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags'; 16299f02f2SBartosz Kaszubowskiimport { 17299f02f2SBartosz Kaszubowski CommentTextBlock, 18adede39aSŁukasz Kosmaty getMethodName, 19c4c6b9d1SBartosz Kaszubowski getTagNamesList, 20dc379e46SBartosz Kaszubowski mdComponents, 217534da61SBartosz Kaszubowski renderParams, 22299f02f2SBartosz Kaszubowski resolveTypeName, 236a5c065cSBartosz Kaszubowski STYLES_APIBOX, 246a5c065cSBartosz Kaszubowski STYLES_APIBOX_NESTED, 256a5c065cSBartosz Kaszubowski STYLES_NESTED_SECTION_HEADER, 266a5c065cSBartosz Kaszubowski STYLES_NOT_EXPOSED_HEADER, 27adede39aSŁukasz Kosmaty TypeDocKind, 28299f02f2SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils'; 29*12abeb84SBartosz Kaszubowskiimport { LI, UL, CODE } from '~/ui/components/Text'; 30299f02f2SBartosz Kaszubowski 31299f02f2SBartosz Kaszubowskiexport type APISectionMethodsProps = { 32e3060685SBartosz Kaszubowski data: (MethodDefinitionData | PropData)[]; 33299f02f2SBartosz Kaszubowski apiName?: string; 341b3dce65SBartosz Kaszubowski header?: string; 35adede39aSŁukasz Kosmaty exposeInSidebar?: boolean; 36299f02f2SBartosz Kaszubowski}; 37299f02f2SBartosz Kaszubowski 384c73bbf6SBartosz Kaszubowskiexport type RenderMethodOptions = { 394c73bbf6SBartosz Kaszubowski apiName?: string; 404c73bbf6SBartosz Kaszubowski header?: string; 414c73bbf6SBartosz Kaszubowski exposeInSidebar?: boolean; 424c73bbf6SBartosz Kaszubowski}; 434c73bbf6SBartosz Kaszubowski 44d8d79196SBartosz Kaszubowskiexport const renderMethod = ( 456b7802baSBartosz Kaszubowski method: MethodDefinitionData | AccessorDefinitionData | PropData, 46dd9570b9SBartosz Kaszubowski { apiName, exposeInSidebar = true }: RenderMethodOptions = {} 471886d870SBartosz Kaszubowski): JSX.Element[] => { 486b7802baSBartosz Kaszubowski const signatures = 496b7802baSBartosz Kaszubowski (method as MethodDefinitionData).signatures || 506b7802baSBartosz Kaszubowski (method as PropData)?.type?.declaration?.signatures || 516b7802baSBartosz Kaszubowski (method as AccessorDefinitionData)?.getSignature || 526b7802baSBartosz Kaszubowski []; 531886d870SBartosz Kaszubowski const HeaderComponent = exposeInSidebar ? H3Code : H4Code; 54dd9570b9SBartosz Kaszubowski return signatures.map( 55dd9570b9SBartosz Kaszubowski ({ name, parameters, comment, type }: MethodSignatureData | TypeSignaturesData) => ( 566a5c065cSBartosz Kaszubowski <div 57dd9570b9SBartosz Kaszubowski key={`method-signature-${method.name || name}-${parameters?.length || 0}`} 58*12abeb84SBartosz Kaszubowski css={[STYLES_APIBOX, STYLES_APIBOX_NESTED]}> 5925b16883SBartosz Kaszubowski <APISectionDeprecationNote comment={comment} /> 60d9bd5b6cSBartosz Kaszubowski <APISectionPlatformTags comment={comment} prefix="Only for:" /> 61c4c6b9d1SBartosz Kaszubowski <HeaderComponent tags={getTagNamesList(comment)}> 62*12abeb84SBartosz Kaszubowski <CODE css={!exposeInSidebar ? STYLES_NOT_EXPOSED_HEADER : undefined}> 63adede39aSŁukasz Kosmaty {getMethodName(method as MethodDefinitionData, apiName, name, parameters)} 64*12abeb84SBartosz Kaszubowski </CODE> 651886d870SBartosz Kaszubowski </HeaderComponent> 66*12abeb84SBartosz Kaszubowski {parameters && parameters.length > 0 && ( 67*12abeb84SBartosz Kaszubowski <> 68*12abeb84SBartosz Kaszubowski {renderParams(parameters)} 69*12abeb84SBartosz Kaszubowski <br /> 70*12abeb84SBartosz Kaszubowski </> 71*12abeb84SBartosz Kaszubowski )} 727534da61SBartosz Kaszubowski <CommentTextBlock comment={comment} includePlatforms={false} /> 736a5c065cSBartosz Kaszubowski {resolveTypeName(type) !== 'undefined' && ( 74af644ed4SBartosz Kaszubowski <> 756a5c065cSBartosz Kaszubowski <div css={STYLES_NESTED_SECTION_HEADER}> 76299f02f2SBartosz Kaszubowski <H4>Returns</H4> 776a5c065cSBartosz Kaszubowski </div> 78*12abeb84SBartosz Kaszubowski <UL css={STYLES_NO_BULLET_LIST}> 793e972ef8SBartosz Kaszubowski <LI> 80dd9570b9SBartosz Kaszubowski <UndoIcon 81dd9570b9SBartosz Kaszubowski color={theme.icon.secondary} 82dd9570b9SBartosz Kaszubowski size={iconSize.small} 83dd9570b9SBartosz Kaszubowski css={returnIconStyles} 84dd9570b9SBartosz Kaszubowski /> 85504f93b3SBartosz Kaszubowski <APIDataType typeDefinition={type} /> 86299f02f2SBartosz Kaszubowski </LI> 87299f02f2SBartosz Kaszubowski </UL> 88*12abeb84SBartosz Kaszubowski <> 89*12abeb84SBartosz Kaszubowski <br /> 90*12abeb84SBartosz Kaszubowski <ReactMarkdown components={mdComponents}>{comment?.returns ?? ''}</ReactMarkdown> 91*12abeb84SBartosz Kaszubowski </> 92af644ed4SBartosz Kaszubowski </> 936a5c065cSBartosz Kaszubowski )} 94299f02f2SBartosz Kaszubowski </div> 95dd9570b9SBartosz Kaszubowski ) 96dd9570b9SBartosz Kaszubowski ); 971886d870SBartosz Kaszubowski}; 98299f02f2SBartosz Kaszubowski 99adede39aSŁukasz Kosmatyconst APISectionMethods = ({ 100adede39aSŁukasz Kosmaty data, 101adede39aSŁukasz Kosmaty apiName, 102adede39aSŁukasz Kosmaty header = 'Methods', 103adede39aSŁukasz Kosmaty exposeInSidebar = true, 104adede39aSŁukasz Kosmaty}: APISectionMethodsProps) => 105299f02f2SBartosz Kaszubowski data?.length ? ( 106299f02f2SBartosz Kaszubowski <> 1071b3dce65SBartosz Kaszubowski <H2 key="methods-header">{header}</H2> 1084c73bbf6SBartosz Kaszubowski {data.map((method: MethodDefinitionData | PropData) => 109adede39aSŁukasz Kosmaty renderMethod(method, { apiName, header, exposeInSidebar }) 110e3060685SBartosz Kaszubowski )} 111299f02f2SBartosz Kaszubowski </> 112299f02f2SBartosz Kaszubowski ) : null; 113299f02f2SBartosz Kaszubowski 1143e972ef8SBartosz Kaszubowskiconst returnIconStyles = css({ 1153e972ef8SBartosz Kaszubowski transform: 'rotate(180deg)', 1163e972ef8SBartosz Kaszubowski marginRight: spacing[2], 1173e972ef8SBartosz Kaszubowski verticalAlign: 'middle', 1183e972ef8SBartosz Kaszubowski}); 1193e972ef8SBartosz Kaszubowski 120299f02f2SBartosz Kaszubowskiexport default APISectionMethods; 121adede39aSŁukasz Kosmaty 122adede39aSŁukasz Kosmatyexport const APIMethod = ({ 123adede39aSŁukasz Kosmaty name, 124adede39aSŁukasz Kosmaty comment, 125adede39aSŁukasz Kosmaty returnTypeName, 126adede39aSŁukasz Kosmaty isProperty = false, 127adede39aSŁukasz Kosmaty isReturnTypeReference = false, 128adede39aSŁukasz Kosmaty exposeInSidebar = false, 129adede39aSŁukasz Kosmaty parameters = [], 130c468593bSŁukasz Kosmaty platforms = [], 131adede39aSŁukasz Kosmaty}: { 132adede39aSŁukasz Kosmaty exposeInSidebar?: boolean; 133adede39aSŁukasz Kosmaty name: string; 134adede39aSŁukasz Kosmaty comment: string; 135adede39aSŁukasz Kosmaty returnTypeName: string; 136adede39aSŁukasz Kosmaty isProperty: boolean; 137adede39aSŁukasz Kosmaty isReturnTypeReference: boolean; 138c468593bSŁukasz Kosmaty platforms: ('Android' | 'iOS' | 'Web')[]; 139adede39aSŁukasz Kosmaty parameters: { 140adede39aSŁukasz Kosmaty name: string; 141adede39aSŁukasz Kosmaty comment?: string; 142adede39aSŁukasz Kosmaty typeName: string; 143adede39aSŁukasz Kosmaty isReference?: boolean; 144adede39aSŁukasz Kosmaty }[]; 145adede39aSŁukasz Kosmaty}): JSX.Element[] => { 146adede39aSŁukasz Kosmaty const parsedParameters = parameters.map(param => ({ 147adede39aSŁukasz Kosmaty name: param.name, 148adede39aSŁukasz Kosmaty type: { name: param.typeName, type: param.isReference ? 'reference' : 'literal' }, 149adede39aSŁukasz Kosmaty comment: { 150adede39aSŁukasz Kosmaty text: param.comment, 151adede39aSŁukasz Kosmaty }, 152adede39aSŁukasz Kosmaty })); 153adede39aSŁukasz Kosmaty return renderMethod( 154adede39aSŁukasz Kosmaty { 155adede39aSŁukasz Kosmaty name, 156adede39aSŁukasz Kosmaty signatures: [ 157adede39aSŁukasz Kosmaty { 158adede39aSŁukasz Kosmaty name, 159adede39aSŁukasz Kosmaty parameters: parsedParameters, 160adede39aSŁukasz Kosmaty comment: { 161adede39aSŁukasz Kosmaty text: comment, 162c468593bSŁukasz Kosmaty tags: platforms.map(text => ({ 163c468593bSŁukasz Kosmaty tag: 'platform', 164c468593bSŁukasz Kosmaty text, 165c468593bSŁukasz Kosmaty })), 166adede39aSŁukasz Kosmaty }, 167adede39aSŁukasz Kosmaty type: { name: returnTypeName, type: isReturnTypeReference ? 'reference' : 'literal' }, 168adede39aSŁukasz Kosmaty }, 169adede39aSŁukasz Kosmaty ], 170adede39aSŁukasz Kosmaty kind: isProperty ? TypeDocKind.Property : TypeDocKind.Function, 171adede39aSŁukasz Kosmaty }, 172adede39aSŁukasz Kosmaty { exposeInSidebar } 173adede39aSŁukasz Kosmaty ); 174adede39aSŁukasz Kosmaty}; 175*12abeb84SBartosz Kaszubowski 176*12abeb84SBartosz Kaszubowskiconst STYLES_NO_BULLET_LIST = css({ 177*12abeb84SBartosz Kaszubowski listStyle: 'none', 178*12abeb84SBartosz Kaszubowski marginLeft: spacing[2], 179*12abeb84SBartosz Kaszubowski}); 180