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()