Path: blob/main/web/ui/src/features/component/ComponentBody.tsx
5304 views
import React, { Fragment } from 'react';1import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';23import { riverStringify } from '../river-js/stringify';45import { style } from './style';6import Table from './Table';7import { PartitionedBody } from './types';89import styles from './ComponentView.module.css';1011interface ComponentBodyProps {12partition: PartitionedBody;13}1415const TABLEHEADERS = ['Name', 'Value'];1617const ComponentBody = ({ partition }: ComponentBodyProps) => {18const sectionClass = partition.key.length === 1 ? '' : styles.nested;1920const renderTableData = () => {21return partition.attrs.map(({ name, value }, index) => {22return (23<tr key={name}>24<td className={styles.nameColumn}>{name}</td>25<td>26<pre className={styles.pre}>27<SyntaxHighlighter language="javascript" style={style}>28{riverStringify(value)}29</SyntaxHighlighter>30</pre>31</td>32</tr>33);34});35};3637return (38<>39<section id={partition.key.join('-')} className={sectionClass}>40{41// If the partition only has 1 key, then make it an h2.42// Otherwise, make it an h3.43partition.displayName.length === 1 ? (44<h2>{partition.displayName}</h2>45) : (46<h3>47{partition.displayName.map((val, idx) => {48return (49<Fragment key={val}>50<span>{val}</span>51{idx + 1 < partition.key.length && <span> / </span>}52</Fragment>53);54})}55</h3>56)57}58<div className={styles.sectionContent}>59{partition.attrs.length === 0 ? (60<em className={styles.informative}>(No set attributes in this block)</em>61) : (62<div className={styles.list}>63<Table tableHeaders={TABLEHEADERS} renderTableData={renderTableData} style={{ width: '210px' }} />64</div>65)}66</div>67</section>68{partition.inner.map((body) => {69return <ComponentBody key={body.key.join('.')} partition={body} />;70})}71</>72);73};7475export default ComponentBody;767778