Skip to content

Commit 88b0bda

Browse files
committed
Transform original webworker call site to ReScript
1 parent 2f23580 commit 88b0bda

File tree

3 files changed

+91
-23
lines changed

3 files changed

+91
-23
lines changed

pages/test.js

+3-23
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,5 @@
1-
import { useEffect, useRef, useCallback } from 'react'
1+
import EvalTestRes from "src/EvalTest.mjs"
22

3-
export default function Index() {
4-
const workerRef = useRef()
5-
useEffect(() => {
6-
console.log(import.meta.url);
7-
workerRef.current = new Worker(new URL('../worker.js', import.meta.url))
8-
workerRef.current.onmessage = (evt) =>
9-
alert(`WebWorker Response => ${evt.data}`)
10-
return () => {
11-
workerRef.current.terminate()
12-
}
13-
}, [])
14-
15-
const handleWork = useCallback(async () => {
16-
workerRef.current.postMessage(100000)
17-
}, [])
18-
19-
return (
20-
<div>
21-
<p>Do work in a WebWorker!</p>
22-
<button onClick={handleWork}>Calculate PI</button>
23-
</div>
24-
)
3+
export default function Test(props) {
4+
return <EvalTestRes {...props} />
255
}

src/EvalTest.mjs

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Generated by ReScript, PLEASE EDIT WITH CARE
2+
3+
import * as React from "react";
4+
import * as Belt_Option from "rescript/lib/es6/belt_Option.js";
5+
import * as Caml_option from "rescript/lib/es6/caml_option.js";
6+
7+
function useEval(param) {
8+
var workerRef = React.useRef(undefined);
9+
React.useEffect((function () {
10+
var worker = (new Worker(new URL("../worker.js", import.meta.url)));
11+
workerRef.current = Caml_option.some(worker);
12+
worker.onmessage = (function (evt) {
13+
console.log("value: " + evt.data);
14+
15+
});
16+
console.log(worker);
17+
return (function (param) {
18+
Belt_Option.map(workerRef.current, (function (worker) {
19+
worker.terminate();
20+
21+
}));
22+
23+
});
24+
}), []);
25+
var handleWork = React.useCallback((function (param) {
26+
return Belt_Option.forEach(workerRef.current, (function (worker) {
27+
worker.postMessage(100000);
28+
29+
}));
30+
}), []);
31+
return [
32+
workerRef,
33+
handleWork
34+
];
35+
}
36+
37+
function EvalTest$default(Props) {
38+
var match = useEval(undefined);
39+
return React.createElement("div", undefined, React.createElement("p", undefined, "Do work in a WebWorker!"), React.createElement("button", {
40+
onClick: match[1]
41+
}, "Calculate PI"));
42+
}
43+
44+
var $$default = EvalTest$default;
45+
46+
export {
47+
useEval ,
48+
$$default ,
49+
$$default as default,
50+
51+
}
52+
/* react Not a pure module */

src/EvalTest.res

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
@send
2+
external terminate: 'a => unit = "terminate"
3+
@send external postMessage: ('a, int) => unit = "postMessage"
4+
@set external onmessage: ('a, 'cb) => unit = "onmessage"
5+
6+
let useEval = () => {
7+
let workerRef = React.useRef(None)
8+
9+
React.useEffect1(() => {
10+
let worker = %raw(`new Worker(new URL("../worker.js", import.meta.url))`)
11+
workerRef.current = Some(worker)
12+
13+
worker->onmessage(evt => {
14+
Js.log(`value: ${evt["data"]}`)
15+
})
16+
Js.log(worker)
17+
Some(() => workerRef.current->Belt.Option.map(worker => worker->terminate)->ignore)
18+
}, [])
19+
let handleWork = React.useCallback1(_ => {
20+
workerRef.current->Belt.Option.forEach(worker => {
21+
worker->postMessage(100000)
22+
})
23+
}, [])
24+
25+
(workerRef, handleWork)
26+
}
27+
28+
@react.component
29+
let default = () => {
30+
let (_workerRef, handleWork) = useEval()
31+
32+
<div>
33+
<p> {React.string("Do work in a WebWorker!")} </p>
34+
<button onClick={handleWork}> {React.string("Calculate PI")} </button>
35+
</div>
36+
}

0 commit comments

Comments
 (0)