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