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