diff --git a/src/App.native.tsx b/src/App.native.tsx
index 6f6a2220c9..f561e5fe4e 100644
--- a/src/App.native.tsx
+++ b/src/App.native.tsx
@@ -41,6 +41,7 @@ import {Provider as PrefsStateProvider} from '#/state/preferences'
import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
+import {Provider as PreferencesProvider} from '#/state/queries/preferences'
import {Provider as ServiceAccountManager} from '#/state/service-config'
import {
Provider as SessionProvider,
@@ -156,55 +157,57 @@ function InnerApp() {
key={currentAccount?.did}>
-
-
-
-
-
- {/* LabelDefsProvider MUST come before ModerationOptsProvider */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {/* LabelDefsProvider MUST come before ModerationOptsProvider */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/App.web.tsx b/src/App.web.tsx
index fc2a5b1650..6414e767d2 100644
--- a/src/App.web.tsx
+++ b/src/App.web.tsx
@@ -32,6 +32,7 @@ import {Provider as PrefsStateProvider} from '#/state/preferences'
import {Provider as LabelDefsProvider} from '#/state/preferences/label-defs'
import {Provider as ModerationOptsProvider} from '#/state/preferences/moderation-opts'
import {Provider as UnreadNotifsProvider} from '#/state/queries/notifications/unread'
+import {Provider as PreferencesProvider} from '#/state/queries/preferences'
import {Provider as ServiceConfigProvider} from '#/state/service-config'
import {
Provider as SessionProvider,
@@ -134,51 +135,53 @@ function InnerApp() {
key={currentAccount?.did}>
-
-
-
-
-
- {/* LabelDefsProvider MUST come before ModerationOptsProvider */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {/* LabelDefsProvider MUST come before ModerationOptsProvider */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/FeedCard.tsx b/src/components/FeedCard.tsx
index efd14be4ba..372b81bdcd 100644
--- a/src/components/FeedCard.tsx
+++ b/src/components/FeedCard.tsx
@@ -14,7 +14,7 @@ import {logger} from '#/logger'
import {precacheFeedFromGeneratorView} from '#/state/queries/feed'
import {
useAddSavedFeedsMutation,
- usePreferencesQuery,
+ usePreferences,
useRemoveFeedMutation,
} from '#/state/queries/preferences'
import {useSession} from '#/state/session'
@@ -278,7 +278,7 @@ function SaveButtonInner({
text?: boolean
} & Partial) {
const {t: l} = useLingui()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {isPending: isAddSavedFeedPending, mutateAsync: saveFeeds} =
useAddSavedFeedsMutation()
const {isPending: isRemovePending, mutateAsync: removeFeed} =
diff --git a/src/components/PolicyUpdateOverlay/usePolicyUpdateState.ts b/src/components/PolicyUpdateOverlay/usePolicyUpdateState.ts
index 32b948af9d..e350ad154c 100644
--- a/src/components/PolicyUpdateOverlay/usePolicyUpdateState.ts
+++ b/src/components/PolicyUpdateOverlay/usePolicyUpdateState.ts
@@ -38,13 +38,11 @@ export function usePolicyUpdateState({
}
}
- const nuxIsReady = nux.status === 'ready'
const nuxIsCompleted = nux.nux?.completed === true
const nuxIsOptimisticallyCompleted = !!variables?.completed
const [completedForDevice, setCompletedForDevice] = deviceStorage
const completed = computeCompletedState({
- nuxIsReady,
nuxIsCompleted,
nuxIsOptimisticallyCompleted,
completedForDevice,
@@ -58,7 +56,6 @@ export function usePolicyUpdateState({
if (!debugOverride) {
syncCompletedState({
- nuxIsReady,
nuxIsCompleted,
nuxIsOptimisticallyCompleted,
completedForDevice,
@@ -83,27 +80,18 @@ export function usePolicyUpdateState({
}
export function computeCompletedState({
- nuxIsReady,
nuxIsCompleted,
nuxIsOptimisticallyCompleted,
completedForDevice,
}: {
- nuxIsReady: boolean
nuxIsCompleted: boolean
nuxIsOptimisticallyCompleted: boolean
completedForDevice: boolean | undefined
}): boolean {
- /**
- * Assume completed to prevent flash
- */
- let completed = true
-
/**
* Prefer server state, if available
*/
- if (nuxIsReady) {
- completed = nuxIsCompleted
- }
+ let completed = nuxIsCompleted
/**
* Override with optimistic state or device state
@@ -116,14 +104,12 @@ export function computeCompletedState({
}
export function syncCompletedState({
- nuxIsReady,
nuxIsCompleted,
nuxIsOptimisticallyCompleted,
completedForDevice,
save,
setCompletedForDevice,
}: {
- nuxIsReady: boolean
nuxIsCompleted: boolean
nuxIsOptimisticallyCompleted: boolean
completedForDevice: boolean | undefined
@@ -134,7 +120,6 @@ export function syncCompletedState({
* Sync device state to server state for this account
*/
if (
- nuxIsReady &&
!nuxIsCompleted &&
!nuxIsOptimisticallyCompleted &&
!!completedForDevice
@@ -145,7 +130,7 @@ export function syncCompletedState({
completed: true,
data: undefined,
})
- } else if (nuxIsReady && nuxIsCompleted && !completedForDevice) {
+ } else if (nuxIsCompleted && !completedForDevice) {
logger.debug(`syncing server state to device state`)
/*
* Sync server state to device state
diff --git a/src/components/ProgressGuide/FollowDialog.tsx b/src/components/ProgressGuide/FollowDialog.tsx
index 643a1d018f..e64aa133ab 100644
--- a/src/components/ProgressGuide/FollowDialog.tsx
+++ b/src/components/ProgressGuide/FollowDialog.tsx
@@ -9,7 +9,7 @@ import {useNonReactiveCallback} from '#/lib/hooks/useNonReactiveCallback'
import {popularInterests, useInterestsDisplayNames} from '#/lib/interests'
import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useActorSearch} from '#/state/queries/actor-search'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useGetSuggestedUsersQuery} from '#/state/queries/trending/useGetSuggestedUsersQuery'
import {useSession} from '#/state/session'
import {type Follow10ProgressGuide} from '#/state/shell/progress-guide'
@@ -115,7 +115,7 @@ function DialogInner({guide}: {guide?: Follow10ProgressGuide}) {
const {_} = useLingui()
const ax = useAnalytics()
const interestsDisplayNames = useInterestsDisplayNames()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const personalizedInterests = preferences?.interests?.tags
const interests = Object.keys(interestsDisplayNames)
.sort(boostInterests(popularInterests))
diff --git a/src/components/RichTextTag.tsx b/src/components/RichTextTag.tsx
index 3325671b6a..f6da2b07df 100644
--- a/src/components/RichTextTag.tsx
+++ b/src/components/RichTextTag.tsx
@@ -8,7 +8,7 @@ import {useNavigation} from '@react-navigation/native'
import {type NavigationProp} from '#/lib/routes/types'
import {isInvalidHandle} from '#/lib/strings/handles'
import {
- usePreferencesQuery,
+ usePreferences,
useRemoveMutedWordsMutation,
useUpsertMutedWordsMutation,
} from '#/state/queries/preferences'
@@ -20,7 +20,6 @@ import {
createStaticClickIfUnmodified,
InlineLinkText,
} from '#/components/Link'
-import {Loader} from '#/components/Loader'
import * as Menu from '#/components/Menu'
import {IS_NATIVE, IS_WEB} from '#/env'
@@ -36,8 +35,7 @@ export function RichTextTag({
textStyle: StyleProp
}) {
const {_} = useLingui()
- const {isLoading: isPreferencesLoading, data: preferences} =
- usePreferencesQuery()
+ const preferences = usePreferences()
const {
mutateAsync: upsertMutedWord,
variables: optimisticUpsert,
@@ -169,7 +167,7 @@ export function RichTextTag({
? _(msg`Unmute ${isCashtag ? tag : `#${tag}`}`)
: _(msg`Mute ${isCashtag ? tag : `#${tag}`}`)}
-
+
diff --git a/src/components/dialogs/MutedWords.tsx b/src/components/dialogs/MutedWords.tsx
index a885f1bf5f..ca2e3a52b6 100644
--- a/src/components/dialogs/MutedWords.tsx
+++ b/src/components/dialogs/MutedWords.tsx
@@ -7,7 +7,7 @@ import {Trans} from '@lingui/react/macro'
import {logger} from '#/logger'
import {
- usePreferencesQuery,
+ usePreferences,
useRemoveMutedWordMutation,
useUpdateMutedWordMutation,
useUpsertMutedWordsMutation,
@@ -52,11 +52,7 @@ function MutedWordsInner() {
const t = useTheme()
const {_} = useLingui()
const {gtMobile} = useBreakpoints()
- const {
- isLoading: isPreferencesLoading,
- data: preferences,
- error: preferencesError,
- } = usePreferencesQuery()
+ const preferences = usePreferences()
const {isPending, mutateAsync: addMutedWord} = useUpsertMutedWordsMutation()
const [field, setField] = useState('')
const [targets, setTargets] = useState(['content'])
@@ -378,19 +374,7 @@ function MutedWordsInner() {
Your muted words
- {isPreferencesLoading ? (
-
- ) : preferencesError || !preferences ? (
-
-
-
- We're sorry, but we weren't able to load your muted words at
- this time. Please try again.
-
-
-
- ) : preferences.moderationPrefs.mutedWords.length ? (
+ {preferences.moderationPrefs.mutedWords.length ? (
[...preferences.moderationPrefs.mutedWords]
.reverse()
.map((word, i) => (
diff --git a/src/components/dialogs/nuxs/index.tsx b/src/components/dialogs/nuxs/index.tsx
index 2d2e2c6a6a..141c87c091 100644
--- a/src/components/dialogs/nuxs/index.tsx
+++ b/src/components/dialogs/nuxs/index.tsx
@@ -12,7 +12,7 @@ import {logger} from '#/logger'
import {STALE} from '#/state/queries'
import {Nux, useNuxs, useResetNuxs, useSaveNux} from '#/state/queries/nuxs'
import {
- usePreferencesQuery,
+ usePreferences,
type UsePreferencesQueryResponse,
} from '#/state/queries/preferences'
import {useProfileQuery} from '#/state/queries/profile'
@@ -54,7 +54,7 @@ export function useNuxDialogContext() {
export function NuxDialogs() {
const {currentAccount} = useSession()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {data: profile} = useProfileQuery({
did: currentAccount?.did,
staleTime: STALE.INFINITY, // createdAt isn't gonna change
diff --git a/src/components/moderation/LabelPreference.tsx b/src/components/moderation/LabelPreference.tsx
index a654b46e24..1843daeaec 100644
--- a/src/components/moderation/LabelPreference.tsx
+++ b/src/components/moderation/LabelPreference.tsx
@@ -11,7 +11,7 @@ import {useGlobalLabelStrings} from '#/lib/moderation/useGlobalLabelStrings'
import {useLabelBehaviorDescription} from '#/lib/moderation/useLabelBehaviorDescription'
import {getLabelStrings} from '#/lib/moderation/useLabelInfo'
import {
- usePreferencesQuery,
+ usePreferences,
usePreferencesSetContentLabelMutation,
} from '#/state/queries/preferences'
import {atoms as a, useBreakpoints, useTheme} from '#/alf'
@@ -123,7 +123,7 @@ export function GlobalLabelPreference({
const {_} = useLingui()
const {identifier} = labelDefinition
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {mutate, variables} = usePreferencesSetContentLabelMutation()
const savedPref = preferences?.moderationPrefs.labels[identifier]
const pref = variables?.visibility ?? savedPref ?? 'warn'
@@ -186,7 +186,7 @@ export function LabelerLabelPreference({
const isGlobalLabel = !labelDefinition.definedBy
const {identifier} = labelDefinition
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {mutate, variables} = usePreferencesSetContentLabelMutation()
const savedPref =
labelerDid && !isGlobalLabel
diff --git a/src/components/verification/index.ts b/src/components/verification/index.ts
index 7a83a160a9..de52d430b8 100644
--- a/src/components/verification/index.ts
+++ b/src/components/verification/index.ts
@@ -1,6 +1,6 @@
import {useMemo} from 'react'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useCurrentAccountProfile} from '#/state/queries/useCurrentAccountProfile'
import {useSession} from '#/state/session'
import type * as bsky from '#/types/bsky'
@@ -83,7 +83,7 @@ export function useSimpleVerificationState({
}: {
profile?: bsky.profile.AnyProfileView
}): SimpleVerificationState {
- const preferences = usePreferencesQuery()
+ const preferences = usePreferences()
const prefs = useMemo(
() => preferences.data?.verificationPrefs || {hideBadges: false},
[preferences.data?.verificationPrefs],
diff --git a/src/features/liveEvents/context.tsx b/src/features/liveEvents/context.tsx
index 3de2534a8e..13e785219d 100644
--- a/src/features/liveEvents/context.tsx
+++ b/src/features/liveEvents/context.tsx
@@ -9,7 +9,7 @@ import {
isBskyCustomFeedUrl,
makeRecordUri,
} from '#/lib/strings/url-helpers'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {IS_DEV, LIVE_EVENTS_URL} from '#/env'
import {useLiveEventPreferences} from '#/features/liveEvents/preferences'
import {type LiveEventsWorkerResponse} from '#/features/liveEvents/types'
@@ -38,7 +38,7 @@ const Context = createContext(DEFAULT_LIVE_EVENTS)
export function Provider({children}: React.PropsWithChildren<{}>) {
const [isDevMode] = useDevMode()
const isBskyTeam = useIsBskyTeam()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const mutedWords = useMemo(
() => preferences?.moderationPrefs?.mutedWords ?? [],
[preferences?.moderationPrefs?.mutedWords],
diff --git a/src/screens/Moderation/VerificationSettings.tsx b/src/screens/Moderation/VerificationSettings.tsx
index 052d10cd6a..6af3bbf8ff 100644
--- a/src/screens/Moderation/VerificationSettings.tsx
+++ b/src/screens/Moderation/VerificationSettings.tsx
@@ -5,7 +5,7 @@ import {Trans} from '@lingui/react/macro'
import {urls} from '#/lib/constants'
import {
- usePreferencesQuery,
+ usePreferences,
type UsePreferencesQueryResponse,
} from '#/state/queries/preferences'
import {useSetVerificationPrefsMutation} from '#/state/queries/preferences'
@@ -23,7 +23,7 @@ export function Screen() {
const {_} = useLingui()
const ax = useAnalytics()
const gutters = useGutters(['base'])
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
return (
diff --git a/src/screens/Moderation/index.tsx b/src/screens/Moderation/index.tsx
index 77877071a6..7bfa56f2f3 100644
--- a/src/screens/Moderation/index.tsx
+++ b/src/screens/Moderation/index.tsx
@@ -16,8 +16,7 @@ import {useIsBirthdateUpdateAllowed} from '#/state/birthdate'
import {useRemoveLabelersMutation} from '#/state/queries/labeler'
import {
useMyLabelersQuery,
- usePreferencesQuery,
- type UsePreferencesQueryResponse,
+ usePreferences,
usePreferencesSetAdultContentMutation,
} from '#/state/queries/preferences'
import {isNonConfigurableModerationAuthority} from '#/state/session/additional-moderation-authorities'
@@ -41,7 +40,6 @@ import {Person_Stroke2_Corner0_Rounded as Person} from '#/components/icons/Perso
import * as LabelingService from '#/components/LabelingServiceCard'
import * as Layout from '#/components/Layout'
import {InlineLinkText, Link} from '#/components/Link'
-import {ListMaybePlaceholder} from '#/components/Lists'
import {Loader} from '#/components/Loader'
import {GlobalLabelPreference} from '#/components/moderation/LabelPreference'
import * as Toast from '#/components/Toast'
@@ -49,50 +47,9 @@ import {Text} from '#/components/Typography'
import {useAgeAssurance} from '#/ageAssurance'
import {IS_IOS} from '#/env'
-function ErrorState({error}: {error: string}) {
- const t = useTheme()
- return (
-
-
-
- Hmmmm, it seems we're having trouble loading this data. See below for
- more details. If this issue persists, please contact us.
-
-
-
- {error}
-
-
- )
-}
-
export function ModerationScreen(
_props: NativeStackScreenProps,
) {
- const {_} = useLingui()
- const {
- isLoading: isPreferencesLoading,
- error: preferencesError,
- data: preferences,
- } = usePreferencesQuery()
-
- const isLoading = isPreferencesLoading
- const error = preferencesError
-
return (
@@ -105,18 +62,7 @@ export function ModerationScreen(
- {isLoading ? (
-
- ) : error || !preferences ? (
-
- ) : (
-
- )}
+
)
@@ -154,11 +100,8 @@ function SubItem({
)
}
-export function ModerationScreenInner({
- preferences,
-}: {
- preferences: UsePreferencesQueryResponse
-}) {
+export function ModerationScreenInner() {
+ const preferences = usePreferences()
const {_} = useLingui()
const t = useTheme()
const setMinimalShellMode = useSetMinimalShellMode()
diff --git a/src/screens/ModerationInteractionSettings/index.tsx b/src/screens/ModerationInteractionSettings/index.tsx
index 261e6b55ae..c05f5ca1bd 100644
--- a/src/screens/ModerationInteractionSettings/index.tsx
+++ b/src/screens/ModerationInteractionSettings/index.tsx
@@ -8,10 +8,7 @@ import deepEqual from 'fast-deep-equal'
import {logger} from '#/logger'
import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
import {createPostgateRecord} from '#/state/queries/postgate/util'
-import {
- usePreferencesQuery,
- type UsePreferencesQueryResponse,
-} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {
threadgateAllowUISettingToAllowRecordValue,
threadgateRecordToAllowUISetting,
@@ -20,12 +17,10 @@ import {atoms as a, useGutters} from '#/alf'
import {Admonition} from '#/components/Admonition'
import {PostInteractionSettingsForm} from '#/components/dialogs/PostInteractionSettingsDialog'
import * as Layout from '#/components/Layout'
-import {Loader} from '#/components/Loader'
import * as Toast from '#/components/Toast'
export function Screen() {
const gutters = useGutters(['base'])
- const {data: preferences} = usePreferencesQuery()
return (
@@ -46,20 +41,15 @@ export function Screen() {
composer.
- {preferences ? (
-
- ) : (
-
-
-
- )}
+
)
}
-function Inner({preferences}: {preferences: UsePreferencesQueryResponse}) {
+function Inner() {
+ const preferences = usePreferences()
const {_} = useLingui()
const {mutateAsync: setPostInteractionSettings, isPending} =
usePostInteractionSettingsMutation()
diff --git a/src/screens/Profile/Header/ProfileHeaderLabeler.tsx b/src/screens/Profile/Header/ProfileHeaderLabeler.tsx
index 565bf2edc4..3ee332332a 100644
--- a/src/screens/Profile/Header/ProfileHeaderLabeler.tsx
+++ b/src/screens/Profile/Header/ProfileHeaderLabeler.tsx
@@ -19,7 +19,7 @@ import {useProfileShadow} from '#/state/cache/profile-shadow'
import {type Shadow} from '#/state/cache/types'
import {useLabelerSubscriptionMutation} from '#/state/queries/labeler'
import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useRequireAuth, useSession} from '#/state/session'
import {ProfileMenu} from '#/view/com/profile/ProfileMenu'
import {atoms as a, tokens, useTheme} from '#/alf'
@@ -244,7 +244,7 @@ export function HeaderLabelerButtons({
const requireAuth = useRequireAuth()
const playHaptic = useHaptics()
const editProfileControl = useDialogControl()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {
mutateAsync: toggleSubscription,
variables,
@@ -252,7 +252,7 @@ export function HeaderLabelerButtons({
} = useLabelerSubscriptionMutation()
const isSubscribed =
variables?.subscribe ??
- preferences?.moderationPrefs.labelers.find(l => l.did === profile.did)
+ preferences.moderationPrefs.labelers.find(l => l.did === profile.did)
const cantSubscribePrompt = Prompt.usePromptControl()
diff --git a/src/screens/Profile/ProfileFeed/index.tsx b/src/screens/Profile/ProfileFeed/index.tsx
index 03fae0207a..70585830ea 100644
--- a/src/screens/Profile/ProfileFeed/index.tsx
+++ b/src/screens/Profile/ProfileFeed/index.tsx
@@ -23,7 +23,7 @@ import {
import {type FeedDescriptor, type FeedParams} from '#/state/queries/post-feed'
import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed'
import {
- usePreferencesQuery,
+ usePreferences,
type UsePreferencesQueryResponse,
} from '#/state/queries/preferences'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
@@ -101,7 +101,7 @@ function ProfileFeedScreenIntermediate({
feedUri: string
feedParams: FeedParams | undefined
}) {
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {data: info} = useFeedSourceInfoQuery({uri: feedUri})
if (!preferences || !info) {
diff --git a/src/screens/Profile/components/ProfileFeedHeader.tsx b/src/screens/Profile/components/ProfileFeedHeader.tsx
index 6966fa6fe2..a507adff59 100644
--- a/src/screens/Profile/components/ProfileFeedHeader.tsx
+++ b/src/screens/Profile/components/ProfileFeedHeader.tsx
@@ -15,7 +15,7 @@ import {type FeedSourceFeedInfo} from '#/state/queries/feed'
import {useLikeMutation, useUnlikeMutation} from '#/state/queries/like'
import {
useAddSavedFeedsMutation,
- usePreferencesQuery,
+ usePreferences,
useRemoveFeedMutation,
useUpdateSavedFeedsMutation,
} from '#/state/queries/preferences'
@@ -93,7 +93,7 @@ export function ProfileFeedHeader({info}: {info: FeedSourceFeedInfo}) {
const infoControl = Dialog.useDialogControl()
const playHaptic = useHaptics()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const [likeUri, setLikeUri] = useState(info.likeUri || '')
const likeCount =
diff --git a/src/screens/ProfileList/index.tsx b/src/screens/ProfileList/index.tsx
index f368645d6f..e6d0235bf0 100644
--- a/src/screens/ProfileList/index.tsx
+++ b/src/screens/ProfileList/index.tsx
@@ -25,7 +25,7 @@ import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {useListQuery} from '#/state/queries/list'
import {RQKEY as FEED_RQKEY} from '#/state/queries/post-feed'
import {
- usePreferencesQuery,
+ usePreferences,
type UsePreferencesQueryResponse,
} from '#/state/queries/preferences'
import {useResolveUriQuery} from '#/state/queries/resolve-uri'
@@ -67,7 +67,7 @@ function ProfileListScreenInner(props: Props) {
const {data: resolvedUri, error: resolveError} = useResolveUriQuery(
AtUri.make(handleOrDid, 'app.bsky.graph.list', rkey).toString(),
)
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {data: list, error: listError} = useListQuery(resolvedUri?.uri)
const moderationOpts = useModerationOpts()
diff --git a/src/screens/SavedFeeds.tsx b/src/screens/SavedFeeds.tsx
index e2629651ec..e799fb7412 100644
--- a/src/screens/SavedFeeds.tsx
+++ b/src/screens/SavedFeeds.tsx
@@ -20,7 +20,7 @@ import {logger} from '#/logger'
import {useA11y} from '#/state/a11y'
import {
useOverwriteSavedFeedsMutation,
- usePreferencesQuery,
+ usePreferences,
} from '#/state/queries/preferences'
import {type UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
import {useSetMinimalShellMode} from '#/state/shell'
@@ -47,7 +47,7 @@ import {Text} from '#/components/Typography'
type Props = NativeStackScreenProps
export function SavedFeeds({}: Props) {
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {screenReaderEnabled} = useA11y()
if (!preferences) {
return
diff --git a/src/screens/Search/Explore.tsx b/src/screens/Search/Explore.tsx
index 1129dca35b..b549bd5ec7 100644
--- a/src/screens/Search/Explore.tsx
+++ b/src/screens/Search/Explore.tsx
@@ -257,8 +257,7 @@ export function Explore({
fetchNextPage: fetchNextFeedsPage,
} = useGetPopularFeedsQuery({limit: 10, enabled: useFullExperience})
const interestsNux = useNux(Nux.ExploreInterestsCard)
- const showInterestsNux =
- interestsNux.status === 'ready' && !interestsNux.nux?.completed
+ const showInterestsNux = !interestsNux.nux?.completed
const {
data: suggestedSPs,
diff --git a/src/screens/Search/modules/ExploreInterestsCard.tsx b/src/screens/Search/modules/ExploreInterestsCard.tsx
index 4843075b90..40bb12d45a 100644
--- a/src/screens/Search/modules/ExploreInterestsCard.tsx
+++ b/src/screens/Search/modules/ExploreInterestsCard.tsx
@@ -6,7 +6,7 @@ import {Trans} from '@lingui/react/macro'
import {useInterestsDisplayNames} from '#/lib/interests'
import {Nux, useSaveNux} from '#/state/queries/nuxs'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {atoms as a, useTheme} from '#/alf'
import {Button, ButtonIcon, ButtonText} from '#/components/Button'
import {Shapes_Stroke2_Corner0_Rounded as Shapes} from '#/components/icons/Shapes'
@@ -18,7 +18,7 @@ import {Text} from '#/components/Typography'
export function ExploreInterestsCard() {
const t = useTheme()
const {_} = useLingui()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const interestsDisplayNames = useInterestsDisplayNames()
const {mutateAsync: saveNux} = useSaveNux()
const trendingPrompt = Prompt.usePromptControl()
diff --git a/src/screens/Search/modules/ExploreSuggestedAccounts.tsx b/src/screens/Search/modules/ExploreSuggestedAccounts.tsx
index 438d7c2a37..084cb7e3cf 100644
--- a/src/screens/Search/modules/ExploreSuggestedAccounts.tsx
+++ b/src/screens/Search/modules/ExploreSuggestedAccounts.tsx
@@ -7,7 +7,7 @@ import {type InfiniteData} from '@tanstack/react-query'
import {popularInterests, useInterestsDisplayNames} from '#/lib/interests'
import {logger} from '#/logger'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {BlockDrawerGesture} from '#/view/shell/BlockDrawerGesture'
import {atoms as a, useTheme} from '#/alf'
import {boostInterests, InterestTabs} from '#/components/InterestTabs'
@@ -64,7 +64,7 @@ export function SuggestedAccountsTabBar({
const {_} = useLingui()
const ax = useAnalytics()
const interestsDisplayNames = useInterestsDisplayNames()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const personalizedInterests = preferences?.interests?.tags
const interests = Object.keys(interestsDisplayNames)
.sort(boostInterests(popularInterests))
diff --git a/src/screens/Settings/FollowingFeedPreferences.tsx b/src/screens/Settings/FollowingFeedPreferences.tsx
index 6fa0e2fc37..d622350033 100644
--- a/src/screens/Settings/FollowingFeedPreferences.tsx
+++ b/src/screens/Settings/FollowingFeedPreferences.tsx
@@ -7,7 +7,7 @@ import {
type NativeStackScreenProps,
} from '#/lib/routes/types'
import {
- usePreferencesQuery,
+ usePreferences,
useSetFeedViewPreferencesMutation,
} from '#/state/queries/preferences'
import {atoms as a} from '#/alf'
@@ -27,7 +27,7 @@ type Props = NativeStackScreenProps<
export function FollowingFeedPreferencesScreen({}: Props) {
const {_} = useLingui()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {mutate: setFeedViewPref, variables} =
useSetFeedViewPreferencesMutation()
diff --git a/src/screens/Settings/InterestsSettings.tsx b/src/screens/Settings/InterestsSettings.tsx
index 8224bb133e..3eb4a8d643 100644
--- a/src/screens/Settings/InterestsSettings.tsx
+++ b/src/screens/Settings/InterestsSettings.tsx
@@ -13,10 +13,7 @@ import {
useInterestsDisplayNames,
} from '#/lib/interests'
import {type CommonNavigatorParams} from '#/lib/routes/types'
-import {
- preferencesQueryKey,
- usePreferencesQuery,
-} from '#/state/queries/preferences'
+import {preferencesQueryKey, usePreferences} from '#/state/queries/preferences'
import {type UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
import {createGetSuggestedFeedsQueryKey} from '#/state/queries/trending/useGetSuggestedFeedsQuery'
import {createGetSuggestedUsersQueryKey} from '#/state/queries/trending/useGetSuggestedUsersQuery'
@@ -35,7 +32,6 @@ type Props = NativeStackScreenProps
export function InterestsSettingsScreen({}: Props) {
const t = useTheme()
const gutters = useGutters(['base'])
- const {data: preferences} = usePreferencesQuery()
const [isSaving, setIsSaving] = useState(false)
return (
@@ -65,26 +61,15 @@ export function InterestsSettingsScreen({}: Props) {
- {preferences ? (
-
- ) : (
-
-
-
- )}
+
)
}
-function Inner({
- preferences,
- setIsSaving,
-}: {
- preferences: UsePreferencesQueryResponse
- setIsSaving: (isSaving: boolean) => void
-}) {
+function Inner({setIsSaving}: {setIsSaving: (isSaving: boolean) => void}) {
+ const preferences = usePreferences()
const {_} = useLingui()
const agent = useAgent()
const qc = useQueryClient()
diff --git a/src/state/preferences/feed-tuners.tsx b/src/state/preferences/feed-tuners.tsx
index feeab6f9af..3b42dc7251 100644
--- a/src/state/preferences/feed-tuners.tsx
+++ b/src/state/preferences/feed-tuners.tsx
@@ -1,14 +1,14 @@
import {useMemo} from 'react'
import {FeedTuner} from '#/lib/api/feed-manip'
-import {type FeedDescriptor} from '../queries/post-feed'
-import {usePreferencesQuery} from '../queries/preferences'
-import {useSession} from '../session'
+import {type FeedDescriptor} from '#/state/queries/post-feed'
+import {usePreferences} from '#/state/queries/preferences'
+import {useSession} from '#/state/session'
import {useLanguagePrefs} from './languages'
export function useFeedTuners(feedDesc: FeedDescriptor) {
const langPrefs = useLanguagePrefs()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {currentAccount} = useSession()
return useMemo(() => {
diff --git a/src/state/preferences/moderation-opts.tsx b/src/state/preferences/moderation-opts.tsx
index a6e36b7d2b..e9f8749afe 100644
--- a/src/state/preferences/moderation-opts.tsx
+++ b/src/state/preferences/moderation-opts.tsx
@@ -2,9 +2,9 @@ import {createContext, useContext, useMemo} from 'react'
import {BskyAgent, type ModerationOpts} from '@atproto/api'
import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation'
import {useSession} from '#/state/session'
-import {usePreferencesQuery} from '../queries/preferences'
export const moderationOptsContext = createContext(
undefined,
@@ -24,12 +24,12 @@ export function useModerationOpts() {
export function Provider({children}: React.PropsWithChildren<{}>) {
const override = useContext(moderationOptsOverrideContext)
const {currentAccount} = useSession()
- const prefs = usePreferencesQuery()
+ const preferences = usePreferences()
const {labelDefs} = useLabelDefinitions()
const hiddenPosts = useHiddenPosts() // TODO move this into pds-stored prefs
const userDid = currentAccount?.did
- const moderationPrefs = prefs.data?.moderationPrefs
+ const moderationPrefs = preferences?.moderationPrefs
const value = useMemo(() => {
if (override) {
return override
diff --git a/src/state/queries/explore-feed-previews.tsx b/src/state/queries/explore-feed-previews.tsx
index acbc4ee7e1..155df0aea2 100644
--- a/src/state/queries/explore-feed-previews.tsx
+++ b/src/state/queries/explore-feed-previews.tsx
@@ -22,7 +22,7 @@ import {
type FeedPostSlice,
type FeedPostSliceItem,
} from '#/state/queries/post-feed'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {
didOrHandleUriMatches,
embedViewRecordToPostView,
@@ -122,7 +122,7 @@ export function useFeedPreviews(
const uris = feeds.map(feed => feed.uri)
const {_} = useLingui()
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const userInterests = aggregateUserInterests(preferences)
const moderationOpts = useModerationOpts()
const enabled = feeds.length > 0 && isEnabled
diff --git a/src/state/queries/feed.ts b/src/state/queries/feed.ts
index c2b173b5ce..12b9759c62 100644
--- a/src/state/queries/feed.ts
+++ b/src/state/queries/feed.ts
@@ -22,16 +22,16 @@ import {
import {DISCOVER_FEED_URI, DISCOVER_SAVED_FEED} from '#/lib/constants'
import {sanitizeDisplayName} from '#/lib/strings/display-names'
import {sanitizeHandle} from '#/lib/strings/handles'
+import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {
PERSISTED_QUERY_GCTIME,
PERSISTED_QUERY_ROOT,
STALE,
} from '#/state/queries'
import {RQKEY as listQueryKey} from '#/state/queries/list'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent, useSession} from '#/state/session'
import {router} from '#/routes'
-import {useModerationOpts} from '../preferences/moderation-opts'
import {type FeedDescriptor} from './post-feed'
import {precacheResolvedUri} from './resolve-uri'
@@ -227,7 +227,7 @@ export function useGetPopularFeedsQuery(options?: GetPopularFeedsOptions) {
const {hasSession} = useSession()
const agent = useAgent()
const limit = options?.limit || 10
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const queryClient = useQueryClient()
const moderationOpts = useModerationOpts()
@@ -424,7 +424,7 @@ const createPinnedFeedInfosQueryKeyRoot = (
export function usePinnedFeedsInfos() {
const {hasSession} = useSession()
const agent = useAgent()
- const {data: preferences, isLoading: isLoadingPrefs} = usePreferencesQuery()
+ const preferences = usePreferences()
const pinnedItems = preferences?.savedFeeds.filter(feed => feed.pinned) ?? []
return useQuery({
@@ -434,7 +434,6 @@ export function usePinnedFeedsInfos() {
),
gcTime: PERSISTED_QUERY_GCTIME,
staleTime: STALE.INFINITY,
- enabled: !isLoadingPrefs,
queryFn: async () => {
if (!hasSession) {
return [PWI_DISCOVER_FEED_STUB]
@@ -531,7 +530,7 @@ export type SavedFeedItem =
export function useSavedFeeds() {
const agent = useAgent()
- const {data: preferences, isLoading: isLoadingPrefs} = usePreferencesQuery()
+ const preferences = usePreferences()
const savedItems = preferences?.savedFeeds ?? []
const queryClient = useQueryClient()
@@ -542,7 +541,6 @@ export function useSavedFeeds() {
),
gcTime: PERSISTED_QUERY_GCTIME,
staleTime: STALE.INFINITY,
- enabled: !isLoadingPrefs,
placeholderData: previousData => {
return (
previousData || {
diff --git a/src/state/queries/labeler.ts b/src/state/queries/labeler.ts
index 9bf4372739..fa6303ac40 100644
--- a/src/state/queries/labeler.ts
+++ b/src/state/queries/labeler.ts
@@ -8,10 +8,7 @@ import {
PERSISTED_QUERY_ROOT,
STALE,
} from '#/state/queries'
-import {
- preferencesQueryKey,
- usePreferencesQuery,
-} from '#/state/queries/preferences'
+import {preferencesQueryKey, usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
const labelerInfoQueryKeyRoot = 'labeler-info'
@@ -101,7 +98,7 @@ export function useRemoveLabelersMutation() {
export function useLabelerSubscriptionMutation() {
const queryClient = useQueryClient()
const agent = useAgent()
- const preferences = usePreferencesQuery()
+ const preferences = usePreferences()
return useMutation({
async mutationFn({did, subscribe}: {did: string; subscribe: boolean}) {
diff --git a/src/state/queries/nuxs/index.ts b/src/state/queries/nuxs/index.ts
index b9650d0579..bcb8444581 100644
--- a/src/state/queries/nuxs/index.ts
+++ b/src/state/queries/nuxs/index.ts
@@ -2,44 +2,29 @@ import {useMutation, useQueryClient} from '@tanstack/react-query'
import {type AppNux, type Nux} from '#/state/queries/nuxs/definitions'
import {parseAppNux, serializeAppNux} from '#/state/queries/nuxs/util'
-import {
- preferencesQueryKey,
- usePreferencesQuery,
-} from '#/state/queries/preferences'
+import {preferencesQueryKey, usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export {Nux} from '#/state/queries/nuxs/definitions'
-export function useNuxs():
- | {
- nuxs: AppNux[]
- status: 'ready'
+export function useNuxs(): {
+ nuxs: AppNux[]
+} {
+ const preferences = usePreferences()
+
+ const nuxs = preferences?.bskyAppState?.nuxs
+ ?.map(parseAppNux)
+ ?.filter(Boolean) as AppNux[]
+
+ if (nuxs) {
+ return {
+ nuxs,
}
- | {
- nuxs: undefined
- status: 'loading' | 'error'
- } {
- const {data, isSuccess, isError} = usePreferencesQuery()
- const status = isSuccess ? 'ready' : isError ? 'error' : 'loading'
-
- if (status === 'ready') {
- const nuxs = data?.bskyAppState?.nuxs
- ?.map(parseAppNux)
- ?.filter(Boolean) as AppNux[]
-
- if (nuxs) {
- return {
- nuxs,
- status,
- }
- } else {
- return {
- nuxs: [],
- status,
- }
+ } else {
+ return {
+ nuxs: [],
}
}
-
// if (__DEV__) {
// const queryClient = useQueryClient()
// const agent = useAgent()
@@ -53,46 +38,26 @@ export function useNuxs():
// })
// }
// }
-
- return {
- nuxs: undefined,
- status,
- }
}
export function useNux(
id: T,
-):
- | {
- nux: Extract | undefined
- status: 'ready'
+): {
+ nux: Extract | undefined
+} {
+ const {nuxs} = useNuxs()
+
+ const nux = nuxs.find(nux => nux.id === id)
+
+ if (nux) {
+ return {
+ nux: nux as Extract,
}
- | {
- nux: undefined
- status: 'loading' | 'error'
- } {
- const {nuxs, status} = useNuxs()
-
- if (status === 'ready') {
- const nux = nuxs.find(nux => nux.id === id)
-
- if (nux) {
- return {
- nux: nux as Extract,
- status,
- }
- } else {
- return {
- nux: undefined,
- status,
- }
+ } else {
+ return {
+ nux: undefined,
}
}
-
- return {
- nux: undefined,
- status,
- }
}
export function useSaveNux() {
diff --git a/src/state/queries/post-feed.ts b/src/state/queries/post-feed.ts
index 2fbb9e7cbe..84d3ad3754 100644
--- a/src/state/queries/post-feed.ts
+++ b/src/state/queries/post-feed.ts
@@ -31,14 +31,14 @@ import {aggregateUserInterests} from '#/lib/api/feed/utils'
import {FeedTuner, type FeedTunerFn} from '#/lib/api/feed-manip'
import {DISCOVER_FEED_URI} from '#/lib/constants'
import {logger} from '#/logger'
+import {useFeedTuners} from '#/state/preferences/feed-tuners'
+import {useModerationOpts} from '#/state/preferences/moderation-opts'
import {STALE} from '#/state/queries'
+import {usePreferences} from '#/state/queries/preferences'
import {DEFAULT_LOGGED_OUT_PREFERENCES} from '#/state/queries/preferences/const'
import {useAgent} from '#/state/session'
import * as userActionHistory from '#/state/userActionHistory'
import {KnownError} from '#/view/com/posts/PostFeedErrorMessage'
-import {useFeedTuners} from '../preferences/feed-tuners'
-import {useModerationOpts} from '../preferences/moderation-opts'
-import {usePreferencesQuery} from './preferences'
import {
didOrHandleUriMatches,
embedViewRecordToPostView,
@@ -133,7 +133,7 @@ export function usePostFeedQuery(
) {
const feedTuners = useFeedTuners(feedDesc)
const moderationOpts = useModerationOpts()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
/**
* Load bearing: we need to await AA state or risk FOUC. This marginally
* delays feeds, but AA state is fetched immediately on load and is then
diff --git a/src/state/queries/preferences/context.tsx b/src/state/queries/preferences/context.tsx
new file mode 100644
index 0000000000..17dde5ce3d
--- /dev/null
+++ b/src/state/queries/preferences/context.tsx
@@ -0,0 +1,31 @@
+import {createContext, useContext} from 'react'
+import {ActivityIndicator, View} from 'react-native'
+
+import {
+ usePreferencesQuery,
+ type UsePreferencesQueryResponse,
+} from '#/state/queries/preferences'
+import {atoms as a} from '#/alf'
+
+const PreferencesContext = createContext(
+ null,
+)
+PreferencesContext.displayName = 'PreferencesContext'
+
+export function Provider({children}: {children: React.ReactNode}) {
+ const {data} = usePreferencesQuery()
+
+ if (!data) {
+ return null
+ }
+
+ return {children}
+}
+
+export function usePreferences() {
+ const context = useContext(PreferencesContext)
+ if (!context) {
+ throw new Error('usePreferences must be used within a PreferencesProvider')
+ }
+ return context
+}
diff --git a/src/state/queries/preferences/index.ts b/src/state/queries/preferences/index.ts
index e78a5d73f1..7595f8da89 100644
--- a/src/state/queries/preferences/index.ts
+++ b/src/state/queries/preferences/index.ts
@@ -30,6 +30,7 @@ import {makeAgeRestrictedModerationPrefs} from '#/ageAssurance/util'
import {useAnalytics} from '#/analytics'
export * from '#/state/queries/preferences/const'
+export * from '#/state/queries/preferences/context'
export * from '#/state/queries/preferences/moderation'
export * from '#/state/queries/preferences/types'
@@ -39,7 +40,7 @@ export function usePreferencesQuery() {
const agent = useAgent()
const aa = useAgeAssurance()
- const query = useQuery({
+ return useQuery({
staleTime: STALE.SECONDS.FIFTEEN,
structuralSharing: replaceEqualDeep,
refetchOnWindowFocus: true,
@@ -52,7 +53,7 @@ export function usePreferencesQuery() {
const res = await agent.getPreferences()
// save to local storage to ensure there are labels on initial requests
- saveLabelers(
+ void saveLabelers(
agent.did,
res.moderationPrefs.labelers.map(l => l.did),
)
@@ -91,20 +92,21 @@ export function usePreferencesQuery() {
),
}
}
+
+ /**
+ * The persisted query cache stores dates as strings, but our code expects a `Date`.
+ */
+ if (data.birthDate) {
+ return {
+ ...data,
+ birthDate: new Date(data.birthDate),
+ }
+ }
return data
},
[aa],
),
})
-
- if (query.data?.birthDate) {
- /**
- * The persisted query cache stores dates as strings, but our code expects a `Date`.
- */
- query.data.birthDate = new Date(query.data.birthDate)
- }
-
- return query
}
export function useClearPreferencesMutation() {
diff --git a/src/state/queries/preferences/moderation.ts b/src/state/queries/preferences/moderation.ts
index 1c0f5a3fe5..9a4a1248a6 100644
--- a/src/state/queries/preferences/moderation.ts
+++ b/src/state/queries/preferences/moderation.ts
@@ -7,7 +7,7 @@ import {
import {isNonConfigurableModerationAuthority} from '#/state/session/additional-moderation-authorities'
import {useLabelersDetailedInfoQuery} from '../labeler'
-import {usePreferencesQuery} from './index'
+import {usePreferences} from './index'
/**
* More strict than our default settings for logged in users.
@@ -22,28 +22,18 @@ export function useMyLabelersQuery({
}: {
excludeNonConfigurableLabelers?: boolean
} = {}) {
- const prefs = usePreferencesQuery()
+ const preferences = usePreferences()
let dids = Array.from(
new Set(
BskyAgent.appLabelers.concat(
- prefs.data?.moderationPrefs.labelers.map(l => l.did) || [],
+ preferences?.moderationPrefs.labelers.map(l => l.did) || [],
),
),
)
if (excludeNonConfigurableLabelers) {
dids = dids.filter(did => !isNonConfigurableModerationAuthority(did))
}
- const labelers = useLabelersDetailedInfoQuery({dids})
- const isLoading = prefs.isLoading || labelers.isLoading
- const error = prefs.error || labelers.error
- return useMemo(() => {
- return {
- isLoading,
- error,
- data: labelers.data,
- refetch: labelers.refetch,
- }
- }, [labelers, isLoading, error])
+ return useLabelersDetailedInfoQuery({dids})
}
export function useLabelDefinitionsQuery() {
diff --git a/src/state/queries/preferences/useThreadPreferences.ts b/src/state/queries/preferences/useThreadPreferences.ts
index 629d1c61b8..3f4d1e5505 100644
--- a/src/state/queries/preferences/useThreadPreferences.ts
+++ b/src/state/queries/preferences/useThreadPreferences.ts
@@ -5,7 +5,7 @@ import debounce from 'lodash.debounce'
import {useCallOnce} from '#/lib/once'
import {
- usePreferencesQuery,
+ usePreferences,
useSetThreadViewPreferencesMutation,
} from '#/state/queries/preferences'
import {type ThreadViewPreferences} from '#/state/queries/preferences/types'
@@ -30,7 +30,7 @@ export function useThreadPreferences({
save,
}: {save?: boolean} = {}): ThreadPreferences {
const ax = useAnalytics()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const serverPrefs = preferences?.threadViewPrefs
const once = useCallOnce()
diff --git a/src/state/queries/trending/useGetSuggestedFeedsQuery.ts b/src/state/queries/trending/useGetSuggestedFeedsQuery.ts
index 42d27d9f39..44f5d1dce0 100644
--- a/src/state/queries/trending/useGetSuggestedFeedsQuery.ts
+++ b/src/state/queries/trending/useGetSuggestedFeedsQuery.ts
@@ -6,7 +6,7 @@ import {
} from '#/lib/api/feed/utils'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export const DEFAULT_LIMIT = 15
@@ -15,7 +15,7 @@ export const createGetSuggestedFeedsQueryKey = () => ['suggested-feeds']
export function useGetSuggestedFeedsQuery({enabled}: {enabled?: boolean}) {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const savedFeeds = preferences?.savedFeeds
return useQuery({
diff --git a/src/state/queries/trending/useGetSuggestedOnboardingUsersQuery.ts b/src/state/queries/trending/useGetSuggestedOnboardingUsersQuery.ts
index 0834063371..4f8d7ae4be 100644
--- a/src/state/queries/trending/useGetSuggestedOnboardingUsersQuery.ts
+++ b/src/state/queries/trending/useGetSuggestedOnboardingUsersQuery.ts
@@ -8,7 +8,7 @@ import {createBskyTopicsHeader} from '#/lib/api/feed/utils'
import {logger} from '#/logger'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export type QueryProps = {
@@ -31,7 +31,7 @@ export const createGetSuggestedOnboardingUsersQueryKey = (
export function useGetSuggestedOnboardingUsersQuery(props: QueryProps) {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
return useQuery({
enabled: !!preferences && props.enabled !== false,
diff --git a/src/state/queries/trending/useGetSuggestedUsersQuery.ts b/src/state/queries/trending/useGetSuggestedUsersQuery.ts
index 30090b9a54..e7ab843f7f 100644
--- a/src/state/queries/trending/useGetSuggestedUsersQuery.ts
+++ b/src/state/queries/trending/useGetSuggestedUsersQuery.ts
@@ -11,7 +11,7 @@ import {
import {logger} from '#/logger'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export type QueryProps = {
@@ -29,7 +29,7 @@ export const createGetSuggestedUsersQueryKey = (props: QueryProps) => [
export function useGetSuggestedUsersQuery(props: QueryProps) {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
return useQuery({
enabled: !!preferences && props.enabled !== false,
diff --git a/src/state/queries/trending/useGetTrendsQuery.ts b/src/state/queries/trending/useGetTrendsQuery.ts
index c670802aa7..5ca41685d0 100644
--- a/src/state/queries/trending/useGetTrendsQuery.ts
+++ b/src/state/queries/trending/useGetTrendsQuery.ts
@@ -8,7 +8,7 @@ import {
} from '#/lib/api/feed/utils'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export const DEFAULT_LIMIT = 5
@@ -17,7 +17,7 @@ export const createGetTrendsQueryKey = () => ['trends']
export function useGetTrendsQuery() {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const mutedWords = useMemo(() => {
return preferences?.moderationPrefs?.mutedWords || []
}, [preferences?.moderationPrefs])
diff --git a/src/state/queries/trending/useTrendingTopics.ts b/src/state/queries/trending/useTrendingTopics.ts
index 81b25e5f94..5fecbe5acb 100644
--- a/src/state/queries/trending/useTrendingTopics.ts
+++ b/src/state/queries/trending/useTrendingTopics.ts
@@ -3,7 +3,7 @@ import {type AppBskyUnspeccedDefs, hasMutedWord} from '@atproto/api'
import {useQuery} from '@tanstack/react-query'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export type TrendingTopic = AppBskyUnspeccedDefs.TrendingTopic
@@ -28,7 +28,7 @@ export const trendingTopicsQueryKey = ['trending-topics']
export function useTrendingTopics() {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const mutedWords = useMemo(
() => preferences?.moderationPrefs?.mutedWords ?? [],
[preferences?.moderationPrefs?.mutedWords],
diff --git a/src/state/queries/useOnboardingSuggestedStarterPacksQuery.ts b/src/state/queries/useOnboardingSuggestedStarterPacksQuery.ts
index 5e76ebf100..3c4f9e5692 100644
--- a/src/state/queries/useOnboardingSuggestedStarterPacksQuery.ts
+++ b/src/state/queries/useOnboardingSuggestedStarterPacksQuery.ts
@@ -6,7 +6,7 @@ import {
} from '#/lib/api/feed/utils'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export const createOnboardingSuggestedStarterPacksQueryKey = (
@@ -21,7 +21,7 @@ export function useOnboardingSuggestedStarterPacksQuery({
overrideInterests?: string[]
}) {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const contentLangs = getContentLanguages().join(',')
return useQuery({
diff --git a/src/state/queries/useSuggestedStarterPacksQuery.ts b/src/state/queries/useSuggestedStarterPacksQuery.ts
index 6cb1dd0869..95df73697f 100644
--- a/src/state/queries/useSuggestedStarterPacksQuery.ts
+++ b/src/state/queries/useSuggestedStarterPacksQuery.ts
@@ -6,7 +6,7 @@ import {
} from '#/lib/api/feed/utils'
import {getContentLanguages} from '#/state/preferences/languages'
import {STALE} from '#/state/queries'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useAgent} from '#/state/session'
export const createSuggestedStarterPacksQueryKey = (interests?: string[]) => [
@@ -22,7 +22,7 @@ export function useSuggestedStarterPacksQuery({
overrideInterests?: string[]
}) {
const agent = useAgent()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const contentLangs = getContentLanguages().join(',')
return useQuery({
diff --git a/src/state/shell/progress-guide.tsx b/src/state/shell/progress-guide.tsx
index b6ebf4621b..4cc50889d3 100644
--- a/src/state/shell/progress-guide.tsx
+++ b/src/state/shell/progress-guide.tsx
@@ -8,7 +8,7 @@ import {
} from '#/components/ProgressGuide/Toast'
import {useAnalytics} from '#/analytics'
import {
- usePreferencesQuery,
+ usePreferences,
useSetActiveProgressGuideMutation,
} from '../queries/preferences'
@@ -73,7 +73,7 @@ export function useProgressGuideControls() {
export function Provider({children}: React.PropsWithChildren<{}>) {
const ax = useAnalytics()
const {_} = useLingui()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {mutateAsync, variables, isPending} =
useSetActiveProgressGuideMutation()
diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx
index 2d076690d2..8844b4791a 100644
--- a/src/view/com/composer/Composer.tsx
+++ b/src/view/com/composer/Composer.tsx
@@ -95,7 +95,7 @@ import {
useLanguagePrefs,
useLanguagePrefsApi,
} from '#/state/preferences/languages'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {useProfileQuery} from '#/state/queries/profile'
import {type Gif} from '#/state/queries/tenor'
import {useAgent, useSession} from '#/state/session'
@@ -213,7 +213,7 @@ export const ComposePost = ({
const {mutate: cleanupPublishedDraft} = useCleanupPublishedDraftMutation()
const {closeAllDialogs} = useDialogStateControlContext()
const {closeAllModals} = useModalControls()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const navigation = useNavigation()
const [isKeyboardVisible] = useIsKeyboardVisible({iosUseWillEvents: true})
diff --git a/src/view/com/composer/threadgate/ThreadgateBtn.tsx b/src/view/com/composer/threadgate/ThreadgateBtn.tsx
index 745e9d5d2e..875cfcaa97 100644
--- a/src/view/com/composer/threadgate/ThreadgateBtn.tsx
+++ b/src/view/com/composer/threadgate/ThreadgateBtn.tsx
@@ -11,7 +11,7 @@ import {isNetworkError} from '#/lib/strings/errors'
import {logger} from '#/logger'
import {usePostInteractionSettingsMutation} from '#/state/queries/post-interaction-settings'
import {createPostgateRecord} from '#/state/queries/postgate/util'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {
type ThreadgateAllowUISetting,
threadgateAllowUISettingToAllowRecordValue,
@@ -65,7 +65,7 @@ export function ThreadgateBtn({
setShowTooltip(false)
}
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const [persist, setPersist] = useState(false)
const onPress = () => {
diff --git a/src/view/com/feeds/ProfileFeedgens.tsx b/src/view/com/feeds/ProfileFeedgens.tsx
index 6eedcd8622..6dde276349 100644
--- a/src/view/com/feeds/ProfileFeedgens.tsx
+++ b/src/view/com/feeds/ProfileFeedgens.tsx
@@ -20,8 +20,8 @@ import {useQueryClient} from '@tanstack/react-query'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
-import {usePreferencesQuery} from '#/state/queries/preferences'
-import {RQKEY, useProfileFeedgensQuery} from '#/state/queries/profile-feedgens'
+import {usePreferences} from '#/state/queries/preferences'
+import {RQKEY, useProfileFeedgens} from '#/state/queries/profile-feedgens'
import {useSession} from '#/state/session'
import {EmptyState} from '#/view/com/util/EmptyState'
import {ErrorMessage} from '#/view/com/util/error/ErrorMessage'
@@ -80,7 +80,7 @@ export function ProfileFeedgens({
refetch,
} = useProfileFeedgensQuery(did, opts)
const isEmpty = !isPending && !data?.pages[0]?.feeds.length
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const navigation = useNavigation()
const {currentAccount} = useSession()
const isSelf = currentAccount?.did === did
diff --git a/src/view/com/lists/ProfileLists.tsx b/src/view/com/lists/ProfileLists.tsx
index c175793624..11960469a7 100644
--- a/src/view/com/lists/ProfileLists.tsx
+++ b/src/view/com/lists/ProfileLists.tsx
@@ -20,8 +20,8 @@ import {useQueryClient} from '@tanstack/react-query'
import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger'
-import {usePreferencesQuery} from '#/state/queries/preferences'
-import {RQKEY, useProfileListsQuery} from '#/state/queries/profile-lists'
+import {usePreferences} from '#/state/queries/preferences'
+import {RQKEY, useProfileListsQuerry} from '#/state/queries/profile-lists'
import {useSession} from '#/state/session'
import {EmptyState} from '#/view/com/util/EmptyState'
import {ErrorMessage} from '#/view/com/util/error/ErrorMessage'
@@ -80,7 +80,7 @@ export function ProfileLists({
refetch,
} = useProfileListsQuery(did, opts)
const isEmpty = !isPending && !data?.pages[0]?.lists.length
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const navigation = useNavigation()
const {currentAccount} = useSession()
const isSelf = currentAccount?.did === did
diff --git a/src/view/com/posts/FeedShutdownMsg.tsx b/src/view/com/posts/FeedShutdownMsg.tsx
index 459cb5870e..7a7c2f4a20 100644
--- a/src/view/com/posts/FeedShutdownMsg.tsx
+++ b/src/view/com/posts/FeedShutdownMsg.tsx
@@ -7,7 +7,7 @@ import {Trans} from '@lingui/react/macro'
import {PROD_DEFAULT_FEED} from '#/lib/constants'
import {logger} from '#/logger'
import {
- usePreferencesQuery,
+ usePreferences,
useRemoveFeedMutation,
useReplaceForYouWithDiscoverFeedMutation,
} from '#/state/queries/preferences'
@@ -23,7 +23,7 @@ export function FeedShutdownMsg({feedUri}: {feedUri: string}) {
const t = useTheme()
const {_} = useLingui()
const setSelectedFeed = useSetSelectedFeed()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {mutateAsync: removeFeed, isPending: isRemovePending} =
useRemoveFeedMutation()
const {mutateAsync: replaceFeedWithDiscover, isPending: isReplacePending} =
diff --git a/src/view/com/profile/ProfileMenu.tsx b/src/view/com/profile/ProfileMenu.tsx
index 51edee1903..3197dd2cd5 100644
--- a/src/view/com/profile/ProfileMenu.tsx
+++ b/src/view/com/profile/ProfileMenu.tsx
@@ -88,11 +88,7 @@ let ProfileMenu = ({
const {canGoLive} = useLiveNowConfig()
const status = useActorStatus(profile)
const statusNudge = useNux(Nux.LiveNowBetaNudge)
- const statusNudgeActive =
- isSelf &&
- canGoLive &&
- statusNudge.status === 'ready' &&
- !statusNudge.nux?.completed
+ const statusNudgeActive = isSelf && canGoLive && !statusNudge.nux?.completed
const {mutate: saveNux} = useSaveNux()
const [queueMute, queueUnmute] = useProfileMuteMutationQueue(profile)
diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx
index 12771d2c1f..faf0f0e981 100644
--- a/src/view/screens/Home.tsx
+++ b/src/view/screens/Home.tsx
@@ -17,7 +17,7 @@ import {
usePinnedFeedsInfos,
} from '#/state/queries/feed'
import {type FeedDescriptor, type FeedParams} from '#/state/queries/post-feed'
-import {usePreferencesQuery} from '#/state/queries/preferences'
+import {usePreferences} from '#/state/queries/preferences'
import {type UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
import {useSession} from '#/state/session'
import {useSetMinimalShellMode} from '#/state/shell'
@@ -42,7 +42,7 @@ import {useDemoMode} from '#/storage/hooks/demo-mode'
type Props = NativeStackScreenProps
export function HomeScreen(props: Props) {
const {setShowLoggedOut} = useLoggedOutViewControls()
- const {data: preferences} = usePreferencesQuery()
+ const preferences = usePreferences()
const {currentAccount} = useSession()
const {data: pinnedFeedInfos, isLoading: isPinnedFeedsLoading} =
usePinnedFeedsInfos()