forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}