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}{' '}
))}
>
);
}