import { DiffLineType, type DiffFile, checkDiffLineIncludeChange } from "@git-diff-view/core"; import { getContentBG, getLineNumberBG, plainLineNumberColorName, emptyBGName, borderColorName, expandLineNumberColorName, } from "@git-diff-view/utils"; import { SplitSide } from ".."; import { DiffSplitAddWidget } from "./DiffAddWidget"; import { DiffContent } from "./DiffContent"; import { useDiffViewContext } from "./DiffViewContext"; import { useDiffWidgetContext } from "./DiffWidgetContext"; const InternalDiffSplitLine = ({ index, diffFile, lineNumber, enableAddWidget, enableHighlight, }: { index: number; diffFile: DiffFile; lineNumber: number; enableHighlight: boolean; enableAddWidget: boolean; }) => { const oldLine = diffFile.getSplitLeftLine(index); const newLine = diffFile.getSplitRightLine(index); const oldSyntaxLine = diffFile.getOldSyntaxLine(oldLine?.lineNumber ?? -1); const oldPlainLine = diffFile.getOldPlainLine(oldLine.lineNumber ?? -1); const newSyntaxLine = diffFile.getNewSyntaxLine(newLine?.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 onAddWidgetClick = useDiffContext.getReadonlyState().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%] 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%] z-[1] translate-x-[50%]" onOpenAddWidget={(lineNumber, side) => setWidget({ lineNumber: lineNumber, side: side })} /> )} ) : ( )} ); }; export const DiffSplitContentLine = ({ index, diffFile, lineNumber, enableAddWidget, enableHighlight, }: { index: number; diffFile: DiffFile; lineNumber: number; enableHighlight: boolean; enableAddWidget: boolean; }) => { const oldLine = diffFile.getSplitLeftLine(index); const newLine = diffFile.getSplitRightLine(index); if (oldLine?.isHidden && newLine?.isHidden) return null; return ( ); };