Extract flag computation into shared util

This commit is contained in:
Eric Bailey
2026-06-08 14:12:37 -05:00
parent 9b5fc19613
commit a4eda59f48
3 changed files with 53 additions and 29 deletions
+8 -28
View File
@@ -14,13 +14,13 @@ import {
} from '#/ageAssurance/state' } from '#/ageAssurance/state'
import { import {
AgeAssuranceAccess, AgeAssuranceAccess,
type AgeAssuranceFlags,
type AgeAssuranceState, type AgeAssuranceState,
AgeAssuranceStatus, AgeAssuranceStatus,
} from '#/ageAssurance/types' } from '#/ageAssurance/types'
import { import {
isUnderAge, computeAgeAssuranceFlags,
maybeRestrictChatSettings, maybeRestrictChatSettings,
MIN_ACCESS_AGE,
useAgeAssuranceRegionConfigWithFallback, useAgeAssuranceRegionConfigWithFallback,
} from '#/ageAssurance/util' } from '#/ageAssurance/util'
@@ -38,13 +38,7 @@ const AgeAssuranceStateContext = createContext<{
Access: typeof AgeAssuranceAccess Access: typeof AgeAssuranceAccess
Status: typeof AgeAssuranceStatus Status: typeof AgeAssuranceStatus
state: AgeAssuranceState state: AgeAssuranceState
flags: { flags: AgeAssuranceFlags
adultContentDisabled: boolean
chatDisabled: boolean
isDeclaredUnderAdultAge: boolean
isOverRegionMinAccessAge: boolean
isOverAppMinAccessAge: boolean
}
}>({ }>({
Access: AgeAssuranceAccess, Access: AgeAssuranceAccess,
Status: AgeAssuranceStatus, Status: AgeAssuranceStatus,
@@ -107,29 +101,15 @@ function InnerProvider({children}: {children: React.ReactNode}) {
return ( return (
<AgeAssuranceStateContext.Provider <AgeAssuranceStateContext.Provider
value={useMemo(() => { value={useMemo(() => {
const chatDisabled = state.access !== AgeAssuranceAccess.Full
const isDeclaredUnderAdultAge = data?.birthdate
? isUnderAge(data.birthdate, 18)
: true
const isOverRegionMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, config.minAccessAge)
: false
const isOverAppMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, MIN_ACCESS_AGE)
: false
const adultContentDisabled =
state.access !== AgeAssuranceAccess.Full || isDeclaredUnderAdultAge
return { return {
Access: AgeAssuranceAccess, Access: AgeAssuranceAccess,
Status: AgeAssuranceStatus, Status: AgeAssuranceStatus,
state, state,
flags: { flags: computeAgeAssuranceFlags({
adultContentDisabled, state,
chatDisabled, config,
isDeclaredUnderAdultAge, data,
isOverRegionMinAccessAge, }),
isOverAppMinAccessAge,
},
} }
}, [state, data, config])}> }, [state, data, config])}>
{children} {children}
+8
View File
@@ -21,6 +21,14 @@ export type AgeAssuranceState = {
error?: 'config' // maybe other specific cases in the future error?: 'config' // maybe other specific cases in the future
} }
export type AgeAssuranceFlags = {
adultContentDisabled: boolean
chatDisabled: boolean
isDeclaredUnderAdultAge: boolean
isOverRegionMinAccessAge: boolean
isOverAppMinAccessAge: boolean
}
export function parseStatusFromString(raw: string) { export function parseStatusFromString(raw: string) {
switch (raw) { switch (raw) {
case 'unknown': case 'unknown':
+37 -1
View File
@@ -11,11 +11,16 @@ import {getAge} from '#/lib/strings/time'
import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings' import {restrictChatSettings} from '#/state/queries/messages/restrictChatSettings'
import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation'
import { import {
type AgeAssuranceData,
getDidFromAgentSession, getDidFromAgentSession,
getOtherRequiredDataFromCache, getOtherRequiredDataFromCache,
useAgeAssuranceDataContext, useAgeAssuranceDataContext,
} from '#/ageAssurance/data' } from '#/ageAssurance/data'
import {AgeAssuranceAccess} from '#/ageAssurance/types' import {
AgeAssuranceAccess,
type AgeAssuranceFlags,
type AgeAssuranceState,
} from '#/ageAssurance/types'
import {type Geolocation, useGeolocation} from '#/geolocation' import {type Geolocation, useGeolocation} from '#/geolocation'
export const MIN_ACCESS_AGE = 13 export const MIN_ACCESS_AGE = 13
@@ -128,3 +133,34 @@ export function maybeRestrictChatSettings({agent}: {agent: AtpAgent}) {
if (data?.actorDeclaration?.allowIncoming === 'none') return if (data?.actorDeclaration?.allowIncoming === 'none') return
restrictChatSettings({agent, did}) restrictChatSettings({agent, did})
} }
export function computeAgeAssuranceFlags({
state,
config,
data,
}: {
state: AgeAssuranceState
config: AppBskyAgeassuranceDefs.ConfigRegion
data: AgeAssuranceData['data']
}): AgeAssuranceFlags {
const chatDisabled = state.access !== AgeAssuranceAccess.Full
const isDeclaredUnderAdultAge = data?.birthdate
? isUnderAge(data.birthdate, 18)
: true
const isOverRegionMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, config.minAccessAge)
: false
const isOverAppMinAccessAge = data?.birthdate
? !isUnderAge(data.birthdate, MIN_ACCESS_AGE)
: false
const adultContentDisabled =
state.access !== AgeAssuranceAccess.Full || isDeclaredUnderAdultAge
return {
adultContentDisabled,
chatDisabled,
isDeclaredUnderAdultAge,
isOverRegionMinAccessAge,
isOverAppMinAccessAge,
}
}