-
-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathroot.tsx
71 lines (61 loc) · 1.84 KB
/
root.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import { useEffect, useState } from "react"
import { createPortal } from "react-dom"
import { RemixDevTools, type RemixDevToolsProps } from "../RemixDevTools.js"
import { RDTEmbeddedContextProvider, type RdtClientConfig, useIsEmbeddedRDT } from "../context/RDTContext.js"
import { hydrationDetector } from "./hydration.js"
let hydrating = true
function useHydrated() {
const [hydrated, setHydrated] = useState(() => !hydrating)
useEffect(function hydrate() {
hydrating = false
setHydrated(true)
}, [])
return hydrated
}
export const defineClientConfig = (config: RdtClientConfig) => config
export const withDevTools =
(Component: any, config?: RemixDevToolsProps & { panelMode?: "auto" | "embedded" }) => () => {
hydrationDetector()
const hydrated = useHydrated()
const isEmbedded = useIsEmbeddedRDT()
if (!hydrated) return <Component />
if ((config?.panelMode ?? "auto") === "embedded") {
return (
<RDTEmbeddedContextProvider>
<Component />
</RDTEmbeddedContextProvider>
)
}
return (
<>
<Component />
{!isEmbedded && createPortal(<RemixDevTools {...config} />, document.body)}
</>
)
}
/**
*
* @description Injects the dev tools into the Vite App, ONLY meant to be used by the package plugin, do not use this yourself!
*/
export const withViteDevTools =
(Component: any, config?: RemixDevToolsProps & { panelMode?: "auto" | "embedded" }) => () => {
hydrationDetector()
function AppWithDevTools(props: any) {
const hydrated = useHydrated()
if (!hydrated) return <Component />
if ((config?.panelMode ?? "auto") === "embedded") {
return (
<RDTEmbeddedContextProvider>
<Component />
</RDTEmbeddedContextProvider>
)
}
return (
<>
<Component {...props} />
{createPortal(<RemixDevTools {...config} />, document.body)}
</>
)
}
return AppWithDevTools
}