UNPKG

gatsby-theme-docz

Version:

Gatsby theme created to use Docz

85 lines (78 loc) 2.46 kB
/** @jsx jsx */ import { useState } from 'react' import { jsx } from 'theme-ui' import { ChevronDown, ChevronUp } from '../Icons' import * as styles from './styles' export const getDefaultValue = ({ defaultValue, type, flowType }) => { const propType = flowType ? flowType : type if (!defaultValue || !defaultValue.value) return null if (defaultValue.value === "''") { return '[Empty string]' } if (propType && propType.name === 'string') { return defaultValue.value.replace(/\'/g, '"') } if (typeof defaultValue.value === 'object' && defaultValue.value.toString) { return defaultValue.value.toString() } return defaultValue.value } export const Prop = ({ propName, prop, getPropType, isToggle }) => { const [showing, setShowing] = useState(isToggle || false) if (!prop.type && !prop.flowType) return null const toggle = () => setShowing(s => !s) return ( <div sx={styles.line} data-testid="prop"> <div sx={styles.content}> <div sx={styles.propName} data-testid="prop-name"> {propName} </div> <div sx={styles.propType} data-testid="prop-type"> {getPropType(prop)} </div> {prop.defaultValue && ( <div sx={styles.defaultValue} data-testid="prop-default-value"> <em>{getDefaultValue(prop)}</em> </div> )} <div sx={styles.right}> {prop.required && ( <div sx={styles.propRequired} data-testid="prop-required"> <strong>required</strong> </div> )} {prop.description && ( <button sx={styles.openDescBtn} onClick={toggle} data-testid="prop-toggle-description" > {showing ? <ChevronUp size={20} /> : <ChevronDown size={20} />} </button> )} </div> </div> {showing && prop.description && ( <div sx={styles.description} data-testid="prop-description"> {prop.description} </div> )} </div> ) } export const Props = ({ props, getPropType, isToggle }) => { const entries = Object.entries(props) return ( <div sx={styles.container} data-testid="props"> {entries.map(([key, prop]) => ( <Prop key={key} propName={key} prop={prop} getPropType={getPropType} isToggle={isToggle} /> ))} </div> ) }