import { Box, Flex, IconButton, Tooltip } from '@chakra-ui/react'; import { isString } from 'lodash-es'; import { OverlayScrollbarsComponent } from 'overlayscrollbars-react'; import { memo, useCallback, useMemo } from 'react'; import { FaCopy, FaDownload } from 'react-icons/fa'; type Props = { label: string; data: object | string; fileName?: string; withDownload?: boolean; withCopy?: boolean; }; const DataViewer = (props: Props) => { const { label, data, fileName, withDownload = true, withCopy = true } = props; const dataString = useMemo( () => (isString(data) ? data : JSON.stringify(data, null, 2)), [data] ); const handleCopy = useCallback(() => { navigator.clipboard.writeText(dataString); }, [dataString]); const handleDownload = useCallback(() => { const blob = new Blob([dataString]); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = `${fileName || label}.json`; document.body.appendChild(a); a.click(); a.remove(); }, [dataString, label, fileName]); return (
{dataString}
{withDownload && ( } variant="ghost" opacity={0.7} onClick={handleDownload} /> )} {withCopy && ( } variant="ghost" opacity={0.7} onClick={handleCopy} /> )}
); }; export default memo(DataViewer);