import {createContext, useCallback, useContext, useEffect, useMemo} from 'react' import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications' import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay' import { AgeAssuranceDataProvider, useAgeAssuranceDataContext, } from '#/ageAssurance/data' import {logger} from '#/ageAssurance/logger' import { useAgeAssuranceState, useOnAgeAssuranceAccessUpdate, } from '#/ageAssurance/state' import { AgeAssuranceAccess, type AgeAssuranceState, AgeAssuranceStatus, } from '#/ageAssurance/types' import {useAgeAssuranceRegionConfigWithFallback} from '#/ageAssurance/util' export { prefetchConfig as prefetchAgeAssuranceConfig, prefetchAgeAssuranceData, refetchServerState as refetchAgeAssuranceServerState, usePatchOtherRequiredData as usePatchAgeAssuranceOtherRequiredData, usePatchServerState as usePatchAgeAssuranceServerState, } from '#/ageAssurance/data' export {logger} from '#/ageAssurance/logger' export {MIN_ACCESS_AGE} from '#/ageAssurance/util' const AgeAssuranceStateContext = createContext<{ Access: typeof AgeAssuranceAccess Status: typeof AgeAssuranceStatus state: AgeAssuranceState flags: { adultContentDisabled: boolean chatDisabled: boolean isOverRegionMinAccessAge: boolean isOverAppMinAccessAge: boolean } }>({ Access: AgeAssuranceAccess, Status: AgeAssuranceStatus, state: { lastInitiatedAt: undefined, status: AgeAssuranceStatus.Unknown, access: AgeAssuranceAccess.Full, }, flags: { adultContentDisabled: false, chatDisabled: false, isOverRegionMinAccessAge: false, isOverAppMinAccessAge: false, }, }) /** * THE MAIN AGE ASSURANCE CONTEXT HOOK * * Prefer this to using any of the lower-level data-provider hooks. */ export function useAgeAssurance() { return useContext(AgeAssuranceStateContext) } export function Provider({children}: {children: React.ReactNode}) { return ( {children} ) } function InnerProvider({children}: {children: React.ReactNode}) { const state = useAgeAssuranceState() const {data} = useAgeAssuranceDataContext() const config = useAgeAssuranceRegionConfigWithFallback() const getAndRegisterPushToken = useGetAndRegisterPushToken() const handleAccessUpdate = useCallback( (s: AgeAssuranceState) => { getAndRegisterPushToken({ isAgeRestricted: s.access !== AgeAssuranceAccess.Full, }) }, [getAndRegisterPushToken], ) useOnAgeAssuranceAccessUpdate(handleAccessUpdate) useEffect(() => { logger.debug(`useAgeAssuranceState`, {state}) }, [state]) return ( { const chatDisabled = false const isUnderAdultAge = false const isOverRegionMinAccessAge = true const isOverAppMinAccessAge = true const adultContentDisabled = isUnderAdultAge return { Access: AgeAssuranceAccess, Status: AgeAssuranceStatus, state, flags: { adultContentDisabled, chatDisabled, isOverRegionMinAccessAge, isOverAppMinAccessAge, }, } }, [state, data, config])}> {children} ) }