import React from 'react'; import Editor from '@monaco-editor/react'; import { useCallback, useRef, useState } from 'react'; import { Box, BoxProps } from '@chakra-ui/react'; import MyIcon from '../../Icon'; type Props = Omit & { height?: number; resize?: boolean; defaultValue?: string; value?: string; onChange?: (e: string) => void; }; const options = { lineNumbers: 'off', guides: { indentation: false }, automaticLayout: true, minimap: { enabled: false }, scrollbar: { verticalScrollbarSize: 4, horizontalScrollbarSize: 8, alwaysConsumeMouseWheel: false }, lineNumbersMinChars: 0, fontSize: 12, scrollBeyondLastLine: false, folding: false, overviewRulerBorder: false, tabSize: 2 }; const JSONEditor = ({ defaultValue, value, onChange, resize, ...props }: Props) => { const [height, setHeight] = useState(props.height || 100); const initialY = useRef(0); const handleMouseDown = useCallback((e: React.MouseEvent) => { initialY.current = e.clientY; const handleMouseMove = (e: MouseEvent) => { const deltaY = e.clientY - initialY.current; setHeight((prevHeight) => (prevHeight + deltaY < 100 ? 100 : prevHeight + deltaY)); initialY.current = e.clientY; }; const handleMouseUp = () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); }, []); return ( {resize && ( )} { monaco?.editor.defineTheme('JSONEditorTheme', { base: 'vs', inherit: true, rules: [], colors: { 'editor.background': '#ffffff00', 'editorLineNumber.foreground': '#aaa', 'editorOverviewRuler.border': '#ffffff00', 'editor.lineHighlightBackground': '#F7F8FA', 'scrollbarSlider.background': '#E8EAEC', 'editorIndentGuide.activeBackground': '#ddd', 'editorIndentGuide.background': '#eee' } }); }} defaultValue={defaultValue} value={value} onChange={(e) => onChange?.(e || '')} /> ); }; export default React.memo(JSONEditor);