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