Bluesky app fork with some witchin' additions 馃挮
witchsky.app
bluesky
fork
client
1import {
2 createContext,
3 useCallback,
4 useContext,
5 useEffect,
6 useState,
7} from 'react'
8import type {PropsWithChildren} from 'react'
9
10import * as persisted from '#/state/persisted'
11
12type StateContext = persisted.Schema['constellationInstance']
13type SetContext = (v: persisted.Schema['constellationInstance']) => void
14
15const stateContext = createContext<StateContext>(
16 persisted.defaults.constellationInstance,
17)
18const setContext = createContext<SetContext>(
19 (_: persisted.Schema['constellationInstance']) => {},
20)
21
22export function Provider({children}: PropsWithChildren<{}>) {
23 const [state, setState] = useState(persisted.get('constellationInstance'))
24
25 const setStateWrapped = useCallback(
26 (constellationInstance: persisted.Schema['constellationInstance']) => {
27 setState(constellationInstance)
28 persisted.write('constellationInstance', constellationInstance)
29 },
30 [setState],
31 )
32
33 useEffect(() => {
34 return persisted.onUpdate(
35 'constellationInstance',
36 nextConstellationInstance => {
37 setState(nextConstellationInstance)
38 },
39 )
40 }, [setStateWrapped])
41
42 return (
43 <stateContext.Provider value={state}>
44 <setContext.Provider value={setStateWrapped}>
45 {children}
46 </setContext.Provider>
47 </stateContext.Provider>
48 )
49}
50
51export function useConstellationInstance() {
52 return useContext(stateContext) ?? persisted.defaults.constellationInstance!
53}
54
55export function useSetConstellationInstance() {
56 return useContext(setContext)
57}