mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-02-16 15:47:47 +01:00
65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import { yaml } from '@codemirror/lang-yaml';
|
|
import { syntaxHighlighting } from '@codemirror/language';
|
|
import { MergeView } from '@codemirror/merge';
|
|
import { EditorView } from '@codemirror/view';
|
|
import classNames from 'classnames';
|
|
import { useEffect, useRef } from 'react';
|
|
import './DiffViewer.css';
|
|
import { readonlyExtensions, syntaxHighlightStyle } from './extensions';
|
|
|
|
interface Props {
|
|
/** Original/previous version (left side) */
|
|
original: string;
|
|
/** Modified/current version (right side) */
|
|
modified: string;
|
|
className?: string;
|
|
}
|
|
|
|
export function DiffViewer({ original, modified, className }: Props) {
|
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
const viewRef = useRef<MergeView | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (!containerRef.current) return;
|
|
|
|
// Clean up previous instance
|
|
viewRef.current?.destroy();
|
|
|
|
const sharedExtensions = [
|
|
yaml(),
|
|
syntaxHighlighting(syntaxHighlightStyle),
|
|
...readonlyExtensions,
|
|
EditorView.lineWrapping,
|
|
];
|
|
|
|
viewRef.current = new MergeView({
|
|
a: {
|
|
doc: original,
|
|
extensions: sharedExtensions,
|
|
},
|
|
b: {
|
|
doc: modified,
|
|
extensions: sharedExtensions,
|
|
},
|
|
parent: containerRef.current,
|
|
collapseUnchanged: { margin: 2, minSize: 3 },
|
|
highlightChanges: false,
|
|
gutter: true,
|
|
orientation: 'a-b',
|
|
revertControls: undefined,
|
|
});
|
|
|
|
return () => {
|
|
viewRef.current?.destroy();
|
|
viewRef.current = null;
|
|
};
|
|
}, [original, modified]);
|
|
|
|
return (
|
|
<div
|
|
ref={containerRef}
|
|
className={classNames('cm-wrapper cm-multiline h-full w-full', className)}
|
|
/>
|
|
);
|
|
}
|