Fixed version of @git-diff-view/react with split view renderExtendLine support
npm install @pivanov/git-diff-view-react> Note: This is a fixed fork of @git-diff-view/react with the following bug fixes:
> - ✅ Fixed renderExtendLine not being called in split view mode
> - ✅ Fixed extend lines (comments) not rendering on lines that only exist on one side
> - ✅ Fixed extend lines being hidden when lines are collapsed
>
> Original package: @git-diff-view/react
#### There are two ways to use this component:
1. Use the DiffView component directly.
``tsx
import { DiffView, DiffModeEnum } from "@pivanov/git-diff-view-react";
import "@pivanov/git-diff-view-react/styles/diff-view.css";
// use data
data={{
oldFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null };
newFile?: { fileName?: string | null; fileLang?: string | null; content?: string | null };
hunks: string[];
}}
extendData={{oldFile: {10: {data: 'foo'}}, newFile: {20: {data: 'bar'}}}}
renderExtendLine={({ data }) => ReactNode}
diffViewFontSize={number}
diffViewHighlight={boolean}
diffViewMode={DiffModeEnum.Split | DiffModeEnum.Unified}
diffViewWrap={boolean}
diffViewTheme={'light' | 'dark'}
diffViewAddWidget
onAddWidgetClick={({ side, lineNumber }) => void}
renderWidgetLine={({ onClose, side, lineNumber }) => ReactNode}
/>
`
2. Use the DiffView component with @git-diff-view/core or @git-diff-view/file
`tsx
// with @git-diff-view/file
import { DiffFile, generateDiffFile } from "@git-diff-view/file";
const file = generateDiffFile(
data?.oldFile?.fileName || "",
data?.oldFile?.content || "",
data?.newFile?.fileName || "",
data?.newFile?.content || "",
data?.oldFile?.fileLang || "",
data?.newFile?.fileLang || ""
);
file.initTheme('light' / 'dark');
file.init();
file.buildSplitDiffLines();
file.buildUnifiedDiffLines();
// with @git-diff-view/core
import { DiffFile } from "@git-diff-view/core";
const file = new DiffFile(
data?.oldFile?.fileName || "",
data?.oldFile?.content || "",
data?.newFile?.fileName || "",
data?.newFile?.content || "",
data?.hunks || [],
data?.oldFile?.fileLang || "",
data?.newFile?.fileLang || ""
);
file.initTheme('light' / 'dark');
file.init();
file.buildSplitDiffLines();
file.buildUnifiedDiffLines();
// use current data to render
// or use the bundle data to render, eg: postMessage/httpRequest
const bundle = file.getBundle();
const diffFile = DiffFile.createInstance(data || {}, bundle);
`$3
#### react-example
#### react-ssr-example
#### react-rsc-example
!Screenshot
!Screenshot
!Screenshot
| Props | Description |
| :--------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| data | The diff data need to show, type: { oldFile: {fileName?: string, content?: string}, newFile: {fileName?: string, content?: string}, hunks: string[] }, you can only pass hunks data, and the component will generate the oldFile and newFile data automatically |react
| diffFile | the target data to render |
| renderWidgetLine | return a valid element to show the widget, this element will render when you click the addWidget button in the diff view |react
| renderExtendLine | return a valid element to show the extend data |Diff View
| extendData | a list to store the extend data to show in the , type: {oldFile: {lineNumber: {data: any}}, newFile: {lineNumber: {data: any}}} |DiffModeEnum.Split
| diffViewFontSize | the fontSize for the DiffView component, type: number |
| diffViewHighlight | enable syntax highlight, type: boolean |
| diffViewMode | the mode for the DiffView component, type: / DiffModeEnum.Unified |light
| diffViewWrap | enable code line auto wrap, type: boolean |
| diffViewTheme | the theme for the DiffView component, type: / dark |addWidget
| diffViewAddWidget| enable button, type: boolean |addWidget
| onAddWidgetClick | when the button clicked, type: ({ side: "old" / "new", lineNumber: number }) => void` |