1f4b1168bSBartosz Kaszubowskiimport { spacing } from '@expo/styleguide-base';
29f8df43aSCedric van Puttenimport assert from 'assert';
39f8df43aSCedric van Puttenimport { ComponentType, Fragment, ReactNode, useId } from 'react';
49f8df43aSCedric van Putten
59f8df43aSCedric van Puttenimport { Table, Row as TableRow, Cell as TableCell } from '~/ui/components/Table';
69f8df43aSCedric van Puttenimport { CODE, P, FOOTNOTE } from '~/ui/components/Text';
79f8df43aSCedric van Putten
89f8df43aSCedric van Putteninterface MetadataTableProps {
99f8df43aSCedric van Putten  headers: MetadataHeader[];
109f8df43aSCedric van Putten  children: MetadataProperty[];
119f8df43aSCedric van Putten}
129f8df43aSCedric van Putten
139f8df43aSCedric van Puttentype MetadataHeader = 'Description' | 'Language Code' | 'Language' | 'Name' | 'Property' | 'Type';
149f8df43aSCedric van Putten
159f8df43aSCedric van Putteninterface MetadataProperty {
169f8df43aSCedric van Putten  name: string;
179f8df43aSCedric van Putten  nested?: number;
189f8df43aSCedric van Putten  type?: string | ReactNode;
199f8df43aSCedric van Putten  description?: string | ReactNode[];
209f8df43aSCedric van Putten  rules?: string[];
219f8df43aSCedric van Putten}
229f8df43aSCedric van Putten
239f8df43aSCedric van Putteninterface MetadataPropertyProps {
249f8df43aSCedric van Putten  property: MetadataProperty;
259f8df43aSCedric van Putten}
269f8df43aSCedric van Putten
279f8df43aSCedric van Puttenexport function MetadataTable(props: MetadataTableProps) {
289f8df43aSCedric van Putten  const id = useId();
299f8df43aSCedric van Putten  const { headers = ['Property', 'Type', 'Description'], children = [] } = props;
309f8df43aSCedric van Putten
319f8df43aSCedric van Putten  return (
32*234e070fSBartosz Kaszubowski    <div className="mb-2 mt-1">
339f8df43aSCedric van Putten      <Table headers={headers}>
349f8df43aSCedric van Putten        {children.map(property => (
359f8df43aSCedric van Putten          <TableRow key={`${id}-${property.name}`}>
369f8df43aSCedric van Putten            {headers.map(column => {
379f8df43aSCedric van Putten              const Property = metadataProperties[column];
389f8df43aSCedric van Putten              assert(Property, `No metadata property renderer found for ${column}`);
399f8df43aSCedric van Putten              return <Property key={`${id}-${property.name}-${column}`} property={property} />;
409f8df43aSCedric van Putten            })}
419f8df43aSCedric van Putten          </TableRow>
429f8df43aSCedric van Putten        ))}
439f8df43aSCedric van Putten      </Table>
449f8df43aSCedric van Putten    </div>
459f8df43aSCedric van Putten  );
469f8df43aSCedric van Putten}
479f8df43aSCedric van Putten
489f8df43aSCedric van Puttenconst metadataProperties: Record<MetadataHeader, ComponentType<MetadataPropertyProps>> = {
499f8df43aSCedric van Putten  Description: MetadataDescriptionCell,
509f8df43aSCedric van Putten  Language: MetadataLanguageNameCell,
519f8df43aSCedric van Putten  'Language Code': MetadataLanguageCodeCell,
529f8df43aSCedric van Putten  Name: MetadataNameCell,
539f8df43aSCedric van Putten  Property: MetadataNameCell,
549f8df43aSCedric van Putten  Type: MetadataTypeCell,
559f8df43aSCedric van Putten};
569f8df43aSCedric van Putten
579f8df43aSCedric van Puttenfunction MetadataNameCell({ property }: MetadataPropertyProps) {
589f8df43aSCedric van Putten  const style = {
599f8df43aSCedric van Putten    display: property.nested ? 'list-item' : 'block',
609f8df43aSCedric van Putten    marginLeft: property.nested ? spacing[6] * property.nested : 0,
619f8df43aSCedric van Putten    listStyleType: (property.nested ?? 0) % 2 ? 'default' : 'circle',
629f8df43aSCedric van Putten  };
639f8df43aSCedric van Putten
649f8df43aSCedric van Putten  return (
659f8df43aSCedric van Putten    <TableCell fitContent>
669f8df43aSCedric van Putten      <P css={style}>
679f8df43aSCedric van Putten        <CODE>{property.name}</CODE>
689f8df43aSCedric van Putten      </P>
699f8df43aSCedric van Putten    </TableCell>
709f8df43aSCedric van Putten  );
719f8df43aSCedric van Putten}
729f8df43aSCedric van Putten
739f8df43aSCedric van Puttenfunction MetadataTypeCell({ property }: MetadataPropertyProps) {
749f8df43aSCedric van Putten  return (
759f8df43aSCedric van Putten    <TableCell fitContent>
769f8df43aSCedric van Putten      <P>
779f8df43aSCedric van Putten        <CODE>{property.type}</CODE>
789f8df43aSCedric van Putten      </P>
799f8df43aSCedric van Putten      <MetadataPropertyTypeRules property={property} />
809f8df43aSCedric van Putten    </TableCell>
819f8df43aSCedric van Putten  );
829f8df43aSCedric van Putten}
839f8df43aSCedric van Putten
849f8df43aSCedric van Puttenfunction MetadataPropertyTypeRules({ property }: MetadataPropertyProps) {
859f8df43aSCedric van Putten  const id = useId();
869f8df43aSCedric van Putten
879f8df43aSCedric van Putten  return (
889f8df43aSCedric van Putten    <P css={{ marginTop: spacing[1] }}>
899f8df43aSCedric van Putten      {property.rules?.map(rule => (
909f8df43aSCedric van Putten        <FOOTNOTE
919f8df43aSCedric van Putten          key={`${id}-${property.name}-${rule}`}
929f8df43aSCedric van Putten          tag="span"
939f8df43aSCedric van Putten          theme="secondary"
949f8df43aSCedric van Putten          css={{ display: 'block', whiteSpace: 'nowrap' }}>
959f8df43aSCedric van Putten          {rule}
969f8df43aSCedric van Putten        </FOOTNOTE>
979f8df43aSCedric van Putten      ))}
989f8df43aSCedric van Putten    </P>
999f8df43aSCedric van Putten  );
1009f8df43aSCedric van Putten}
1019f8df43aSCedric van Putten
1029f8df43aSCedric van Puttenfunction MetadataDescriptionCell({ property }: MetadataPropertyProps) {
1039f8df43aSCedric van Putten  return (
1049f8df43aSCedric van Putten    <TableCell>
1059f8df43aSCedric van Putten      {typeof property.description === 'string' ? (
1069f8df43aSCedric van Putten        <P>{property.description}</P>
1079f8df43aSCedric van Putten      ) : (
1089f8df43aSCedric van Putten        property.description?.map((item, i) => (
1099f8df43aSCedric van Putten          <Fragment key={`${property.name}-${i}`}>{item}</Fragment>
1109f8df43aSCedric van Putten        ))
1119f8df43aSCedric van Putten      )}
1129f8df43aSCedric van Putten    </TableCell>
1139f8df43aSCedric van Putten  );
1149f8df43aSCedric van Putten}
1159f8df43aSCedric van Putten
1169f8df43aSCedric van Puttenfunction MetadataLanguageNameCell({ property }: MetadataPropertyProps) {
1179f8df43aSCedric van Putten  return (
1189f8df43aSCedric van Putten    <TableCell fitContent>
1199f8df43aSCedric van Putten      <P>{property.name}</P>
1209f8df43aSCedric van Putten    </TableCell>
1219f8df43aSCedric van Putten  );
1229f8df43aSCedric van Putten}
1239f8df43aSCedric van Putten
1249f8df43aSCedric van Puttenfunction MetadataLanguageCodeCell({ property }: MetadataPropertyProps) {
1259f8df43aSCedric van Putten  return (
1269f8df43aSCedric van Putten    <TableCell fitContent>
1279f8df43aSCedric van Putten      {typeof property.description === 'string' ? (
1289f8df43aSCedric van Putten        <P>
1299f8df43aSCedric van Putten          <CODE>{property.description}</CODE>
1309f8df43aSCedric van Putten        </P>
1319f8df43aSCedric van Putten      ) : (
1329f8df43aSCedric van Putten        property.description?.map((item, i) => (
1339f8df43aSCedric van Putten          <Fragment key={`${property.name}-${i}`}>{item}</Fragment>
1349f8df43aSCedric van Putten        ))
1359f8df43aSCedric van Putten      )}
1369f8df43aSCedric van Putten    </TableCell>
1379f8df43aSCedric van Putten  );
1389f8df43aSCedric van Putten}
1399f8df43aSCedric van Puttenexport function MetadataSubcategories({ children }: { children: string[] }) {
1409f8df43aSCedric van Putten  const id = useId();
1419f8df43aSCedric van Putten
1429f8df43aSCedric van Putten  return (
1439f8df43aSCedric van Putten    <>
1449f8df43aSCedric van Putten      {children.map(category => (
1459f8df43aSCedric van Putten        <Fragment key={`${id}-${category}`}>
146*234e070fSBartosz Kaszubowski          <CODE className="my-1">{category}</CODE>{' '}
1479f8df43aSCedric van Putten        </Fragment>
1489f8df43aSCedric van Putten      ))}
1499f8df43aSCedric van Putten    </>
1509f8df43aSCedric van Putten  );
1519f8df43aSCedric van Putten}
152