import { spacing } from '@expo/styleguide-base'; import assert from 'assert'; import { ComponentType, Fragment, ReactNode, useId } from 'react'; import { Table, Row as TableRow, Cell as TableCell } from '~/ui/components/Table'; import { CODE, P, FOOTNOTE } from '~/ui/components/Text'; interface MetadataTableProps { headers: MetadataHeader[]; children: MetadataProperty[]; } type MetadataHeader = 'Description' | 'Language Code' | 'Language' | 'Name' | 'Property' | 'Type'; interface MetadataProperty { name: string; nested?: number; type?: string | ReactNode; description?: string | ReactNode[]; rules?: string[]; } interface MetadataPropertyProps { property: MetadataProperty; } export function MetadataTable(props: MetadataTableProps) { const id = useId(); const { headers = ['Property', 'Type', 'Description'], children = [] } = props; return (
{children.map(property => ( {headers.map(column => { const Property = metadataProperties[column]; assert(Property, `No metadata property renderer found for ${column}`); return ; })} ))}
); } const metadataProperties: Record> = { Description: MetadataDescriptionCell, Language: MetadataLanguageNameCell, 'Language Code': MetadataLanguageCodeCell, Name: MetadataNameCell, Property: MetadataNameCell, Type: MetadataTypeCell, }; function MetadataNameCell({ property }: MetadataPropertyProps) { const style = { display: property.nested ? 'list-item' : 'block', marginLeft: property.nested ? spacing[6] * property.nested : 0, listStyleType: (property.nested ?? 0) % 2 ? 'default' : 'circle', }; return (

{property.name}

); } function MetadataTypeCell({ property }: MetadataPropertyProps) { return (

{property.type}

); } function MetadataPropertyTypeRules({ property }: MetadataPropertyProps) { const id = useId(); return (

{property.rules?.map(rule => ( {rule} ))}

); } function MetadataDescriptionCell({ property }: MetadataPropertyProps) { return ( {typeof property.description === 'string' ? (

{property.description}

) : ( property.description?.map((item, i) => ( {item} )) )}
); } function MetadataLanguageNameCell({ property }: MetadataPropertyProps) { return (

{property.name}

); } function MetadataLanguageCodeCell({ property }: MetadataPropertyProps) { return ( {typeof property.description === 'string' ? (

{property.description}

) : ( property.description?.map((item, i) => ( {item} )) )}
); } export function MetadataSubcategories({ children }: { children: string[] }) { const id = useId(); return ( <> {children.map(category => ( {category}{' '} ))} ); }