Improve effects, memoize
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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])
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user