Bluesky app fork with some witchin' additions 馃挮
at main 119 lines 3.5 kB view raw
1import {createContext, useCallback, useContext, useEffect, useMemo} from 'react' 2 3import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications' 4import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay' 5import { 6 AgeAssuranceDataProvider, 7 useAgeAssuranceDataContext, 8} from '#/ageAssurance/data' 9import {logger} from '#/ageAssurance/logger' 10import { 11 useAgeAssuranceState, 12 useOnAgeAssuranceAccessUpdate, 13} from '#/ageAssurance/state' 14import { 15 AgeAssuranceAccess, 16 type AgeAssuranceState, 17 AgeAssuranceStatus, 18} from '#/ageAssurance/types' 19import {useAgeAssuranceRegionConfigWithFallback} from '#/ageAssurance/util' 20 21export { 22 prefetchConfig as prefetchAgeAssuranceConfig, 23 prefetchAgeAssuranceData, 24 refetchServerState as refetchAgeAssuranceServerState, 25 usePatchOtherRequiredData as usePatchAgeAssuranceOtherRequiredData, 26 usePatchServerState as usePatchAgeAssuranceServerState, 27} from '#/ageAssurance/data' 28export {logger} from '#/ageAssurance/logger' 29export {MIN_ACCESS_AGE} from '#/ageAssurance/util' 30 31const AgeAssuranceStateContext = createContext<{ 32 Access: typeof AgeAssuranceAccess 33 Status: typeof AgeAssuranceStatus 34 state: AgeAssuranceState 35 flags: { 36 adultContentDisabled: boolean 37 chatDisabled: boolean 38 isOverRegionMinAccessAge: boolean 39 isOverAppMinAccessAge: boolean 40 } 41}>({ 42 Access: AgeAssuranceAccess, 43 Status: AgeAssuranceStatus, 44 state: { 45 lastInitiatedAt: undefined, 46 status: AgeAssuranceStatus.Unknown, 47 access: AgeAssuranceAccess.Full, 48 }, 49 flags: { 50 adultContentDisabled: false, 51 chatDisabled: false, 52 isOverRegionMinAccessAge: false, 53 isOverAppMinAccessAge: false, 54 }, 55}) 56 57/** 58 * THE MAIN AGE ASSURANCE CONTEXT HOOK 59 * 60 * Prefer this to using any of the lower-level data-provider hooks. 61 */ 62export function useAgeAssurance() { 63 return useContext(AgeAssuranceStateContext) 64} 65 66export function Provider({children}: {children: React.ReactNode}) { 67 return ( 68 <AgeAssuranceDataProvider> 69 <InnerProvider> 70 <RedirectOverlayProvider>{children}</RedirectOverlayProvider> 71 </InnerProvider> 72 </AgeAssuranceDataProvider> 73 ) 74} 75 76function InnerProvider({children}: {children: React.ReactNode}) { 77 const state = useAgeAssuranceState() 78 const {data} = useAgeAssuranceDataContext() 79 const config = useAgeAssuranceRegionConfigWithFallback() 80 const getAndRegisterPushToken = useGetAndRegisterPushToken() 81 82 const handleAccessUpdate = useCallback( 83 (s: AgeAssuranceState) => { 84 getAndRegisterPushToken({ 85 isAgeRestricted: s.access !== AgeAssuranceAccess.Full, 86 }) 87 }, 88 [getAndRegisterPushToken], 89 ) 90 useOnAgeAssuranceAccessUpdate(handleAccessUpdate) 91 92 useEffect(() => { 93 logger.debug(`useAgeAssuranceState`, {state}) 94 }, [state]) 95 96 return ( 97 <AgeAssuranceStateContext.Provider 98 value={useMemo(() => { 99 const chatDisabled = false 100 const isUnderAdultAge = false 101 const isOverRegionMinAccessAge = true 102 const isOverAppMinAccessAge = true 103 const adultContentDisabled = isUnderAdultAge 104 return { 105 Access: AgeAssuranceAccess, 106 Status: AgeAssuranceStatus, 107 state, 108 flags: { 109 adultContentDisabled, 110 chatDisabled, 111 isOverRegionMinAccessAge, 112 isOverAppMinAccessAge, 113 }, 114 } 115 }, [state, data, config])}> 116 {children} 117 </AgeAssuranceStateContext.Provider> 118 ) 119}