MergeViewer.tsx 948 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import { MergeView } from '@codemirror/merge';
  2. import { EditorState, type Extension } from '@codemirror/state';
  3. import { basicSetup, EditorView } from 'codemirror';
  4. import { memo, useEffect, useRef } from 'react';
  5. type Props = {
  6. leftBody: string;
  7. rightBody: string;
  8. };
  9. const MergeViewerExtensions: Extension = [
  10. basicSetup,
  11. EditorView.editable.of(false),
  12. EditorState.readOnly.of(true),
  13. ];
  14. export const MergeViewer = memo(({ leftBody, rightBody }: Props) => {
  15. const mergeViewRef = useRef<HTMLDivElement>(null);
  16. useEffect(() => {
  17. if (mergeViewRef.current != null) {
  18. const view = new MergeView({
  19. a: {
  20. doc: leftBody,
  21. extensions: MergeViewerExtensions,
  22. },
  23. b: {
  24. doc: rightBody,
  25. extensions: MergeViewerExtensions,
  26. },
  27. parent: mergeViewRef.current,
  28. });
  29. return () => view.destroy();
  30. }
  31. });
  32. return <div ref={mergeViewRef} />;
  33. });