-
-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathEmbeddedDevTools.tsx
64 lines (55 loc) · 2.21 KB
/
EmbeddedDevTools.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
import { useLocation } from "@remix-run/react"
import clsx from "clsx"
import { useEffect, useState } from "react"
import type { RemixDevToolsProps } from "./RemixDevTools.js"
import { RDTContextProvider, RDTEmbeddedContextProvider as RemixDevToolsEmbeddedMode } from "./context/RDTContext.js"
import { useSettingsContext } from "./context/useRDTContext.js"
import { useBorderedRoutes } from "./hooks/useBorderedRoutes.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 { REMIX_DEV_TOOLS } from "./utils/storage.js"
export interface EmbeddedDevToolsProps extends RemixDevToolsProps {
mainPanelClassName?: string
className?: string
}
const Embedded = ({ plugins: pluginArray, mainPanelClassName, className }: EmbeddedDevToolsProps) => {
useTimelineHandler()
useBorderedRoutes()
useSetRouteBoundaries()
const { settings } = useSettingsContext()
const { position } = settings
const leftSideOriented = position.includes("left")
const url = useLocation().search
const plugins = pluginArray?.map((plugin) => (typeof plugin === "function" ? plugin() : plugin))
if (settings.requireUrlFlag && !url.includes(settings.urlFlag)) return null
return (
<div id={REMIX_DEV_TOOLS} className={clsx("remix-dev-tools remix-dev-tools-reset", className)}>
<MainPanel className={mainPanelClassName} isEmbedded isOpen={true}>
<Tabs plugins={plugins} />
<ContentPanel leftSideOriented={leftSideOriented} plugins={plugins} />
</MainPanel>
</div>
)
}
let hydrating = true
function useHydrated() {
const [hydrated, setHydrated] = useState(() => !hydrating)
useEffect(function hydrate() {
hydrating = false
setHydrated(true)
}, [])
return hydrated
}
const EmbeddedDevTools = ({ plugins, mainPanelClassName, className }: EmbeddedDevToolsProps) => {
const hydrated = useHydrated()
if (!hydrated) return null
return (
<RDTContextProvider>
<Embedded mainPanelClassName={mainPanelClassName} className={className} plugins={plugins} />
</RDTContextProvider>
)
}
export { EmbeddedDevTools }