Bluesky app fork with some witchin' additions 💫
1import {
2 createContext,
3 type PropsWithChildren,
4 useCallback,
5 useContext,
6 useEffect,
7 useState,
8} from 'react'
9
10import * as persisted from '#/state/persisted'
11
12// Preference: disableReplyMetrics – when true, disables reply metrics on posts
13
14type StateContext = persisted.Schema['disableReplyMetrics']
15// Same setter signature used across other preference modules
16type SetContext = (v: persisted.Schema['disableReplyMetrics']) => void
17
18const stateContext = createContext<StateContext>(
19 persisted.defaults.disableReplyMetrics,
20)
21const setContext = createContext<SetContext>(
22 (_: persisted.Schema['disableReplyMetrics']) => {},
23)
24
25export function Provider({children}: PropsWithChildren<{}>) {
26 const [state, setState] = useState(persisted.get('disableReplyMetrics'))
27
28 const setStateWrapped = useCallback(
29 (value: persisted.Schema['disableReplyMetrics']) => {
30 setState(value)
31 persisted.write('disableReplyMetrics', value)
32 },
33 [setState],
34 )
35
36 useEffect(() => {
37 return persisted.onUpdate('disableReplyMetrics', next => {
38 setState(next)
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 useDisableReplyMetrics() {
52 return useContext(stateContext)
53}
54
55export function useSetDisableReplyMetrics() {
56 return useContext(setContext)
57}