import { DiffLineType, type DiffFile, checkDiffLineIncludeChange } from "@git-diff-view/core"; import { getContentBG, getLineNumberBG, plainLineNumberColorName, emptyBGName, borderColorName, diffAsideWidthName, expandLineNumberColorName, } from "@git-diff-view/utils"; import { DiffSplitAddWidget } from "../DiffAddWidget"; import { DiffContent } from "../DiffContent"; import { SplitSide } from "../DiffView"; import { useDiffViewContext } from "../DiffViewContext"; import { useDiffWidgetContext } from "../DiffWidgetContext"; const InternalDiffSplitLine = ({ index, diffFile, lineNumber, }: { index: number; diffFile: DiffFile; lineNumber: number; }) => { const oldLine = diffFile.getSplitLeftLine(index); const newLine = diffFile.getSplitRightLine(index); const oldSyntaxLine = diffFile.getOldSyntaxLine(oldLine?.lineNumber ?? -1); const newSyntaxLine = diffFile.getNewSyntaxLine(newLine?.lineNumber ?? -1); const oldPlainLine = diffFile.getOldPlainLine(oldLine.lineNumber ?? -1); const newPlainLine = diffFile.getNewPlainLine(newLine.lineNumber ?? -1); const hasDiff = !!oldLine?.diff || !!newLine?.diff; const hasChange = checkDiffLineIncludeChange(oldLine?.diff) || checkDiffLineIncludeChange(newLine?.diff); const oldLineIsDelete = oldLine?.diff?.type === DiffLineType.Delete; const newLineIsAdded = newLine?.diff?.type === DiffLineType.Add; const { useDiffContext } = useDiffViewContext(); const { enableHighlight, enableAddWidget, onAddWidgetClick } = useDiffContext.useShallowStableSelector((s) => ({ enableHighlight: s.enableHighlight, enableAddWidget: s.enableAddWidget, onAddWidgetClick: s.onAddWidgetClick, })); const { useWidget } = useDiffWidgetContext(); const setWidget = useWidget.getReadonlyState().setWidget; const hasOldLine = !!oldLine.lineNumber; const hasNewLine = !!newLine.lineNumber; const oldLineContentBG = getContentBG(false, oldLineIsDelete, hasDiff); const oldLineNumberBG = getLineNumberBG(false, oldLineIsDelete, hasDiff); const newLineContentBG = getContentBG(newLineIsAdded, false, hasDiff); const newLineNumberBG = getLineNumberBG(newLineIsAdded, false, hasDiff); return (
{hasOldLine ? ( <>
{hasDiff && enableAddWidget && ( onAddWidgetClick.current?.(...props)} className="absolute left-[100%] z-[1] translate-x-[-50%]" onOpenAddWidget={(lineNumber, side) => setWidget({ lineNumber: lineNumber, side: side })} /> )} {oldLine.lineNumber}
{hasDiff && enableAddWidget && ( onAddWidgetClick.current?.(...props)} className="absolute right-[100%] top-0 z-[1] translate-x-[50%]" onOpenAddWidget={(lineNumber, side) => setWidget({ lineNumber: lineNumber, side: side })} /> )}
) : ( <>
)}
{hasNewLine ? ( <>
{hasDiff && enableAddWidget && ( onAddWidgetClick.current?.(...props)} className="absolute left-[100%] z-[1] translate-x-[-50%]" onOpenAddWidget={(lineNumber, side) => setWidget({ lineNumber: lineNumber, side: side })} /> )} {newLine.lineNumber}
{hasDiff && enableAddWidget && ( onAddWidgetClick.current?.(...props)} className="absolute right-[100%] top-0 z-[1] translate-x-[50%]" onOpenAddWidget={(lineNumber, side) => setWidget({ lineNumber: lineNumber, side: side })} /> )}
) : ( <>
)}
); }; export const DiffSplitContentLine = ({ index, diffFile, lineNumber, }: { index: number; diffFile: DiffFile; lineNumber: number; }) => { const oldLine = diffFile.getSplitLeftLine(index); const newLine = diffFile.getSplitRightLine(index); if (oldLine?.isHidden && newLine?.isHidden) return null; return ; };