Skip to content

Commit 8cdada1

Browse files
authored
Merge pull request #46 from retejs/fix/no-drag-propagation
fix: no drag propagation
2 parents 8953a2f + 267cfaa commit 8cdada1

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

src/renderer.ts

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,24 @@ type CreateRoot = (container: Element | DocumentFragment) => any
66

77
export function getRenderer(props?: { createRoot?: CreateRoot }): Renderer {
88
const createRoot = props?.createRoot
9+
const wrappers = new WeakMap<HTMLElement, HTMLElement>()
10+
11+
function getWrapper(container: HTMLElement) {
12+
const wrapper = wrappers.get(container)
13+
14+
if (wrapper) return wrapper
15+
16+
const span = document.createElement('span')
17+
18+
container.appendChild(span)
19+
return wrappers.set(container, span).get(container) as HTMLElement
20+
}
21+
function removeWrapper(container: HTMLElement) {
22+
const wrapper = wrappers.get(container)
23+
24+
if (wrapper) wrapper.remove()
25+
wrappers.delete(container)
26+
}
927

1028
if (createRoot) {
1129
const roots = new WeakMap<HTMLElement, any>()
@@ -14,27 +32,36 @@ export function getRenderer(props?: { createRoot?: CreateRoot }): Renderer {
1432
mount: ((
1533
element: React.DOMElement<React.DOMAttributes<any>, any>,
1634
container: HTMLElement
17-
) : Element => {
18-
if (!roots.has(container)) {
19-
roots.set(container, createRoot(container))
35+
): Element => {
36+
const wrapper = getWrapper(container)
37+
38+
if (!roots.has(wrapper)) {
39+
roots.set(wrapper, createRoot(wrapper))
2040
}
21-
const root = roots.get(container)
41+
const root = roots.get(wrapper)
2242

2343
return root.render(element)
2444
}) as ReactDOM.Renderer,
2545
unmount: (container: HTMLElement) => {
26-
const root = roots.get(container)
46+
const wrapper = getWrapper(container)
47+
const root = roots.get(wrapper)
2748

2849
if (root) {
2950
root.unmount()
30-
roots.delete(container)
51+
roots.delete(wrapper)
52+
removeWrapper(container)
3153
}
3254
}
3355
}
3456
}
3557

3658
return {
37-
mount: ReactDOM.render,
38-
unmount: ReactDOM.unmountComponentAtNode
59+
mount: ((element: React.DOMElement<React.DOMAttributes<any>, any>, container: HTMLElement): Element => {
60+
return ReactDOM.render(element, getWrapper(container))
61+
}) as ReactDOM.Renderer,
62+
unmount: (container: HTMLElement) => {
63+
ReactDOM.unmountComponentAtNode(getWrapper(container))
64+
removeWrapper(container)
65+
}
3966
}
4067
}

0 commit comments

Comments
 (0)