Skip to content

Commit 7accbbf

Browse files
Fix multiple initialization issue
1 parent bb8f4a1 commit 7accbbf

File tree

1 file changed

+23
-15
lines changed
  • apps/osm-merge/src/hooks

1 file changed

+23
-15
lines changed

apps/osm-merge/src/hooks/osm.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import { addLogMessageAtom } from "@/state/log"
22
import { createOsmWorker } from "@/workers/osm"
3-
import { atom, useAtom, useSetAtom } from "jotai"
4-
import { Osm } from "osm.ts"
5-
import { useEffect, useMemo, useRef, useState } from "react"
63
import * as Comlink from "comlink"
7-
import { useFitBoundsOnChange } from "./map"
4+
import { atom, useAtomValue, useSetAtom } from "jotai"
5+
import { Osm } from "osm.ts"
6+
import { useEffect, useMemo, useState } from "react"
87
import useStartTask from "./log"
8+
import { useFitBoundsOnChange } from "./map"
99

1010
declare global {
1111
interface Window {
@@ -17,21 +17,28 @@ const osmWorkerAtom = atom<Awaited<ReturnType<typeof createOsmWorker>> | null>(
1717
null,
1818
)
1919

20+
osmWorkerAtom.onMount = (setAtom) => {
21+
let unmounted = false
22+
createOsmWorker().then(async (newOsmWorker) => {
23+
if (unmounted) return
24+
window.osmWorker = newOsmWorker
25+
// React treats the return value as a function and tries to call it, so it must be wrapped.
26+
setAtom(() => newOsmWorker)
27+
})
28+
return () => {
29+
unmounted = true
30+
}
31+
}
32+
2033
export function useOsmWorker() {
21-
const isCreatingRef = useRef(false)
22-
const [osmWorker, setOsmWorker] = useAtom(osmWorkerAtom)
34+
const osmWorker = useAtomValue(osmWorkerAtom)
2335
const logMessage = useSetAtom(addLogMessageAtom)
2436

2537
useEffect(() => {
26-
if (isCreatingRef.current) return
27-
isCreatingRef.current = true
28-
createOsmWorker().then(async (newOsmWorker) => {
29-
window.osmWorker = newOsmWorker
30-
await newOsmWorker.subscribeToLog(Comlink.proxy(logMessage))
31-
// React treats the return value as a function and tries to call it, so it must be wrapped.
32-
setOsmWorker(() => newOsmWorker)
33-
})
34-
}, [logMessage, setOsmWorker])
38+
if (osmWorker && logMessage) {
39+
osmWorker.subscribeToLog(Comlink.proxy(logMessage))
40+
}
41+
}, [logMessage, osmWorker])
3542

3643
return osmWorker
3744
}
@@ -47,6 +54,7 @@ export function useOsmFile(file: File | null, id?: string) {
4754

4855
useEffect(() => {
4956
if (!osmWorker || !file) return
57+
console.log("useOsmFile", file, id, osmWorker)
5058
const task = startTask(`Processing file ${file.name}...`)
5159
const stream = file.stream()
5260
setOsm(null)

0 commit comments

Comments
 (0)