Skip to content

Commit 21b3ea7

Browse files
committed
convert usePromise to useSyncExternalStore
1 parent 08f524b commit 21b3ea7

1 file changed

Lines changed: 51 additions & 15 deletions

File tree

src/hooks/useDefaultGateway.ts

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,57 @@
11
import type { XyoGatewayProvider } from '@xyo-network/xl1-protocol'
2-
import { useEffect, useState } from 'react'
2+
import { useSyncExternalStore } from 'react'
33

44
import { getXyoGateway } from '../getXyoGateway.ts'
5-
import { usePromise } from '@xylabs/react-promise'
5+
6+
interface GatewayState {
7+
gateway?: XyoGatewayProvider
8+
error: Error | null
9+
isLoading: boolean
10+
}
11+
12+
let currentState: GatewayState = {
13+
gateway: undefined,
14+
error: null,
15+
isLoading: false
16+
}
17+
18+
const listeners = new Set<() => void>()
19+
20+
const emitChange = () => {
21+
listeners.forEach(listener => listener())
22+
}
23+
24+
const updateState = (newState: Partial<GatewayState>) => {
25+
currentState = { ...currentState, ...newState }
26+
emitChange()
27+
}
28+
29+
const initializeGateway = async () => {
30+
if (currentState.isLoading || currentState.gateway) return
31+
32+
updateState({ isLoading: true, error: null })
33+
34+
try {
35+
const gateway = await getXyoGateway({ assert: true })
36+
updateState({ gateway, isLoading: false, error: null })
37+
} catch (error) {
38+
updateState({ error: error as Error, isLoading: false })
39+
}
40+
}
41+
42+
const subscribe = (listener: () => void) => {
43+
listeners.add(listener)
44+
45+
void initializeGateway()
46+
47+
return () => {
48+
listeners.delete(listener)
49+
}
50+
}
51+
52+
const getSnapshot = (): GatewayState => currentState
653

754
export const useDefaultGateway = () => {
8-
const [gateway, setGateway] = useState<XyoGatewayProvider>()
9-
const [error, setError] = useState<Error | null>(null)
10-
11-
usePromise(async () => {
12-
try {
13-
const xyoGateway = await getXyoGateway({ assert: true })
14-
setGateway(xyoGateway)
15-
} catch {
16-
setError(new Error('XYO Gateway not available'))
17-
}
18-
}, [])
19-
20-
return { gateway, error }
55+
return useSyncExternalStore(subscribe, getSnapshot)
2156
}
57+

0 commit comments

Comments
 (0)