forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1import {
2 createContext,
3 type PropsWithChildren,
4 useCallback,
5 useContext,
6 useEffect,
7 useMemo,
8 useState,
9} from 'react'
10
11import * as persisted from '#/state/persisted'
12
13type StateContext = persisted.Schema['deerVerification']
14type SetContext = (v: persisted.Schema['deerVerification']) => void
15
16const stateContext = createContext<StateContext>(
17 persisted.defaults.deerVerification,
18)
19const setContext = createContext<SetContext>(
20 (_: persisted.Schema['deerVerification']) => {},
21)
22
23export function Provider({children}: PropsWithChildren<{}>) {
24 const [state, setState] = useState(persisted.get('deerVerification'))
25
26 const setStateWrapped = useCallback(
27 (deerVerification: persisted.Schema['deerVerification']) => {
28 setState(deerVerification)
29 persisted.write('deerVerification', deerVerification)
30 },
31 [setState],
32 )
33
34 useEffect(() => {
35 return persisted.onUpdate('deerVerification', nextDeerVerification => {
36 setState(nextDeerVerification)
37 })
38 }, [setStateWrapped])
39
40 return (
41 <stateContext.Provider value={state}>
42 <setContext.Provider value={setStateWrapped}>
43 {children}
44 </setContext.Provider>
45 </stateContext.Provider>
46 )
47}
48
49export function useDeerVerification() {
50 return useContext(stateContext) ?? persisted.defaults.deerVerification!
51}
52
53export function useDeerVerificationEnabled() {
54 return useDeerVerification().enabled
55}
56
57export function useDeerVerificationTrusted(
58 mandatory: string | undefined = undefined,
59) {
60 const trusted = new Set(useDeerVerification().trusted)
61 if (mandatory) {
62 trusted.add(mandatory)
63 }
64 return trusted
65}
66
67export function useSetDeerVerification() {
68 return useContext(setContext)
69}
70
71export function useSetDeerVerificationEnabled() {
72 const deerVerification = useDeerVerification()
73 const setDeerVerification = useSetDeerVerification()
74
75 return useMemo(
76 () => (enabled: boolean) =>
77 setDeerVerification({...deerVerification, enabled}),
78 [deerVerification, setDeerVerification],
79 )
80}
81
82export function useSetDeerVerificationTrust() {
83 const deerVerification = useDeerVerification()
84 const setDeerVerification = useSetDeerVerification()
85
86 return useMemo(
87 () => ({
88 add: (add: string) => {
89 const trusted = new Set(deerVerification.trusted)
90 trusted.add(add)
91 setDeerVerification({...deerVerification, trusted: Array.from(trusted)})
92 },
93 remove: (remove: string) => {
94 const trusted = new Set(deerVerification.trusted)
95 trusted.delete(remove)
96 setDeerVerification({...deerVerification, trusted: Array.from(trusted)})
97 },
98 }),
99 [deerVerification, setDeerVerification],
100 )
101}