From 9fff2dda282ea10f1dd46940d151184dcbaba71c Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Thu, 26 Jun 2025 22:23:08 -0500 Subject: [PATCH] Override mod prefs --- src/state/age-assurance/const.ts | 11 ++++++++++ src/state/age-assurance/index.tsx | 10 ++++----- ...eMaybeApplyAgeRestrictedModerationPrefs.ts | 21 +++++++++++++++++++ src/state/queries/preferences/index.ts | 10 ++++++++- 4 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 src/state/age-assurance/const.ts create mode 100644 src/state/age-assurance/useMaybeApplyAgeRestrictedModerationPrefs.ts diff --git a/src/state/age-assurance/const.ts b/src/state/age-assurance/const.ts new file mode 100644 index 0000000000..2f329582a1 --- /dev/null +++ b/src/state/age-assurance/const.ts @@ -0,0 +1,11 @@ +import {type ModerationPrefs} from '@atproto/api' + +import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' + +export const AGE_RESTRICTED_MODERATION_PREFS: ModerationPrefs = { + adultContentEnabled: false, + labels: DEFAULT_LOGGED_OUT_LABEL_PREFERENCES, + labelers: [], + mutedWords: [], + hiddenPosts: [], +} diff --git a/src/state/age-assurance/index.tsx b/src/state/age-assurance/index.tsx index ac6b46fcf0..225f5c6a11 100644 --- a/src/state/age-assurance/index.tsx +++ b/src/state/age-assurance/index.tsx @@ -1,8 +1,5 @@ import {createContext, useContext, useMemo} from 'react' -import { - // useQueryClient, - useQuery, -} from '@tanstack/react-query' +import {useQuery, useQueryClient} from '@tanstack/react-query' import {wait} from '#/lib/async/wait' import {isNetworkError} from '#/lib/strings/errors' @@ -13,6 +10,7 @@ import { type AppBskyUnspeccedDefs, } from '#/state/age-assurance/types' import {useGeolocation} from '#/state/geolocation' +import {preferencesQueryKey} from '#/state/queries/preferences' import {useAgent} from '#/state/session' const logger = Logger.create(Logger.Context.AgeAssurance) @@ -35,7 +33,7 @@ const AgeAssuranceAPIContext = createContext({ }) export function Provider({children}: {children: React.ReactNode}) { - // const qc = useQueryClient() + const qc = useQueryClient() const agent = useAgent() const {geolocation} = useGeolocation() @@ -59,6 +57,8 @@ export function Provider({children}: {children: React.ReactNode}) { account: agent.session?.did, }) + qc.invalidateQueries({queryKey: preferencesQueryKey}) + return data } catch (e) { if (!isNetworkError(e)) { diff --git a/src/state/age-assurance/useMaybeApplyAgeRestrictedModerationPrefs.ts b/src/state/age-assurance/useMaybeApplyAgeRestrictedModerationPrefs.ts new file mode 100644 index 0000000000..4d5bff6d3c --- /dev/null +++ b/src/state/age-assurance/useMaybeApplyAgeRestrictedModerationPrefs.ts @@ -0,0 +1,21 @@ +import {useCallback} from 'react' +import {type ModerationPrefs} from '@atproto/api' + +import {useAgeAssuranceContext} from '#/state/age-assurance' +import {AGE_RESTRICTED_MODERATION_PREFS} from '#/state/age-assurance/const' + +export function useMaybeApplyAgeRestrictedModerationPrefs() { + const {isLoaded, isAgeRestricted, isExempt} = useAgeAssuranceContext() + return useCallback( + (prev: ModerationPrefs) => { + const isDefinitelyAgeRestricted = isLoaded && isAgeRestricted + const notSureYet = !isLoaded && isAgeRestricted + + if (isExempt) return prev + if (notSureYet || isDefinitelyAgeRestricted) + return AGE_RESTRICTED_MODERATION_PREFS + return prev + }, + [isLoaded, isAgeRestricted, isExempt], + ) +} diff --git a/src/state/queries/preferences/index.ts b/src/state/queries/preferences/index.ts index e64f117e61..a4025f0845 100644 --- a/src/state/queries/preferences/index.ts +++ b/src/state/queries/preferences/index.ts @@ -9,6 +9,7 @@ import {PROD_DEFAULT_FEED} from '#/lib/constants' import {replaceEqualDeep} from '#/lib/functions' import {getAge} from '#/lib/strings/time' import {logger} from '#/logger' +import {useMaybeApplyAgeRestrictedModerationPrefs} from '#/state/age-assurance/useMaybeApplyAgeRestrictedModerationPrefs' import {STALE} from '#/state/queries' import { DEFAULT_HOME_FEED_PREFS, @@ -31,7 +32,8 @@ export const preferencesQueryKey = [preferencesQueryKeyRoot] export function usePreferencesQuery() { const agent = useAgent() - return useQuery({ + const overrideModPrefs = useMaybeApplyAgeRestrictedModerationPrefs() + const query = useQuery({ staleTime: STALE.SECONDS.FIFTEEN, structuralSharing: replaceEqualDeep, refetchOnWindowFocus: true, @@ -69,6 +71,12 @@ export function usePreferencesQuery() { } }, }) + + if (query.data) { + query.data.moderationPrefs = overrideModPrefs(query.data.moderationPrefs) + } + + return query } export function useClearPreferencesMutation() {