-
-
Notifications
You must be signed in to change notification settings - Fork 54
Expand file tree
/
Copy pathembedded-dev-tools.tsx
More file actions
77 lines (68 loc) · 2.21 KB
/
embedded-dev-tools.tsx
File metadata and controls
77 lines (68 loc) · 2.21 KB
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
72
73
74
75
76
77
import clsx from "clsx"
import { memo, useEffect, useState } from "react"
import { RDTContextProvider } from "./context/RDTContext.js"
import { useFindRouteOutlets } from "./hooks/useReactTreeListeners.js"
import { useSetRouteBoundaries } from "./hooks/useSetRouteBoundaries.js"
import { useTimelineHandler } from "./hooks/useTimelineHandler.js"
import { ContentPanel } from "./layout/ContentPanel.js"
import { MainPanel } from "./layout/MainPanel.js"
import { Tabs } from "./layout/Tabs.js"
import type { ReactRouterDevtoolsProps } from "./react-router-dev-tools.js"
// Import to ensure global reset styles are injected
import "./styles/use-styles.js"
import { devtoolsEventClient } from "@tanstack/devtools-client"
import { RequestProvider } from "./context/requests/request-context.js"
import { REACT_ROUTER_DEV_TOOLS } from "./utils/storage.js"
export interface EmbeddedDevToolsProps extends ReactRouterDevtoolsProps {
mainPanelClassName?: string
className?: string
}
const Embedded = memo(({ mainPanelClassName, className }: EmbeddedDevToolsProps) => {
useTimelineHandler()
useFindRouteOutlets()
useSetRouteBoundaries()
const [isOpen, setIsOpen] = useState(true)
useEffect(() => {
const cleanup = devtoolsEventClient.on("trigger-toggled", (e) => {
setIsOpen(e.payload.isOpen)
})
return cleanup
}, [])
return (
<div
id={REACT_ROUTER_DEV_TOOLS}
style={{
height: "100%",
}}
className={clsx("react-router-dev-tools", "h-full flex-row w-full", className)}
>
{isOpen ? (
<MainPanel className={mainPanelClassName} isEmbedded isOpen={true}>
<Tabs />
<ContentPanel />
</MainPanel>
) : null}
</div>
)
})
let hydrating = true
function useHydrated() {
const [hydrated, setHydrated] = useState(() => !hydrating)
useEffect(function hydrate() {
hydrating = false
setHydrated(true)
}, [])
return hydrated
}
const EmbeddedDevTools = ({ config, mainPanelClassName, className }: EmbeddedDevToolsProps) => {
const hydrated = useHydrated()
if (!hydrated) return null
return (
<RDTContextProvider config={config}>
<RequestProvider>
<Embedded mainPanelClassName={mainPanelClassName} className={className} />
</RequestProvider>
</RDTContextProvider>
)
}
export { EmbeddedDevTools }