forked from line/centraldogma
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonDiffEditor.tsx
More file actions
71 lines (66 loc) · 2.16 KB
/
Copy pathJsonDiffEditor.tsx
File metadata and controls
71 lines (66 loc) · 2.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Copyright 2026 LY Corporation
*
* LY Corporation licenses this file to you under the Apache License,
* version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at:
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*/
import { DiffEditor, loader } from '@monaco-editor/react';
import { useColorMode } from '@chakra-ui/react';
import { useEffect, useState } from 'react';
import { Loading } from 'dogma/common/components/Loading';
interface JsonDiffEditorProps {
// The left-hand (baseline) document, e.g. the content before a change.
original: string;
// The right-hand (compared) document, e.g. the content after a change.
modified: string;
height?: string | number;
}
// Wraps the Monaco diff editor and configures it to use the locally bundled `monaco-editor` package (provided
// by MonacoWebpackPlugin) instead of a CDN, mirroring {@link JsonEditor}.
export const JsonDiffEditor = ({ original, modified, height = '60vh' }: JsonDiffEditorProps) => {
const { colorMode } = useColorMode();
const [ready, setReady] = useState(false);
useEffect(() => {
let active = true;
(async () => {
const monaco = await import('monaco-editor');
loader.config({ monaco });
await loader.init();
if (active) {
setReady(true);
}
})();
return () => {
active = false;
};
}, []);
if (!ready) {
return <Loading />;
}
return (
<DiffEditor
height={height}
language="json"
theme={colorMode === 'light' ? 'vs' : 'vs-dark'}
original={original}
modified={modified}
options={{
readOnly: true,
renderSideBySide: true,
minimap: { enabled: false },
automaticLayout: true,
scrollBeyondLastLine: false,
lineNumbersMinChars: 4,
}}
/>
);
};