import React from 'react'; import {ChevronsCollapseVertical, ChevronsExpandVertical} from '@gravity-ui/icons'; import type {ReactUnipikaProps} from '@gravity-ui/react-unipika/container-scroll'; import {ReactUnipika} from '@gravity-ui/react-unipika/container-scroll'; import {ActionTooltip, Button, Flex, Icon} from '@gravity-ui/uikit'; import {SETTING_KEYS} from '../../store/reducers/settings/constants'; import {useSetting} from '../../utils/hooks'; import type {ClipboardButtonProps} from '../ClipboardButton/ClipboardButton'; import {ClipboardButton} from '../ClipboardButton/ClipboardButton'; import {Filter} from './components/Filter'; import {block} from './constants'; import i18n from './i18n'; import './JsonViewer.scss'; const defaultUnipikaSettings = { asHTML: true, format: 'json', compact: false, escapeWhitespace: true, showDecoded: true, binaryAsHex: false, indent: 2, decodeUTF8: false, }; type RenderToolbarProps = NonNullable< Parameters>[0] >; interface JsonViewerProps { search?: boolean; collapsedInitially?: boolean; maxValueWidth?: number; toolbarClassName?: string; withClipboardButton?: Omit; value: ReactUnipikaProps['value']; scrollContainerRef: React.RefObject; } export function JsonViewer({ value, search = true, toolbarClassName, withClipboardButton, collapsedInitially, scrollContainerRef, }: JsonViewerProps) { const [caseSensitiveSearch, setCaseSensitiveSearch] = useSetting( SETTING_KEYS.CASE_SENSITIVE_JSON_SEARCH, false, ); const renderToolbar: ReactUnipikaProps['renderToolbar'] = React.useCallback( ({ filter, matchIndex, matchedRows, allMatchPaths, onExpandAll, onCollapseAll, onFilterChange, onNextMatch, onPrevMatch, onEnterKeyDown, }: RenderToolbarProps) => { const handleUpdateCaseSensitive = () => { setCaseSensitiveSearch(!caseSensitiveSearch); }; return ( {search && ( )} {withClipboardButton && ( )} ); }, [ caseSensitiveSearch, search, toolbarClassName, withClipboardButton, setCaseSensitiveSearch, ], ); const renderError = React.useCallback((error: unknown) => { if (error instanceof Error) { return
{error.message}
; } return i18n('description_unknown-error'); }, []); return (
); }