import type {ReactNode} from 'react'; import {Fragment, useState} from 'react'; import styled from '@emotion/styled'; import {KeyValueTable, KeyValueTableRow} from 'sentry/components/keyValueTable'; import {Tooltip} from 'sentry/components/tooltip'; import {IconChevron} from 'sentry/icons'; import {t} from 'sentry/locale'; import {space} from 'sentry/styles/space'; export const Indent = styled('div')` padding-left: ${space(4)}; `; export const InspectorMargin = styled('div')` padding: ${space(1)}; `; const NotFoundText = styled('span')` color: ${p => p.theme.subText}; font-size: ${p => p.theme.fontSizeSmall}; `; const WarningText = styled('span')` color: ${p => p.theme.errorText}; `; export function Warning({warnings}: {warnings: string[]}) { if (warnings.includes('JSON_TRUNCATED') || warnings.includes('TEXT_TRUNCATED')) { return ( {t('Truncated (~~) due to exceeding 150k characters')} ); } if (warnings.includes('INVALID_JSON')) { return {t('Invalid JSON')}; } return null; } export function SizeTooltip({children}: {children: ReactNode}) { return ( {children} ); } export type KeyValueTuple = { key: string; value: string | ReactNode; type?: 'warning' | 'error'; }; export function keyValueTableOrNotFound(data: KeyValueTuple[], notFoundText: string) { return data.length ? ( {data.map(({key, value, type}) => ( {value}} /> ))} ) : ( {notFoundText} ); } const ValueContainer = styled('span')` overflow: auto; `; const SectionTitle = styled('dt')``; const SectionTitleExtra = styled('span')` flex-grow: 1; text-align: right; font-weight: ${p => p.theme.fontWeightNormal}; `; const SectionData = styled('dd')` font-size: ${p => p.theme.fontSizeExtraSmall}; `; const ToggleButton = styled('button')` background: ${p => p.theme.background}; border: 0; color: ${p => p.theme.headingColor}; font-size: ${p => p.theme.fontSizeSmall}; font-weight: ${p => p.theme.fontWeightBold}; line-height: ${p => p.theme.text.lineHeightBody}; width: 100%; display: flex; align-items: center; justify-content: flex-start; gap: ${space(1)}; padding: ${space(0.5)} ${space(1)}; :hover { background: ${p => p.theme.backgroundSecondary}; } `; export function SectionItem({ children, title, titleExtra, }: { children: ReactNode; title: ReactNode; titleExtra?: ReactNode; }) { const [isOpen, setIsOpen] = useState(true); return ( setIsOpen(!isOpen)}> {title} {titleExtra ? {titleExtra} : null} {isOpen ? children : null} ); } const StyledKeyValueTable = styled(KeyValueTable)` & > dt { font-size: ${p => p.theme.fontSizeSmall}; padding-left: ${space(4)}; } & > dd { ${p => p.theme.overflowEllipsis}; font-size: ${p => p.theme.fontSizeSmall}; display: flex; justify-content: flex-end; white-space: normal; text-align: right; } `;