Skip to content

Commit 2062d7d

Browse files
update
1 parent 1442ed5 commit 2062d7d

8 files changed

Lines changed: 128 additions & 20 deletions

File tree

packages/core/src/diff-file.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -710,10 +710,10 @@ export class DiffFile {
710710
}
711711

712712
initId() {
713-
let id = "diff--" + Math.random().toString().slice(2);
713+
let id = "-diff--" + Math.random().toString().slice(2);
714714

715715
while (idSet.has(id)) {
716-
id = "diff--" + Math.random().toString().slice(2);
716+
id = "-diff--" + Math.random().toString().slice(2);
717717
}
718718

719719
idSet.add(id);

packages/core/src/file.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ export class File {
107107
}
108108

109109
initId() {
110-
let id = "file--" + Math.random().toString().slice(2);
110+
let id = "-file--" + Math.random().toString().slice(2);
111111

112112
while (idSet.has(id)) {
113-
id = "file--" + Math.random().toString().slice(2);
113+
id = "-file--" + Math.random().toString().slice(2);
114114
}
115115

116116
idSet.add(id);

packages/react/src/components/DiffViewWithMultiSelect.tsx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useImperativeHandle, useState,
22

33
import { multiSelectClassNames, createDiffMultiSelectManager } from "..";
44
import { useCallbackRef } from "../hooks/useCallbackRef";
5+
import { useUpdateEffect } from "../hooks/useUpdateEffect";
56

67
import { DiffModeEnum, DiffView, SplitSide } from "./DiffView";
78

@@ -124,6 +125,10 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(
124125

125126
const isUnifiedMode = !(diffViewMode & DiffModeEnum.Split);
126127

128+
useUpdateEffect(() => {
129+
setMultiResult(undefined);
130+
}, [props.diffViewWrap, diffViewMode]);
131+
127132
const getDiffFile = useCallback(() => {
128133
return diffViewRef.current?.getDiffFileInstance() ?? null;
129134
}, []);
@@ -289,6 +294,8 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(
289294
if (multiResult) {
290295
const currentSide = SplitSide[side] as unknown as "new" | "old";
291296
const currentMultiResult = multiResult[currentSide] as number[];
297+
const otherSide = currentSide === "new" ? "old" : "new";
298+
const otherMultiResult = multiResult[otherSide] as number[];
292299
if (currentMultiResult?.length) {
293300
const max = Math.max(...currentMultiResult);
294301
if (max === lineNum) {
@@ -298,6 +305,19 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(
298305
return;
299306
}
300307
}
308+
if (isUnifiedMode && otherMultiResult?.length) {
309+
const max = Math.max(...otherMultiResult);
310+
if (max === lineNum) {
311+
const finalResult = { [otherSide]: otherMultiResult };
312+
setMultiResult(finalResult as typeof multiResult);
313+
onAddWidgetClick?.({
314+
lineNumber: max,
315+
fromLineNumber: Math.min(...otherMultiResult),
316+
side: otherSide === "old" ? SplitSide.old : SplitSide.new,
317+
});
318+
return;
319+
}
320+
}
301321
setMultiResult({ old: [], new: [] });
302322
onAddWidgetClick?.({ lineNumber: lineNum, fromLineNumber: lineNum, side });
303323
} else {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useEffect, useRef } from "react";
2+
3+
import type { DependencyList, EffectCallback } from "react";
4+
5+
export const useUpdateEffect = (effect: EffectCallback, deps: DependencyList) => {
6+
const isMounted = useRef(false);
7+
8+
useEffect(() => {
9+
if (isMounted.current) {
10+
return effect();
11+
}
12+
isMounted.current = true;
13+
// eslint-disable-next-line react-hooks/exhaustive-deps
14+
}, deps);
15+
};

packages/solid/src/components/DiffViewWithMultiSelect.tsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
22
import { SplitSide, createDiffMultiSelectManager, multiSelectClassNames } from "@git-diff-view/core";
33
import { DiffModeEnum } from "@git-diff-view/utils";
4-
import { type JSXElement, type JSX, createSignal, createEffect, createMemo, onCleanup } from "solid-js";
4+
import { type JSXElement, type JSX, createSignal, createEffect, createMemo, onCleanup, on } from "solid-js";
55

66
import { DiffView } from "./DiffView";
77

@@ -123,6 +123,16 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(props: DiffViewWithM
123123
const enableMultiSelect = () => props.enableMultiSelect ?? true;
124124
const isUnifiedMode = () => !((props.diffViewMode ?? DiffModeEnum.SplitGitHub) & DiffModeEnum.Split);
125125

126+
createEffect(
127+
on(
128+
() => [props.diffViewWrap, props.diffViewMode],
129+
() => {
130+
setMultiResult(undefined);
131+
},
132+
{ defer: true }
133+
)
134+
);
135+
126136
createEffect(() => {
127137
const container = containerRef();
128138
const diffFile = innerDiffFile();
@@ -218,7 +228,9 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(props: DiffViewWithM
218228
const currentMultiResult = multiResult();
219229
if (currentMultiResult) {
220230
const currentSide = SplitSide[side] as unknown as "new" | "old";
231+
const otherSide = currentSide === "new" ? "old" : "new";
221232
const sideResult = currentMultiResult[currentSide] as number[];
233+
const otherSideResult = currentMultiResult[otherSide] as number[];
222234
if (sideResult?.length) {
223235
const max = Math.max(...sideResult);
224236
if (max === lineNum) {
@@ -232,6 +244,19 @@ const InternalDiffViewWithMultiSelect = <T extends unknown>(props: DiffViewWithM
232244
return;
233245
}
234246
}
247+
if (isUnifiedMode() && otherSideResult?.length) {
248+
const max = Math.max(...otherSideResult);
249+
if (max === lineNum) {
250+
const finalResult = { [otherSide]: otherSideResult };
251+
setMultiResult(finalResult as ReturnType<typeof extendDataToPreselectedLines>);
252+
props.onAddWidgetClick?.({
253+
lineNumber: max,
254+
fromLineNumber: Math.min(...otherSideResult),
255+
side: otherSide === "old" ? SplitSide.old : SplitSide.new,
256+
});
257+
return;
258+
}
259+
}
235260
setMultiResult({ old: [], new: [] });
236261
props.onAddWidgetClick?.({ lineNumber: lineNum, fromLineNumber: lineNum, side });
237262
} else {

packages/svelte/src/lib/components/DiffViewWithMultiSelect.svelte

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,17 @@
202202
}
203203
};
204204
205+
let isWrapModeInitial = true;
206+
$effect(() => {
207+
props.diffViewWrap;
208+
props.diffViewMode;
209+
if (isWrapModeInitial) {
210+
isWrapModeInitial = false;
211+
return;
212+
}
213+
multiResult = undefined;
214+
});
215+
205216
$effect(initManager);
206217
207218
$effect(() => {
@@ -219,6 +230,8 @@
219230
if (multiResult) {
220231
const currentSide = SplitSide[side] as unknown as 'new' | 'old';
221232
const currentMultiResult = multiResult[currentSide] as number[];
233+
const otherSide = currentSide === "new" ? "old" : "new";
234+
const otherMultiResult = multiResult[otherSide] as number[];
222235
if (currentMultiResult?.length) {
223236
const max = Math.max(...currentMultiResult);
224237
if (max === lineNum) {
@@ -232,6 +245,19 @@
232245
return;
233246
}
234247
}
248+
if (isUnifiedMode && otherMultiResult?.length) {
249+
const max = Math.max(...otherMultiResult);
250+
if (max === lineNum) {
251+
const finalResult = { [otherSide]: otherMultiResult };
252+
multiResult = finalResult as typeof multiResult;
253+
props.onAddWidgetClick?.({
254+
lineNumber: max,
255+
fromLineNumber: Math.min(...otherMultiResult),
256+
side: otherSide === "old" ? SplitSide.old : SplitSide.new
257+
});
258+
return;
259+
}
260+
}
235261
multiResult = { old: [], new: [] };
236262
props.onAddWidgetClick?.({ lineNumber: lineNum, fromLineNumber: lineNum, side });
237263
} else {

packages/vue/src/components/DiffViewWithMultiSelect.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,13 @@ export const DiffViewWithMultiSelect = defineComponent<
150150
});
151151
};
152152

153+
watch(
154+
() => [props.diffViewWrap, props.diffViewMode],
155+
() => {
156+
multiResult.value = undefined;
157+
}
158+
);
159+
153160
watchEffect((onClean) => initManager(onClean));
154161

155162
watch(
@@ -192,6 +199,8 @@ export const DiffViewWithMultiSelect = defineComponent<
192199
if (multiResult.value) {
193200
const currentSide = SplitSide[side] as unknown as "new" | "old";
194201
const currentMultiResult = multiResult.value[currentSide] as number[];
202+
const otherSide = currentSide === "new" ? "old" : "new";
203+
const otherMultiResult = multiResult.value[otherSide] as number[];
195204
if (currentMultiResult?.length) {
196205
const max = Math.max(...currentMultiResult);
197206
if (max === lineNum) {
@@ -205,6 +214,19 @@ export const DiffViewWithMultiSelect = defineComponent<
205214
return;
206215
}
207216
}
217+
if (isUnifiedMode.value && otherMultiResult?.length) {
218+
const max = Math.max(...otherMultiResult);
219+
if (max === lineNum) {
220+
const finalResult = { [otherSide]: otherMultiResult };
221+
multiResult.value = finalResult as typeof multiResult.value;
222+
options.emit("onAddWidgetClick", {
223+
lineNumber: max,
224+
fromLineNumber: Math.min(...otherMultiResult),
225+
side: otherSide === "old" ? SplitSide.old : SplitSide.new,
226+
});
227+
return;
228+
}
229+
}
208230
multiResult.value = { old: [], new: [] };
209231
options.emit("onAddWidgetClick", { lineNumber: lineNum, fromLineNumber: lineNum, side });
210232
} else {

pnpm-lock.yaml

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)