18f5b6582SBartosz Kaszubowskiimport ReactMarkdown from 'react-markdown'; 22c8d37c0SBartosz Kaszubowski 32c8d37c0SBartosz Kaszubowskiimport { 42c8d37c0SBartosz Kaszubowski ClassDefinitionData, 52c8d37c0SBartosz Kaszubowski GeneratedData, 62c8d37c0SBartosz Kaszubowski PropData, 72c8d37c0SBartosz Kaszubowski} from '~/components/plugins/api/APIDataTypes'; 825b16883SBartosz Kaszubowskiimport { APISectionDeprecationNote } from '~/components/plugins/api/APISectionDeprecationNote'; 9d8d79196SBartosz Kaszubowskiimport { renderMethod } from '~/components/plugins/api/APISectionMethods'; 10df72b035SBartosz Kaszubowskiimport { APISectionPlatformTags } from '~/components/plugins/api/APISectionPlatformTags'; 11d8d79196SBartosz Kaszubowskiimport { renderProp } from '~/components/plugins/api/APISectionProps'; 122c8d37c0SBartosz Kaszubowskiimport { 132c8d37c0SBartosz Kaszubowski CommentTextBlock, 14a16a3d18SBartosz Kaszubowski H3Code, 158f5b6582SBartosz Kaszubowski getTagData, 16c4c6b9d1SBartosz Kaszubowski getTagNamesList, 178f5b6582SBartosz Kaszubowski mdComponents, 182c8d37c0SBartosz Kaszubowski resolveTypeName, 196a5c065cSBartosz Kaszubowski STYLES_APIBOX, 2012abeb84SBartosz Kaszubowski STYLES_APIBOX_NESTED, 212c8d37c0SBartosz Kaszubowski TypeDocKind, 225990cc31SBartosz Kaszubowski getCommentContent, 23be43ea08SBartosz Kaszubowski BoxSectionHeader, 242c8d37c0SBartosz Kaszubowski} from '~/components/plugins/api/APISectionUtils'; 253324c13cSBartosz Kaszubowskiimport { H2, BOLD, P, CODE, MONOSPACE } from '~/ui/components/Text'; 262c8d37c0SBartosz Kaszubowski 272c8d37c0SBartosz Kaszubowskiexport type APISectionClassesProps = { 282c8d37c0SBartosz Kaszubowski data: GeneratedData[]; 292c8d37c0SBartosz Kaszubowski}; 302c8d37c0SBartosz Kaszubowski 313443bacaSBartosz Kaszubowskiconst classNamesMap: Record<string, string> = { 323443bacaSBartosz Kaszubowski AccelerometerSensor: 'Accelerometer', 333443bacaSBartosz Kaszubowski BarometerSensor: 'Barometer', 343443bacaSBartosz Kaszubowski DeviceMotionSensor: 'DeviceMotion', 353443bacaSBartosz Kaszubowski GyroscopeSensor: 'Gyroscope', 363443bacaSBartosz Kaszubowski MagnetometerSensor: 'Magnetometer', 373443bacaSBartosz Kaszubowski} as const; 383443bacaSBartosz Kaszubowski 391886d870SBartosz Kaszubowskiconst isProp = (child: PropData) => 401886d870SBartosz Kaszubowski child.kind === TypeDocKind.Property && 411886d870SBartosz Kaszubowski !child.overwrites && 421886d870SBartosz Kaszubowski !child.name.startsWith('_') && 431886d870SBartosz Kaszubowski !child.implementationOf; 442c8d37c0SBartosz Kaszubowski 4535e5274fSBartosz Kaszubowskiconst isMethod = (child: PropData, allowOverwrites: boolean = false) => 466b7802baSBartosz Kaszubowski child.kind && 476b7802baSBartosz Kaszubowski [TypeDocKind.Method, TypeDocKind.Function, TypeDocKind.Accessor].includes(child.kind) && 4835e5274fSBartosz Kaszubowski (allowOverwrites || !child.overwrites) && 498f5b6582SBartosz Kaszubowski !child.name.startsWith('_') && 508f5b6582SBartosz Kaszubowski !child?.implementationOf; 511886d870SBartosz Kaszubowski 523443bacaSBartosz Kaszubowskiconst remapClass = (clx: ClassDefinitionData) => { 53df72b035SBartosz Kaszubowski clx.isSensor = !!classNamesMap[clx.name] || Object.values(classNamesMap).includes(clx.name); 543443bacaSBartosz Kaszubowski clx.name = classNamesMap[clx.name] ?? clx.name; 551886d870SBartosz Kaszubowski 563443bacaSBartosz Kaszubowski if (clx.isSensor && clx.extendedTypes) { 573443bacaSBartosz Kaszubowski clx.extendedTypes = clx.extendedTypes.map(type => ({ 583443bacaSBartosz Kaszubowski ...type, 593443bacaSBartosz Kaszubowski name: type.name === 'default' ? 'DeviceSensor' : type.name, 603443bacaSBartosz Kaszubowski })); 613443bacaSBartosz Kaszubowski } 623443bacaSBartosz Kaszubowski 633443bacaSBartosz Kaszubowski return clx; 643443bacaSBartosz Kaszubowski}; 653443bacaSBartosz Kaszubowski 663443bacaSBartosz Kaszubowskiconst renderClass = (clx: ClassDefinitionData, exposeInSidebar: boolean): JSX.Element => { 673443bacaSBartosz Kaszubowski const { name, comment, type, extendedTypes, children, implementedTypes, isSensor } = clx; 6835e5274fSBartosz Kaszubowski 6935e5274fSBartosz Kaszubowski const properties = children?.filter(isProp); 7035e5274fSBartosz Kaszubowski const methods = children 713443bacaSBartosz Kaszubowski ?.filter(child => isMethod(child, isSensor)) 7235e5274fSBartosz Kaszubowski .sort((a: PropData, b: PropData) => a.name.localeCompare(b.name)); 7335e5274fSBartosz Kaszubowski const returnComment = getTagData('returns', comment); 7435e5274fSBartosz Kaszubowski 752c8d37c0SBartosz Kaszubowski return ( 7612abeb84SBartosz Kaszubowski <div key={`class-definition-${name}`} css={[STYLES_APIBOX, STYLES_APIBOX_NESTED]}> 7725b16883SBartosz Kaszubowski <APISectionDeprecationNote comment={comment} /> 78df72b035SBartosz Kaszubowski <APISectionPlatformTags comment={comment} prefix="Only for:" /> 79c4c6b9d1SBartosz Kaszubowski <H3Code tags={getTagNamesList(comment)}> 803324c13cSBartosz Kaszubowski <MONOSPACE weight="medium">{name}</MONOSPACE> 811886d870SBartosz Kaszubowski </H3Code> 821886d870SBartosz Kaszubowski {(extendedTypes?.length || implementedTypes?.length) && ( 83*f4b1168bSBartosz Kaszubowski <P className="mb-3"> 8412abeb84SBartosz Kaszubowski <BOLD>Type: </BOLD> 8512abeb84SBartosz Kaszubowski {type ? <CODE>{resolveTypeName(type)}</CODE> : 'Class'} 861886d870SBartosz Kaszubowski {extendedTypes?.length && ( 871886d870SBartosz Kaszubowski <> 882c8d37c0SBartosz Kaszubowski <span> extends </span> 893443bacaSBartosz Kaszubowski {extendedTypes.map(extendedType => ( 9012abeb84SBartosz Kaszubowski <CODE key={`extends-${extendedType.name}`}>{resolveTypeName(extendedType)}</CODE> 913443bacaSBartosz Kaszubowski ))} 921886d870SBartosz Kaszubowski </> 931886d870SBartosz Kaszubowski )} 941886d870SBartosz Kaszubowski {implementedTypes?.length && ( 951886d870SBartosz Kaszubowski <> 961886d870SBartosz Kaszubowski <span> implements </span> 971886d870SBartosz Kaszubowski {implementedTypes.map(implementedType => ( 9812abeb84SBartosz Kaszubowski <CODE key={`implements-${implementedType.name}`}> 991886d870SBartosz Kaszubowski {resolveTypeName(implementedType)} 10012abeb84SBartosz Kaszubowski </CODE> 1011886d870SBartosz Kaszubowski ))} 1021886d870SBartosz Kaszubowski </> 1031886d870SBartosz Kaszubowski )} 1042c8d37c0SBartosz Kaszubowski </P> 1052c8d37c0SBartosz Kaszubowski )} 106df72b035SBartosz Kaszubowski <CommentTextBlock comment={comment} includePlatforms={false} /> 1078f5b6582SBartosz Kaszubowski {returnComment && ( 1088f5b6582SBartosz Kaszubowski <> 109be43ea08SBartosz Kaszubowski <BoxSectionHeader text="Returns" /> 1105990cc31SBartosz Kaszubowski <ReactMarkdown components={mdComponents}> 1115990cc31SBartosz Kaszubowski {getCommentContent(returnComment.content)} 1125990cc31SBartosz Kaszubowski </ReactMarkdown> 1138f5b6582SBartosz Kaszubowski </> 1148f5b6582SBartosz Kaszubowski )} 1152c8d37c0SBartosz Kaszubowski {properties?.length ? ( 1162c8d37c0SBartosz Kaszubowski <> 117be43ea08SBartosz Kaszubowski <BoxSectionHeader text={`${name} Properties`} exposeInSidebar={exposeInSidebar} /> 1186a5c065cSBartosz Kaszubowski <div> 1191886d870SBartosz Kaszubowski {properties.map(property => 120dfb21e5eSBartosz Kaszubowski renderProp(property, property?.defaultValue, exposeInSidebar) 1211886d870SBartosz Kaszubowski )} 1221886d870SBartosz Kaszubowski </div> 1232c8d37c0SBartosz Kaszubowski </> 1242c8d37c0SBartosz Kaszubowski ) : null} 125*f4b1168bSBartosz Kaszubowski {methods?.length > 0 && ( 1266a5c065cSBartosz Kaszubowski <> 127be43ea08SBartosz Kaszubowski <BoxSectionHeader text={`${name} Methods`} exposeInSidebar={exposeInSidebar} /> 128dfb21e5eSBartosz Kaszubowski {methods.map(method => renderMethod(method, { exposeInSidebar }))} 1296a5c065cSBartosz Kaszubowski </> 1306a5c065cSBartosz Kaszubowski )} 1312c8d37c0SBartosz Kaszubowski </div> 1322c8d37c0SBartosz Kaszubowski ); 1332c8d37c0SBartosz Kaszubowski}; 1342c8d37c0SBartosz Kaszubowski 1351886d870SBartosz Kaszubowskiconst APISectionClasses = ({ data }: APISectionClassesProps) => { 1361886d870SBartosz Kaszubowski if (data?.length) { 137dfb21e5eSBartosz Kaszubowski const exposeInSidebar = data.length < 2; 1381886d870SBartosz Kaszubowski return ( 1391886d870SBartosz Kaszubowski <> 140dfb21e5eSBartosz Kaszubowski <H2>Classes</H2> 1413443bacaSBartosz Kaszubowski {data.map(clx => renderClass(remapClass(clx), exposeInSidebar))} 1421886d870SBartosz Kaszubowski </> 1431886d870SBartosz Kaszubowski ); 1441886d870SBartosz Kaszubowski } 1451886d870SBartosz Kaszubowski return null; 1461886d870SBartosz Kaszubowski}; 1472c8d37c0SBartosz Kaszubowski 1482c8d37c0SBartosz Kaszubowskiexport default APISectionClasses; 149