forked from microsoft/devicescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSplitDevTools.jsx
More file actions
69 lines (63 loc) · 2.3 KB
/
Copy pathSplitDevTools.jsx
File metadata and controls
69 lines (63 loc) · 2.3 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
import React, { useState, useRef, useEffect } from "react"
import SplitPane from "react-split-pane"
export default function SplitDevTools(props) {
const { children, source, sourceId, darkMode = "" } = props
const [dragging, setDragging] = useState(false)
const handleDragStart = () => setDragging(true)
const handleDragEnd = () => setDragging(false)
const iframeRef = useRef(undefined)
const url = `https://microsoft.github.io/jacdac-docs/editors/devicescript/?devicescriptvm=1&embed=1&footer=0&${darkMode}=1`
const postSource = force => {
const iframe = iframeRef.current
const parent = iframe?.contentWindow
if (!parent) return
const msg = {
channel: "devicescript",
type: "source",
source,
force,
}
parent.postMessage(msg, "https://microsoft.github.io/jacdac-docs/")
}
// when source changes
useEffect(() => postSource(true), [source, sourceId])
// when a frame goes live
useEffect(() => {
const iframe = iframeRef.current
const parent = iframe?.contentWindow
if (!parent) return
const handleMessage = ev => {
const { data } = ev
if (data?.channel === "jacdac") {
window.removeEventListener("message", handleMessage)
postSource(false)
}
}
window.addEventListener("message", handleMessage)
return () => window.removeEventListener("message", handleMessage)
}, [source, dragging, url])
return (
<SplitPane
split="vertical"
defaultSize={"min(60%, 55rem)"}
minSize={400}
onDragStarted={handleDragStart}
onDragFinished={handleDragEnd}
>
<div className="pane left">{children}</div>
<div>
{!dragging && (
<iframe
ref={iframeRef}
id="jacdac-dashboard"
className="pane right"
allow="usb;serial;bluetooth"
sandbox="allow-scripts allow-downloads allow-same-origin"
src={url}
frameBorder="0"
/>
)}
</div>
</SplitPane>
)
}