import {Argument as ArgumentType, Property as PropertyType} from '~/resource/graphs/types'; import React, {FunctionComponent, useMemo, useState} from 'react'; import {borderColor, em, sameBorder, textLightColor, textLighterColor} from '~/utils/style'; import Icon from '~/components/Icon'; import styled from 'styled-components'; const Wrapper = styled.div` ${sameBorder({radius: true})} & + & { margin-top: ${em(10)}; } > .argument-row { display: flex; align-items: center; justify-content: space-between; padding: ${em(8)} ${em(10)}; line-height: 1.5; > .argument-text { flex: auto; overflow: hidden; word-break: break-all; } > .argument-raw { overflow: auto; width: 100%; pre { margin: 0; } } > .argument-operation { flex: none; cursor: pointer; font-size: ${em(14)}; margin-left: ${em(10)}; color: ${textLighterColor}; &:hover, &:active { color: ${textLightColor}; } } &:not(:first-child) { border-top: 1px solid ${borderColor}; } } `; type ArgumentProps = { value: ArgumentType | PropertyType; expand?: boolean; showNodeDodumentation?: () => unknown; }; const Argument: FunctionComponent = ({value, expand, showNodeDodumentation}) => { const [expanded, setExpanded] = useState(expand ?? false); const expandable = useMemo(() => { const argument = value as ArgumentType; return !!(argument.children && argument.children.length); }, [value]); return (
{value.name ? ( <> {value.name}: {value.value} ) : ( value.value.split('\n').map((line, index) => ( {index !== 0 &&
} {line}
)) )}
{(value as PropertyType).documentation && ( showNodeDodumentation?.()}> )} {expandable && ( setExpanded(e => !e)}> )}
{expandable && expanded && (value as ArgumentType)?.children?.map((item, index) => (
{item.type === 'raw' ? (
{item.value}
) : ( {item.name ? `${item.name}: ` : ''} {item.type === 'code' ? {item.value} : item.value} )}
))}
); }; export default Argument;