1
1
import { addLogMessageAtom } from "@/state/log"
2
2
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"
6
3
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"
8
7
import useStartTask from "./log"
8
+ import { useFitBoundsOnChange } from "./map"
9
9
10
10
declare global {
11
11
interface Window {
@@ -17,21 +17,28 @@ const osmWorkerAtom = atom<Awaited<ReturnType<typeof createOsmWorker>> | null>(
17
17
null ,
18
18
)
19
19
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
+
20
33
export function useOsmWorker ( ) {
21
- const isCreatingRef = useRef ( false )
22
- const [ osmWorker , setOsmWorker ] = useAtom ( osmWorkerAtom )
34
+ const osmWorker = useAtomValue ( osmWorkerAtom )
23
35
const logMessage = useSetAtom ( addLogMessageAtom )
24
36
25
37
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 ] )
35
42
36
43
return osmWorker
37
44
}
@@ -47,6 +54,7 @@ export function useOsmFile(file: File | null, id?: string) {
47
54
48
55
useEffect ( ( ) => {
49
56
if ( ! osmWorker || ! file ) return
57
+ console . log ( "useOsmFile" , file , id , osmWorker )
50
58
const task = startTask ( `Processing file ${ file . name } ...` )
51
59
const stream = file . stream ( )
52
60
setOsm ( null )
0 commit comments