Improve effects, memoize

This commit is contained in:
Eric Bailey
2025-12-04 10:02:06 -06:00
parent 41c68b1513
commit 1e01b28f54
2 changed files with 21 additions and 14 deletions
+11 -7
View File
@@ -1,4 +1,4 @@
import {createContext, useContext, useEffect, useMemo} from 'react' import {createContext, useCallback, useContext, useEffect, useMemo} from 'react'
import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications' import {useGetAndRegisterPushToken} from '#/lib/notifications/notifications'
import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay' import {Provider as RedirectOverlayProvider} from '#/ageAssurance/components/RedirectOverlay'
@@ -56,16 +56,20 @@ function InnerProvider({children}: {children: React.ReactNode}) {
const state = useAgeAssuranceState() const state = useAgeAssuranceState()
const getAndRegisterPushToken = useGetAndRegisterPushToken() const getAndRegisterPushToken = useGetAndRegisterPushToken()
const handleAccessUpdate = useCallback(
(s: AgeAssuranceState) => {
getAndRegisterPushToken({
isAgeRestricted: s.access !== AgeAssuranceAccess.Full,
})
},
[getAndRegisterPushToken],
)
useOnAgeAssuranceAccessUpdate(handleAccessUpdate)
useEffect(() => { useEffect(() => {
logger.debug(`useAgeAssuranceState`, {state}) logger.debug(`useAgeAssuranceState`, {state})
}, [state]) }, [state])
useOnAgeAssuranceAccessUpdate(state => {
getAndRegisterPushToken({
isAgeRestricted: state.access !== AgeAssuranceAccess.Full,
})
})
return ( return (
<AgeAssuranceStateContext.Provider <AgeAssuranceStateContext.Provider
value={useMemo( value={useMemo(
+10 -7
View File
@@ -1,4 +1,4 @@
import {useMemo, useRef} from 'react' import {useEffect, useMemo, useState} from 'react'
import {computeAgeAssuranceRegionAccess} from '@atproto/api' import {computeAgeAssuranceRegionAccess} from '@atproto/api'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
@@ -81,11 +81,14 @@ export function useOnAgeAssuranceAccessUpdate(
cb: (state: AgeAssuranceState) => void, cb: (state: AgeAssuranceState) => void,
) { ) {
const state = useAgeAssuranceState() const state = useAgeAssuranceState()
const prevState = useRef<AgeAssuranceAccess | null>(null) // start with null to ensure callback is called on first render
const [prevAccess, setPrevAccess] = useState<AgeAssuranceAccess | null>(null)
if (prevState.current !== state.access) { useEffect(() => {
prevState.current = state.access if (prevAccess !== state.access) {
cb(state) setPrevAccess(state.access)
logger.debug(`useOnAgeAssuranceAccessUpdate`, {state}) cb(state)
} logger.debug(`useOnAgeAssuranceAccessUpdate`, {state})
}
}, [cb, state, prevAccess])
} }