diff --git a/src/components/JsonViewer/JsonViewer.tsx b/src/components/JsonViewer/JsonViewer.tsx index e9a79d416d..fbb5c411e3 100644 --- a/src/components/JsonViewer/JsonViewer.tsx +++ b/src/components/JsonViewer/JsonViewer.tsx @@ -27,8 +27,7 @@ import ArrowUpFromLineIcon from '@gravity-ui/icons/svgs/arrow-up-from-line.svg'; import './JsonViewer.scss'; -interface JsonViewerProps { - value: UnipikaValue; +interface JsonViewerCommonProps { unipikaSettings?: UnipikaSettings; extraTools?: React.ReactNode; tableSettings?: DT100.Settings; @@ -36,6 +35,14 @@ interface JsonViewerProps { collapsedInitially?: boolean; } +interface JsonViewerProps extends JsonViewerCommonProps { + value: UnipikaValue | {_error: string}; +} + +interface JsonViewerComponentProps extends JsonViewerCommonProps { + value: UnipikaValue; +} + interface State { flattenResult: FlattenUnipikaResult; value: JsonViewerProps['value']; @@ -88,14 +95,26 @@ function calculateState( ); } -export function JsonViewer({ +function isUnipikaValue(value: UnipikaValue | {_error: string}): value is UnipikaValue { + return !('_error' in value); +} + +export function JsonViewer(props: JsonViewerProps) { + const {value} = props; + if (!isUnipikaValue(value)) { + return value._error; + } + return ; +} + +function JsonViewerComponent({ tableSettings, value, unipikaSettings, search = true, extraTools, collapsedInitially, -}: JsonViewerProps) { +}: JsonViewerComponentProps) { const [caseSensitiveSearch, setCaseSensitiveSearch] = useSetting( CASE_SENSITIVE_JSON_SEARCH, false, diff --git a/src/components/JsonViewer/unipika/unipika.ts b/src/components/JsonViewer/unipika/unipika.ts index 7066ba83d4..9fd5201809 100644 --- a/src/components/JsonViewer/unipika/unipika.ts +++ b/src/components/JsonViewer/unipika/unipika.ts @@ -15,7 +15,14 @@ export const defaultUnipikaSettings = { }; export function unipikaConvert(value: unknown) { - return unipika.converters.yson(value, defaultUnipikaSettings); + let result; + try { + result = unipika.converters.yson(value, defaultUnipikaSettings); + } catch (e) { + console.error(e); + result = {_error: 'JSON is invalid'}; + } + return result; } export function useUnipikaConvert(value: unknown) {