Skip to content

Commit 2f9fa76

Browse files
committed
wip
1 parent 62a3792 commit 2f9fa76

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed
Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,52 @@
1-
import { useEffect, useRef, useState } from 'react';
1+
import { useCallback, useEffect, useState } from 'react';
22
import Smelter from '../smelter/live';
33
import type { SmelterInstanceOptions } from '../manager';
44

55
export function useSmelter(options: SmelterInstanceOptions): Smelter | undefined {
66
const [smelter, setSmelter] = useState<Smelter>();
7-
const prevSmelter = useRef<Smelter>();
7+
const [promiseQueue, setPromiseQueue] = useState<(() => Promise<void>)[]>([]);
8+
const [isWaiting, setIsWaiting] = useState(false);
9+
10+
const enqueue = useCallback((fn: () => Promise<void>) => {
11+
setPromiseQueue(queue => [
12+
...queue,
13+
fn,
14+
])
15+
}, []);
816

917
useEffect(() => {
1018
const smelter = new Smelter(options);
11-
const smelterToTerminate = prevSmelter.current;
12-
prevSmelter.current = smelter;
1319

1420
let cancel = false;
15-
(async () => {
16-
if (smelterToTerminate) {
17-
console.log("Terminate");
18-
}
19-
await smelterToTerminate?.terminate().catch(() => { });
20-
console.log("Init");
21+
enqueue(async () => {
2122
await smelter.init();
2223
await smelter.start();
2324
if (!cancel) {
2425
setSmelter(smelter);
2526
}
26-
})();
27+
});
2728

2829
return () => {
2930
cancel = true;
31+
enqueue(async () => await smelter.terminate());
3032
};
31-
}, [options?.url]);
33+
}, [options?.url, enqueue]);
3234

3335
useEffect(() => {
34-
return () => {
35-
if (prevSmelter.current) {
36-
console.log("Terminate unmount");
37-
}
38-
// It runs only during unmount
39-
void prevSmelter.current?.terminate().catch(() => { });
36+
if (isWaiting) {
37+
return;
38+
}
39+
setIsWaiting(true);
40+
41+
const fn = promiseQueue[0];
42+
if (fn) {
43+
void (async () => {
44+
await fn();
45+
setPromiseQueue(promiseQueue.slice(1));
46+
setIsWaiting(false);
47+
})();
4048
}
41-
}, [])
49+
}, [promiseQueue, isWaiting]);
4250

4351
return smelter;
4452
}

0 commit comments

Comments
 (0)