import { composeLen, type DiffFile } from "@git-diff-view/core";
import {
hunkLineNumberBGName,
plainLineNumberColorName,
hunkContentBGName,
hunkContentColorName,
diffAsideWidthName,
} from "@git-diff-view/utils";
import { useSyncHeight } from "../../hooks/useSyncHeight";
import { ExpandUp, ExpandDown, ExpandAll } from "../DiffExpand";
import { SplitSide, DiffModeEnum } from "../DiffView";
import { useDiffViewContext } from "../DiffViewContext";
const InternalDiffSplitHunkLineGitHub = ({
index,
diffFile,
side,
lineNumber,
}: {
index: number;
side: SplitSide;
diffFile: DiffFile;
lineNumber: number;
}) => {
const currentHunk = diffFile.getSplitHunkLine(index);
const expandEnabled = diffFile.getExpandEnabled();
useSyncHeight({
selector: `div[data-state="hunk"][data-line="${lineNumber}-hunk"]`,
side: SplitSide[SplitSide.old],
enable: side === SplitSide.new,
});
const enableHunkAction = side === SplitSide.old;
const couldExpand = expandEnabled && currentHunk && currentHunk.splitInfo;
const isExpandAll =
currentHunk &&
currentHunk.splitInfo &&
currentHunk.splitInfo.endHiddenIndex - currentHunk.splitInfo.startHiddenIndex < composeLen;
const isFirstLine = currentHunk && currentHunk.isFirst;
const isLastLine = currentHunk && currentHunk.isLast;
return (
{enableHunkAction ? (
<>
{couldExpand ? (
isFirstLine ? (
) : isLastLine ? (
) : isExpandAll ? (
) : (
<>
>
)
) : (
)}
{currentHunk.splitInfo?.plainText || currentHunk.text}
>
) : (
)}
);
};
const InternalDiffSplitHunkLineGitLab = ({
index,
diffFile,
side,
lineNumber,
}: {
index: number;
side: SplitSide;
diffFile: DiffFile;
lineNumber: number;
}) => {
const currentHunk = diffFile.getSplitHunkLine(index);
const expandEnabled = diffFile.getExpandEnabled();
useSyncHeight({
selector: `div[data-state="hunk"][data-line="${lineNumber}-hunk"]`,
side: SplitSide[SplitSide.old],
enable: side === SplitSide.new,
});
const couldExpand = expandEnabled && currentHunk && currentHunk.splitInfo;
const isExpandAll =
currentHunk &&
currentHunk.splitInfo &&
currentHunk.splitInfo.endHiddenIndex - currentHunk.splitInfo.startHiddenIndex < composeLen;
const isFirstLine = currentHunk && currentHunk.isFirst;
const isLastLine = currentHunk && currentHunk.isLast;
return (
{couldExpand ? (
isFirstLine ? (
) : isLastLine ? (
) : isExpandAll ? (
) : (
<>
>
)
) : (
)}
{currentHunk.splitInfo?.plainText || currentHunk.text}
);
};
const InternalDiffSplitHunkLine = ({
index,
diffFile,
side,
lineNumber,
}: {
index: number;
side: SplitSide;
diffFile: DiffFile;
lineNumber: number;
}) => {
const { useDiffContext } = useDiffViewContext();
const diffViewMode = useDiffContext.useShallowStableSelector((s) => s.mode);
if (
diffViewMode === DiffModeEnum.SplitGitHub ||
diffViewMode === DiffModeEnum.Split ||
diffViewMode === DiffModeEnum.Unified
) {
return ;
} else {
return ;
}
};
export const DiffSplitHunkLine = ({
index,
diffFile,
side,
lineNumber,
}: {
index: number;
side: SplitSide;
diffFile: DiffFile;
lineNumber: number;
}) => {
const currentHunk = diffFile.getSplitHunkLine(index);
const currentIsShow =
currentHunk &&
currentHunk.splitInfo &&
currentHunk.splitInfo.startHiddenIndex < currentHunk.splitInfo.endHiddenIndex;
const currentIsPureHunk = currentHunk && diffFile._getIsPureDiffRender() && !currentHunk.splitInfo;
if (!currentIsShow && !currentIsPureHunk) return null;
return ;
};