Skip to content

Commit 19f99af

Browse files
update
1 parent 935c74d commit 19f99af

File tree

9 files changed

+215
-11
lines changed

9 files changed

+215
-11
lines changed

packages/core/src/parse/transform.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ let transformFile = temp;
88

99
/**
1010
* ⚠️ **WARNING: DANGEROUS OPERATION** ⚠️
11-
*
11+
*
1212
* This function modifies global state and may cause unexpected side effects.
1313
* You may also need escapeHTML for the content.
14-
*
14+
*
1515
* @param fn - The transformation function to help transform template content
1616
* @throws {Error} Throws an error if the provided parameter is not a function
1717
*

packages/react/index.d.ts

Lines changed: 147 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Generated by dts-bundle-generator v9.5.1
22

3-
import { CSSProperties, ForwardedRef, ReactNode } from 'react';
3+
import { CSSProperties, ForwardedRef, ReactNode, RefObject } from 'react';
44

55
declare class Cache$1<K, V> extends Map<K, V> {
66
name: string;
@@ -787,6 +787,151 @@ export type SyntaxNode = {
787787
};
788788
children?: SyntaxNode[];
789789
};
790+
declare const createDiffConfigStore: (props: DiffViewProps<any> & {
791+
isMounted: boolean;
792+
}, diffFileId: string) => import("reactivity-store").UseSelectorWithStore<{
793+
id: import("reactivity-store").Ref<string, string>;
794+
setId: (_id: string) => string;
795+
mode: import("reactivity-store").Ref<DiffModeEnum, DiffModeEnum>;
796+
setMode: (_mode: DiffModeEnum) => DiffModeEnum;
797+
mounted: import("reactivity-store").Ref<boolean, boolean>;
798+
setMounted: (_mounted: boolean) => boolean;
799+
enableWrap: import("reactivity-store").Ref<boolean, boolean>;
800+
setEnableWrap: (_enableWrap: boolean) => boolean;
801+
enableAddWidget: import("reactivity-store").Ref<boolean, boolean>;
802+
setEnableAddWidget: (_enableAddWidget: boolean) => boolean;
803+
enableHighlight: import("reactivity-store").Ref<boolean, boolean>;
804+
setEnableHighlight: (_enableHighlight: boolean) => boolean;
805+
fontSize: import("reactivity-store").Ref<number, number>;
806+
setFontSize: (_fontSize: number) => number;
807+
extendData: import("reactivity-store").Ref<{
808+
oldFile: {
809+
[x: string]: {
810+
data: any;
811+
};
812+
};
813+
newFile: {
814+
[x: string]: {
815+
data: any;
816+
};
817+
};
818+
}, {
819+
oldFile: {
820+
[x: string]: {
821+
data: any;
822+
};
823+
};
824+
newFile: {
825+
[x: string]: {
826+
data: any;
827+
};
828+
};
829+
} | {
830+
oldFile: {
831+
[x: string]: {
832+
data: any;
833+
};
834+
};
835+
newFile: {
836+
[x: string]: {
837+
data: any;
838+
};
839+
};
840+
}>;
841+
setExtendData: (_extendData: DiffViewProps<any>["extendData"]) => void;
842+
renderWidgetLine: import("reactivity-store").Ref<({ diffFile, side, lineNumber, onClose, }: {
843+
lineNumber: number;
844+
side: SplitSide;
845+
diffFile: DiffFile;
846+
onClose: () => void;
847+
}) => import("react").ReactNode, ({ diffFile, side, lineNumber, onClose, }: {
848+
lineNumber: number;
849+
side: SplitSide;
850+
diffFile: DiffFile;
851+
onClose: () => void;
852+
}) => import("react").ReactNode>;
853+
setRenderWidgetLine: (_renderWidgetLine: ({ diffFile, side, lineNumber, onClose, }: {
854+
lineNumber: number;
855+
side: SplitSide;
856+
diffFile: DiffFile;
857+
onClose: () => void;
858+
}) => import("react").ReactNode) => ({ diffFile, side, lineNumber, onClose, }: {
859+
lineNumber: number;
860+
side: SplitSide;
861+
diffFile: DiffFile;
862+
onClose: () => void;
863+
}) => import("react").ReactNode;
864+
renderExtendLine: import("reactivity-store").Ref<({ diffFile, side, data, lineNumber, onUpdate, }: {
865+
lineNumber: number;
866+
side: SplitSide;
867+
data: any;
868+
diffFile: DiffFile;
869+
onUpdate: () => void;
870+
}) => import("react").ReactNode, ({ diffFile, side, data, lineNumber, onUpdate, }: {
871+
lineNumber: number;
872+
side: SplitSide;
873+
data: any;
874+
diffFile: DiffFile;
875+
onUpdate: () => void;
876+
}) => import("react").ReactNode>;
877+
setRenderExtendLine: (_renderExtendLine: ({ diffFile, side, data, lineNumber, onUpdate, }: {
878+
lineNumber: number;
879+
side: SplitSide;
880+
data: any;
881+
diffFile: DiffFile;
882+
onUpdate: () => void;
883+
}) => import("react").ReactNode) => ({ diffFile, side, data, lineNumber, onUpdate, }: {
884+
lineNumber: number;
885+
side: SplitSide;
886+
data: any;
887+
diffFile: DiffFile;
888+
onUpdate: () => void;
889+
}) => import("react").ReactNode;
890+
onAddWidgetClick: {
891+
current: (lineNumber: number, side: SplitSide) => void;
892+
};
893+
setOnAddWidgetClick: (_onAddWidgetClick: {
894+
current: (lineNumber: number, side: SplitSide) => void;
895+
}) => (lineNumber: number, side: SplitSide) => void;
896+
onCreateUseWidgetHook: import("reactivity-store").Ref<(hook: import("reactivity-store").UseSelectorWithStore<{
897+
widgetSide: import("reactivity-store").Ref<SplitSide, SplitSide>;
898+
widgetLineNumber: import("reactivity-store").Ref<number, number>;
899+
setWidget: ({ side, lineNumber }: {
900+
side?: SplitSide;
901+
lineNumber?: number;
902+
}) => void;
903+
}>) => void, (hook: import("reactivity-store").UseSelectorWithStore<{
904+
widgetSide: import("reactivity-store").Ref<SplitSide, SplitSide>;
905+
widgetLineNumber: import("reactivity-store").Ref<number, number>;
906+
setWidget: ({ side, lineNumber }: {
907+
side?: SplitSide;
908+
lineNumber?: number;
909+
}) => void;
910+
}>) => void>;
911+
setOnCreateUseWidgetHook: (_onCreateUseWidgetHook: (hook: import("reactivity-store").UseSelectorWithStore<{
912+
widgetSide: import("reactivity-store").Ref<SplitSide, SplitSide>;
913+
widgetLineNumber: import("reactivity-store").Ref<number, number>;
914+
setWidget: ({ side, lineNumber }: {
915+
side?: SplitSide;
916+
lineNumber?: number;
917+
}) => void;
918+
}>) => void) => (hook: import("reactivity-store").UseSelectorWithStore<{
919+
widgetSide: import("reactivity-store").Ref<SplitSide, SplitSide>;
920+
widgetLineNumber: import("reactivity-store").Ref<number, number>;
921+
setWidget: ({ side, lineNumber }: {
922+
side?: SplitSide;
923+
lineNumber?: number;
924+
}) => void;
925+
}>) => void;
926+
}>;
927+
declare const createDiffWidgetStore: (useDiffContextRef: RefObject<ReturnType<typeof createDiffConfigStore>>) => import("reactivity-store").UseSelectorWithStore<{
928+
widgetSide: import("reactivity-store").Ref<SplitSide, SplitSide>;
929+
widgetLineNumber: import("reactivity-store").Ref<number, number>;
930+
setWidget: ({ side, lineNumber }: {
931+
side?: SplitSide;
932+
lineNumber?: number;
933+
}) => void;
934+
}>;
790935
export declare enum DiffModeEnum {
791936
SplitGitHub = 1,
792937
SplitGitLab = 2,
@@ -843,6 +988,7 @@ export type DiffViewProps<T> = {
843988
onUpdate: () => void;
844989
}) => ReactNode;
845990
onAddWidgetClick?: (lineNumber: number, side: SplitSide) => void;
991+
onCreateUseWidgetHook?: (hook: ReturnType<typeof createDiffWidgetStore>) => void;
846992
};
847993
export type DiffViewProps_1<T> = Omit<DiffViewProps<T>, "data"> & {
848994
data?: {

packages/react/src/components/DiffSplitView.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ export const DiffSplitView = memo(({ diffFile }: { diffFile: DiffFile }) => {
1616

1717
useDiffContextRef.current = useDiffContext;
1818

19-
const enableWrap = useDiffContext.useShallowStableSelector((s) => s.enableWrap);
19+
const { enableWrap, onCreateUseWidgetHook } = useDiffContext.useShallowStableSelector((s) => ({
20+
enableWrap: s.enableWrap,
21+
onCreateUseWidgetHook: s.onCreateUseWidgetHook,
22+
}));
2023

2124
// performance optimization
2225
const useWidget = useMemo(() => createDiffWidgetStore(useDiffContextRef), []);
@@ -29,6 +32,10 @@ export const DiffSplitView = memo(({ diffFile }: { diffFile: DiffFile }) => {
2932
setWidget({});
3033
}, [diffFile, useWidget]);
3134

35+
useEffect(() => {
36+
onCreateUseWidgetHook?.(useWidget);
37+
}, [useWidget, onCreateUseWidgetHook]);
38+
3239
return (
3340
<DiffWidgetContext.Provider value={contextValue}>
3441
{enableWrap ? <DiffSplitViewWrap diffFile={diffFile} /> : <DiffSplitViewNormal diffFile={diffFile} />}

packages/react/src/components/DiffUnifiedView.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ export const DiffUnifiedView = memo(({ diffFile }: { diffFile: DiffFile }) => {
3232

3333
const contextValue = useMemo(() => ({ useWidget }), [useWidget]);
3434

35-
const { fontSize, enableWrap, enableHighlight, enableAddWidget } = useDiffContext.useShallowStableSelector((s) => ({
36-
fontSize: s.fontSize,
37-
enableWrap: s.enableWrap,
38-
enableHighlight: s.enableHighlight,
39-
enableAddWidget: s.enableAddWidget,
40-
}));
35+
const { fontSize, enableWrap, enableHighlight, enableAddWidget, onCreateUseWidgetHook } =
36+
useDiffContext.useShallowStableSelector((s) => ({
37+
fontSize: s.fontSize,
38+
enableWrap: s.enableWrap,
39+
enableHighlight: s.enableHighlight,
40+
enableAddWidget: s.enableAddWidget,
41+
onCreateUseWidgetHook: s.onCreateUseWidgetHook,
42+
}));
4143

4244
useSyncExternalStore(diffFile.subscribe, diffFile.getUpdateCount, diffFile.getUpdateCount);
4345

@@ -47,6 +49,10 @@ export const DiffUnifiedView = memo(({ diffFile }: { diffFile: DiffFile }) => {
4749
setWidget({});
4850
}, [diffFile, useWidget]);
4951

52+
useEffect(() => {
53+
onCreateUseWidgetHook?.(useWidget);
54+
}, [useWidget, onCreateUseWidgetHook]);
55+
5056
const unifiedLineLength = Math.max(diffFile.unifiedLineLength, diffFile.fileLineLength);
5157

5258
const _width = useTextWidth({

packages/react/src/components/DiffView.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { DiffViewContext } from "./DiffViewContext";
1414
import { createDiffConfigStore } from "./tools";
1515
// import { DiffSplitView } from "./v2/DiffSplitView_v2";
1616

17+
import type { createDiffWidgetStore } from "./tools";
1718
import type { DiffHighlighter, DiffHighlighterLang } from "@git-diff-view/core";
1819
import type { CSSProperties, ForwardedRef, ReactNode } from "react";
1920

@@ -76,6 +77,7 @@ export type DiffViewProps<T> = {
7677
onUpdate: () => void;
7778
}) => ReactNode;
7879
onAddWidgetClick?: (lineNumber: number, side: SplitSide) => void;
80+
onCreateUseWidgetHook?: (hook: ReturnType<typeof createDiffWidgetStore>) => void;
7981
};
8082

8183
type DiffViewProps_1<T> = Omit<DiffViewProps<T>, "data"> & {
@@ -110,6 +112,7 @@ const InternalDiffView = <T extends unknown>(
110112
extendData,
111113
diffViewAddWidget,
112114
onAddWidgetClick,
115+
onCreateUseWidgetHook,
113116
isMounted,
114117
} = props;
115118

@@ -147,6 +150,8 @@ const InternalDiffView = <T extends unknown>(
147150
setRenderExtendLine,
148151
renderWidgetLine: _renderWidgetLine,
149152
setRenderWidgetLine,
153+
onCreateUseWidgetHook: _onCreateUseWidgetHook,
154+
setOnCreateUseWidgetHook,
150155
} = useDiffContext.getReadonlyState();
151156

152157
if (diffFileId && diffFileId !== id) {
@@ -185,6 +190,10 @@ const InternalDiffView = <T extends unknown>(
185190
setOnAddWidgetClick({ current: onAddWidgetClick });
186191
}
187192

193+
if (onCreateUseWidgetHook !== _onCreateUseWidgetHook) {
194+
setOnCreateUseWidgetHook(onCreateUseWidgetHook);
195+
}
196+
188197
if (renderExtendLine !== _renderExtendLine) {
189198
setRenderExtendLine(renderExtendLine);
190199
}
@@ -205,6 +214,7 @@ const InternalDiffView = <T extends unknown>(
205214
renderExtendLine,
206215
extendData,
207216
onAddWidgetClick,
217+
onCreateUseWidgetHook,
208218
]);
209219

210220
useEffect(() => {

packages/react/src/components/tools.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ export const createDiffConfigStore = (props: DiffViewProps<any> & { isMounted: b
7171
const setRenderExtendLine = (_renderExtendLine: typeof renderExtendLine.value) =>
7272
(renderExtendLine.value = _renderExtendLine);
7373

74+
const onCreateUseWidgetHook = ref(props.onCreateUseWidgetHook);
75+
76+
const setOnCreateUseWidgetHook = (_onCreateUseWidgetHook: typeof onCreateUseWidgetHook.value) =>
77+
(onCreateUseWidgetHook.value = _onCreateUseWidgetHook);
78+
7479
// 避免无意义的订阅
7580
const onAddWidgetClick = { current: props.onAddWidgetClick };
7681

@@ -100,6 +105,8 @@ export const createDiffConfigStore = (props: DiffViewProps<any> & { isMounted: b
100105
setRenderExtendLine,
101106
onAddWidgetClick,
102107
setOnAddWidgetClick,
108+
onCreateUseWidgetHook,
109+
setOnCreateUseWidgetHook,
103110
};
104111
});
105112
};

packages/react/src/components/v2/DiffSplitView_v2.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ export const DiffSplitView = memo(({ diffFile }: { diffFile: DiffFile }) => {
1717

1818
useDiffContextRef.current = useDiffContext;
1919

20-
const enableWrap = useDiffContext.useShallowStableSelector((s) => s.enableWrap);
20+
const { enableWrap, onCreateUseWidgetHook } = useDiffContext.useShallowStableSelector((s) => ({
21+
enableWrap: s.enableWrap,
22+
onCreateUseWidgetHook: s.onCreateUseWidgetHook,
23+
}));
2124

2225
// performance optimization
2326
const useWidget = useMemo(() => createDiffWidgetStore(useDiffContextRef), []);
@@ -30,6 +33,10 @@ export const DiffSplitView = memo(({ diffFile }: { diffFile: DiffFile }) => {
3033
setWidget({});
3134
}, [diffFile, useWidget]);
3235

36+
useEffect(() => {
37+
onCreateUseWidgetHook?.(useWidget);
38+
}, [useWidget, onCreateUseWidgetHook]);
39+
3340
return (
3441
<DiffWidgetContext.Provider value={contextValue}>
3542
{enableWrap ? <DiffSplitViewWrap diffFile={diffFile} /> : <DiffSplitViewNormal diffFile={diffFile} />}

packages/vue/index.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,6 +815,10 @@ export type DiffViewProps<T> = {
815815
data: T;
816816
}>;
817817
};
818+
initialWidgetState?: {
819+
side: SplitSide;
820+
lineNumber: number;
821+
};
818822
diffFile?: DiffFile;
819823
class?: string;
820824
style?: CSSProperties;

packages/vue/src/components/DiffView.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export type DiffViewProps<T> = {
4545
hunks: string[];
4646
};
4747
extendData?: { oldFile?: Record<string, { data: T }>; newFile?: Record<string, { data: T }> };
48+
initialWidgetState?: { side: SplitSide; lineNumber: number };
4849
diffFile?: DiffFile;
4950
class?: string;
5051
style?: CSSProperties;
@@ -116,6 +117,21 @@ export const DiffView = defineComponent<
116117
{ immediate: true }
117118
);
118119

120+
watch(
121+
() => props.initialWidgetState,
122+
() => {
123+
if (props.initialWidgetState) {
124+
widgetState.value = {
125+
side: props.initialWidgetState.side,
126+
lineNumber: props.initialWidgetState.lineNumber,
127+
};
128+
} else {
129+
widgetState.value = {};
130+
}
131+
},
132+
{ immediate: true, deep: true }
133+
);
134+
119135
watch(
120136
() => props.data,
121137
() => {
@@ -259,6 +275,7 @@ export const DiffView = defineComponent<
259275
"diffViewTheme",
260276
"extendData",
261277
"registerHighlighter",
278+
"initialWidgetState",
262279
"style",
263280
],
264281
// expose: ["getDiffView"],

0 commit comments

Comments
 (0)