Skip to content

Commit d01788a

Browse files
Merge pull request #39 from MrWangJustToDo/fix/shadow-dom
Fix shadow dom
2 parents e721d6d + fe7ce8b commit d01788a

File tree

28 files changed

+244
-23
lines changed

28 files changed

+244
-23
lines changed

packages/react/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,8 @@ declare const createDiffConfigStore: (props: DiffViewProps<any> & {
821821
}, diffFileId: string) => import("reactivity-store").UseSelectorWithStore<{
822822
id: import("reactivity-store").Ref<string, string>;
823823
setId: (_id: string) => string;
824+
dom: import("reactivity-store").Ref<HTMLElement, HTMLElement>;
825+
setDom: (_dom: HTMLElement) => HTMLElement;
824826
mode: import("reactivity-store").Ref<DiffModeEnum, DiffModeEnum>;
825827
setMode: (_mode: DiffModeEnum) => DiffModeEnum;
826828
mounted: import("reactivity-store").Ref<boolean, boolean>;

packages/react/src/components/DiffView.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ const InternalDiffView = <T extends unknown>(
210210
onCreateUseWidgetHook,
211211
]);
212212

213+
useEffect(() => {
214+
useDiffContext.getReadonlyState().setDom(wrapperRef?.current);
215+
}, [useDiffContext, wrapperRef]);
216+
213217
const value = useMemo(() => ({ useDiffContext }), [useDiffContext]);
214218

215219
return (

packages/react/src/components/tools.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import type { RefObject } from "react";
55

66
export const createDiffConfigStore = (props: DiffViewProps<any> & { isMounted: boolean }, diffFileId: string) => {
77
return createStore(() => {
8+
const dom = ref<HTMLElement>();
9+
10+
const setDom = (_dom: HTMLElement) => (dom.value = _dom);
11+
812
const id = ref(diffFileId);
913

1014
const setId = (_id: string) => (id.value = _id);
@@ -85,6 +89,8 @@ export const createDiffConfigStore = (props: DiffViewProps<any> & { isMounted: b
8589
return {
8690
id,
8791
setId,
92+
dom,
93+
setDom,
8894
mode,
8995
setMode,
9096
mounted,

packages/react/src/hooks/useDomWidth.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getElementRoot } from "@git-diff-view/utils";
12
import { useEffect, useState } from "react";
23

34
import { useDiffViewContext } from "../components/DiffViewContext";
@@ -12,11 +13,13 @@ export const useDomWidth = ({ selector, enable }: { selector: string; enable: bo
1213

1314
const { useDiffContext } = useDiffViewContext();
1415

15-
const { id, mounted } = useDiffContext.useShallowStableSelector((s) => ({ id: s.id, mounted: s.mounted }));
16+
const { id, mounted, dom } = useDiffContext.useShallowStableSelector((s) => ({ id: s.id, mounted: s.mounted, dom: s.dom }));
1617

1718
useEffect(() => {
1819
if (enable) {
19-
const container = document.querySelector(`#diff-root${id}`);
20+
const rootDocument = getElementRoot(dom as HTMLDivElement);
21+
22+
const container = rootDocument.querySelector(`#diff-root${id}`);
2023

2124
const wrapper = container?.querySelector(selector);
2225

@@ -61,7 +64,7 @@ export const useDomWidth = ({ selector, enable }: { selector: string; enable: bo
6164

6265
return () => cleanCb();
6366
}
64-
}, [selector, enable, id, mounted]);
67+
}, [selector, enable, id, mounted, dom]);
6568

6669
return width;
6770
};

packages/react/src/hooks/useSyncHeight.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getElementRoot } from "@git-diff-view/utils";
12
import { useEffect } from "react";
23

34
import { useDiffViewContext } from "../components/DiffViewContext";
@@ -17,11 +18,13 @@ export const useSyncHeight = ({
1718
}) => {
1819
const { useDiffContext } = useDiffViewContext();
1920

20-
const { id, mounted } = useDiffContext.useShallowStableSelector((s) => ({ id: s.id, mounted: s.mounted }));
21+
const { id, mounted, dom } = useDiffContext.useShallowStableSelector((s) => ({ id: s.id, mounted: s.mounted, dom: s.dom }));
2122

2223
useEffect(() => {
2324
if (enable) {
24-
const container = document.querySelector(`#diff-root${id}`);
25+
const rootDocument = getElementRoot(dom as HTMLDivElement);
26+
27+
const container = rootDocument.querySelector(`#diff-root${id}`);
2528

2629
const elements = Array.from(container?.querySelectorAll(selector) || []);
2730

@@ -83,5 +86,5 @@ export const useSyncHeight = ({
8386
return () => cleanCb();
8487
}
8588
}
86-
}, [selector, enable, side, id, wrapper, mounted]);
89+
}, [selector, enable, side, id, wrapper, mounted, dom]);
8790
};

packages/solid/src/components/DiffView.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ const InternalDiffView = <T extends unknown>(props: DiffViewProps<T>) => {
119119
createEffect(() => {
120120
const {
121121
setId,
122+
setDom,
122123
setEnableAddWidget,
123124
setEnableHighlight,
124125
setEnableWrap,
@@ -146,6 +147,8 @@ const InternalDiffView = <T extends unknown>(props: DiffViewProps<T>) => {
146147

147148
setMode(props.diffViewMode || DiffModeEnum.Split);
148149

150+
setDom(wrapperRef() as HTMLElement);
151+
149152
setOnAddWidgetClick({ current: props.onAddWidgetClick });
150153

151154
setRenderExtendLine(props.renderExtendLine);

packages/solid/src/components/tools.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export const createDiffConfigStore = (props: DiffViewProps<any>, diffFileId: str
88

99
const setId = (_id: string) => (id.value = _id);
1010

11+
const dom = ref<HTMLElement>();
12+
13+
const setDom = (_dom: HTMLElement) => (dom.value = _dom);
14+
1115
const mode = ref(props.diffViewMode);
1216

1317
const setMode = (_mode: DiffModeEnum) => (mode.value = _mode);
@@ -60,6 +64,8 @@ export const createDiffConfigStore = (props: DiffViewProps<any>, diffFileId: str
6064
return {
6165
id,
6266
setId,
67+
dom,
68+
setDom,
6369
mode,
6470
setMode,
6571
isMounted,

packages/solid/src/hooks/generate.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,38 @@ import { createEffect, createSignal, onCleanup } from "solid-js";
22

33
import { useDiffViewContext } from "../components/DiffViewContext";
44

5+
import type { DiffViewProps } from "../components/DiffView";
56
import type { createDiffConfigStore } from "../components/tools";
7+
import type { DiffModeEnum } from "@git-diff-view/utils";
68

79
type AllKey = keyof ReturnType<ReturnType<typeof createDiffConfigStore>["getReadonlyState"]>;
810

9-
type Data = ReturnType<ReturnType<typeof createDiffConfigStore>["getReadonlyState"]>;
11+
type Data = {
12+
id: string;
13+
setId: (id: string) => void;
14+
dom: HTMLElement | undefined;
15+
setDom: (dom: HTMLElement) => void;
16+
mode: DiffModeEnum;
17+
setMode: (mode: DiffModeEnum) => void;
18+
isMounted: boolean;
19+
setIsIsMounted: (isMounted: boolean) => void;
20+
enableWrap: boolean;
21+
setEnableWrap: (enableWrap: boolean) => void;
22+
enableAddWidget: boolean;
23+
setEnableAddWidget: (enableAddWidget: boolean) => void;
24+
enableHighlight: boolean;
25+
setEnableHighlight: (enableHighlight: boolean) => void;
26+
fontSize: number;
27+
setFontSize: (fontSize: number) => void;
28+
extendData: DiffViewProps<any>["extendData"];
29+
setExtendData: (extendData: DiffViewProps<any>["extendData"]) => void;
30+
renderWidgetLine: DiffViewProps<any>["renderWidgetLine"];
31+
setRenderWidgetLine: (renderWidgetLine: DiffViewProps<any>["renderWidgetLine"]) => void;
32+
renderExtendLine: DiffViewProps<any>["renderExtendLine"];
33+
setRenderExtendLine: (renderExtendLine: DiffViewProps<any>["renderExtendLine"]) => void;
34+
onAddWidgetClick: { current: DiffViewProps<any>["onAddWidgetClick"] };
35+
setOnAddWidgetClick: (onAddWidgetClick: { current: DiffViewProps<any>["onAddWidgetClick"] }) => void;
36+
};
1037

1138
export const generateHook = <T extends AllKey, K extends Data[T] = Data[T]>(key: T) => {
1239
return () => {

packages/solid/src/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export * from "./useIsMounted";
44
export * from "./useTextWidth";
55
export * from "./useMode";
66
export * from "./useId";
7+
export * from "./useDom";
78
export * from "./useDomWidth";
89
export * from "./useSyncHeight";
910
export * from "./useExtendData";

packages/solid/src/hooks/useDom.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { generateHook } from "./generate";
2+
3+
import type { Accessor } from "solid-js";
4+
5+
6+
export const useDom = generateHook("dom") as () => Accessor<HTMLElement | undefined>;

0 commit comments

Comments
 (0)