Bluesky app fork with some witchin' additions 馃挮
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 101 lines 2.7 kB view raw
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}