Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Extract query key roots to constants (#3404)

* Extract query key roots to constants

* Dedupe labelers-detailed-info

* Align naming

authored by

dan and committed by
GitHub
b783745b b26abf21

+198 -139
+3 -2
src/lib/react-query.tsx
··· 11 11 import {isNative} from '#/platform/detection' 12 12 13 13 // any query keys in this array will be persisted to AsyncStorage 14 - const STORED_CACHE_QUERY_KEYS = ['labelers-detailed-info'] 14 + export const labelersDetailedInfoQueryKeyRoot = 'labelers-detailed-info' 15 + const STORED_CACHE_QUERY_KEY_ROOTS = [labelersDetailedInfoQueryKeyRoot] 15 16 16 17 focusManager.setEventListener(onFocus => { 17 18 if (isNative) { ··· 65 66 { 66 67 shouldDehydrateMutation: (_: any) => false, 67 68 shouldDehydrateQuery: query => { 68 - return STORED_CACHE_QUERY_KEYS.includes(String(query.queryKey[0])) 69 + return STORED_CACHE_QUERY_KEY_ROOTS.includes(String(query.queryKey[0])) 69 70 }, 70 71 } 71 72
+7 -6
src/state/queries/actor-autocomplete.ts
··· 1 1 import React from 'react' 2 - import {AppBskyActorDefs, ModerationOpts, moderateProfile} from '@atproto/api' 2 + import {AppBskyActorDefs, moderateProfile, ModerationOpts} from '@atproto/api' 3 3 import {useQuery, useQueryClient} from '@tanstack/react-query' 4 4 5 + import {isJustAMute} from '#/lib/moderation' 6 + import {isInvalidHandle} from '#/lib/strings/handles' 5 7 import {logger} from '#/logger' 8 + import {STALE} from '#/state/queries' 9 + import {useMyFollowsQuery} from '#/state/queries/my-follows' 6 10 import {getAgent} from '#/state/session' 7 - import {useMyFollowsQuery} from '#/state/queries/my-follows' 8 - import {STALE} from '#/state/queries' 9 11 import {DEFAULT_LOGGED_OUT_PREFERENCES, useModerationOpts} from './preferences' 10 - import {isInvalidHandle} from '#/lib/strings/handles' 11 - import {isJustAMute} from '#/lib/moderation' 12 12 13 13 const DEFAULT_MOD_OPTS = { 14 14 userDid: undefined, 15 15 prefs: DEFAULT_LOGGED_OUT_PREFERENCES.moderationPrefs, 16 16 } 17 17 18 - export const RQKEY = (prefix: string) => ['actor-autocomplete', prefix] 18 + const RQKEY_ROOT = 'actor-autocomplete' 19 + export const RQKEY = (prefix: string) => [RQKEY_ROOT, prefix] 19 20 20 21 export function useActorAutocompleteQuery(prefix: string) { 21 22 const {data: follows, isFetching} = useMyFollowsQuery()
+4 -3
src/state/queries/actor-search.ts
··· 1 1 import {AppBskyActorDefs} from '@atproto/api' 2 2 import {QueryClient, useQuery} from '@tanstack/react-query' 3 3 4 - import {getAgent} from '#/state/session' 5 4 import {STALE} from '#/state/queries' 5 + import {getAgent} from '#/state/session' 6 6 7 - export const RQKEY = (prefix: string) => ['actor-search', prefix] 7 + const RQKEY_ROOT = 'actor-search' 8 + export const RQKEY = (prefix: string) => [RQKEY_ROOT, prefix] 8 9 9 10 export function useActorSearch(prefix: string) { 10 11 return useQuery<AppBskyActorDefs.ProfileView[]>({ ··· 26 27 ) { 27 28 const queryDatas = queryClient.getQueriesData<AppBskyActorDefs.ProfileView[]>( 28 29 { 29 - queryKey: ['actor-search'], 30 + queryKey: [RQKEY_ROOT], 30 31 }, 31 32 ) 32 33 for (const [_queryKey, queryData] of queryDatas) {
+3 -2
src/state/queries/app-passwords.ts
··· 1 1 import {ComAtprotoServerCreateAppPassword} from '@atproto/api' 2 - import {useQuery, useQueryClient, useMutation} from '@tanstack/react-query' 2 + import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 3 3 4 4 import {STALE} from '#/state/queries' 5 5 import {getAgent} from '../session' 6 6 7 - export const RQKEY = () => ['app-passwords'] 7 + const RQKEY_ROOT = 'app-passwords' 8 + export const RQKEY = () => [RQKEY_ROOT] 8 9 9 10 export function useAppPasswordsQuery() { 10 11 return useQuery({
+17 -14
src/state/queries/feed.ts
··· 1 1 import { 2 - useQuery, 3 - useInfiniteQuery, 4 - InfiniteData, 5 - QueryKey, 6 - useMutation, 7 - } from '@tanstack/react-query' 8 - import { 9 - AtUri, 10 - RichText, 11 2 AppBskyFeedDefs, 12 3 AppBskyGraphDefs, 13 4 AppBskyUnspeccedGetPopularFeedGenerators, 5 + AtUri, 6 + RichText, 14 7 } from '@atproto/api' 8 + import { 9 + InfiniteData, 10 + QueryKey, 11 + useInfiniteQuery, 12 + useMutation, 13 + useQuery, 14 + } from '@tanstack/react-query' 15 15 16 - import {router} from '#/routes' 17 16 import {sanitizeDisplayName} from '#/lib/strings/display-names' 18 17 import {sanitizeHandle} from '#/lib/strings/handles' 19 - import {getAgent} from '#/state/session' 20 - import {usePreferencesQuery} from '#/state/queries/preferences' 21 18 import {STALE} from '#/state/queries' 19 + import {usePreferencesQuery} from '#/state/queries/preferences' 20 + import {getAgent} from '#/state/session' 21 + import {router} from '#/routes' 22 22 23 23 export type FeedSourceFeedInfo = { 24 24 type: 'feed' ··· 56 56 57 57 export type FeedSourceInfo = FeedSourceFeedInfo | FeedSourceListInfo 58 58 59 + const feedSourceInfoQueryKeyRoot = 'getFeedSourceInfo' 59 60 export const feedSourceInfoQueryKey = ({uri}: {uri: string}) => [ 60 - 'getFeedSourceInfo', 61 + feedSourceInfoQueryKeyRoot, 61 62 uri, 62 63 ] 63 64 ··· 216 217 likeUri: '', 217 218 } 218 219 220 + const pinnedFeedInfosQueryKeyRoot = 'pinnedFeedsInfos' 221 + 219 222 export function usePinnedFeedsInfos() { 220 223 const {data: preferences, isLoading: isLoadingPrefs} = usePreferencesQuery() 221 224 const pinnedUris = preferences?.feeds?.pinned ?? [] ··· 223 226 return useQuery({ 224 227 staleTime: STALE.INFINITY, 225 228 enabled: !isLoadingPrefs, 226 - queryKey: ['pinnedFeedsInfos', pinnedUris.join(',')], 229 + queryKey: [pinnedFeedInfosQueryKeyRoot, pinnedUris.join(',')], 227 230 queryFn: async () => { 228 231 let resolved = new Map() 229 232
+9 -4
src/state/queries/handle.ts
··· 1 1 import React from 'react' 2 - import {useQueryClient, useMutation} from '@tanstack/react-query' 2 + import {useMutation, useQueryClient} from '@tanstack/react-query' 3 3 4 - import {getAgent} from '#/state/session' 5 4 import {STALE} from '#/state/queries' 5 + import {getAgent} from '#/state/session' 6 6 7 - const fetchHandleQueryKey = (handleOrDid: string) => ['handle', handleOrDid] 8 - const fetchDidQueryKey = (handleOrDid: string) => ['did', handleOrDid] 7 + const handleQueryKeyRoot = 'handle' 8 + const fetchHandleQueryKey = (handleOrDid: string) => [ 9 + handleQueryKeyRoot, 10 + handleOrDid, 11 + ] 12 + const didQueryKeyRoot = 'did' 13 + const fetchDidQueryKey = (handleOrDid: string) => [didQueryKeyRoot, handleOrDid] 9 14 10 15 export function useFetchHandle() { 11 16 const queryClient = useQueryClient()
+5 -3
src/state/queries/invites.ts
··· 1 1 import {ComAtprotoServerDefs} from '@atproto/api' 2 2 import {useQuery} from '@tanstack/react-query' 3 3 4 - import {getAgent} from '#/state/session' 5 - import {STALE} from '#/state/queries' 6 4 import {cleanError} from '#/lib/strings/errors' 5 + import {STALE} from '#/state/queries' 6 + import {getAgent} from '#/state/session' 7 7 8 8 function isInviteAvailable(invite: ComAtprotoServerDefs.InviteCode): boolean { 9 9 return invite.available - invite.uses.length > 0 && !invite.disabled 10 10 } 11 11 12 + const inviteCodesQueryKeyRoot = 'inviteCodes' 13 + 12 14 export type InviteCodesQueryResponse = Exclude< 13 15 ReturnType<typeof useInviteCodesQuery>['data'], 14 16 undefined ··· 16 18 export function useInviteCodesQuery() { 17 19 return useQuery({ 18 20 staleTime: STALE.MINUTES.FIVE, 19 - queryKey: ['inviteCodes'], 21 + queryKey: [inviteCodesQueryKeyRoot], 20 22 queryFn: async () => { 21 23 const res = await getAgent() 22 24 .com.atproto.server.getAccountInviteCodes({})
+11 -3
src/state/queries/labeler.ts
··· 2 2 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 3 3 import {z} from 'zod' 4 4 5 + import {labelersDetailedInfoQueryKeyRoot} from '#/lib/react-query' 5 6 import {STALE} from '#/state/queries' 6 7 import {preferencesQueryKey} from '#/state/queries/preferences' 7 8 import {getAgent} from '#/state/session' 8 9 9 - export const labelerInfoQueryKey = (did: string) => ['labeler-info', did] 10 + const labelerInfoQueryKeyRoot = 'labeler-info' 11 + export const labelerInfoQueryKey = (did: string) => [ 12 + labelerInfoQueryKeyRoot, 13 + did, 14 + ] 15 + 16 + const labelersInfoQueryKeyRoot = 'labelers-info' 10 17 export const labelersInfoQueryKey = (dids: string[]) => [ 11 - 'labelers-info', 18 + labelersInfoQueryKeyRoot, 12 19 dids.slice().sort(), 13 20 ] 21 + 14 22 export const labelersDetailedInfoQueryKey = (dids: string[]) => [ 15 - 'labelers-detailed-info', 23 + labelersDetailedInfoQueryKeyRoot, 16 24 dids, 17 25 ] 18 26
+5 -4
src/state/queries/list-members.ts
··· 1 1 import {AppBskyActorDefs, AppBskyGraphGetList} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 - import {getAgent} from '#/state/session' 10 9 import {STALE} from '#/state/queries' 10 + import {getAgent} from '#/state/session' 11 11 12 12 const PAGE_SIZE = 30 13 13 type RQPageParam = string | undefined 14 14 15 - export const RQKEY = (uri: string) => ['list-members', uri] 15 + const RQKEY_ROOT = 'list-members' 16 + export const RQKEY = (uri: string) => [RQKEY_ROOT, uri] 16 17 17 18 export function useListMembersQuery(uri: string) { 18 19 return useInfiniteQuery< ··· 44 45 const queryDatas = queryClient.getQueriesData< 45 46 InfiniteData<AppBskyGraphGetList.OutputSchema> 46 47 >({ 47 - queryKey: ['list-members'], 48 + queryKey: [RQKEY_ROOT], 48 49 }) 49 50 for (const [_queryKey, queryData] of queryDatas) { 50 51 if (!queryData) {
+4 -3
src/state/queries/list-memberships.ts
··· 17 17 import {AtUri} from '@atproto/api' 18 18 import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 19 19 20 - import {useSession, getAgent} from '#/state/session' 21 - import {RQKEY as LIST_MEMBERS_RQKEY} from '#/state/queries/list-members' 22 20 import {STALE} from '#/state/queries' 21 + import {RQKEY as LIST_MEMBERS_RQKEY} from '#/state/queries/list-members' 22 + import {getAgent, useSession} from '#/state/session' 23 23 24 24 // sanity limit is SANITY_PAGE_LIMIT*PAGE_SIZE total records 25 25 const SANITY_PAGE_LIMIT = 1000 26 26 const PAGE_SIZE = 100 27 27 // ...which comes 100,000k list members 28 28 29 - export const RQKEY = () => ['list-memberships'] 29 + const RQKEY_ROOT = 'list-memberships' 30 + export const RQKEY = () => [RQKEY_ROOT] 30 31 31 32 export interface ListMembersip { 32 33 membershipUri: string
+10 -8
src/state/queries/list.ts
··· 1 + import {Image as RNImage} from 'react-native-image-crop-picker' 1 2 import { 2 - AtUri, 3 + AppBskyGraphDefs, 3 4 AppBskyGraphGetList, 4 5 AppBskyGraphList, 5 - AppBskyGraphDefs, 6 + AtUri, 6 7 Facet, 7 8 } from '@atproto/api' 8 - import {Image as RNImage} from 'react-native-image-crop-picker' 9 - import {useQuery, useMutation, useQueryClient} from '@tanstack/react-query' 9 + import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 10 10 import chunk from 'lodash.chunk' 11 - import {useSession, getAgent} from '../session' 12 - import {invalidate as invalidateMyLists} from './my-lists' 13 - import {RQKEY as PROFILE_LISTS_RQKEY} from './profile-lists' 11 + 14 12 import {uploadBlob} from '#/lib/api' 15 13 import {until} from '#/lib/async/until' 16 14 import {STALE} from '#/state/queries' 15 + import {getAgent, useSession} from '../session' 16 + import {invalidate as invalidateMyLists} from './my-lists' 17 + import {RQKEY as PROFILE_LISTS_RQKEY} from './profile-lists' 17 18 18 - export const RQKEY = (uri: string) => ['list', uri] 19 + const RQKEY_ROOT = 'list' 20 + export const RQKEY = (uri: string) => [RQKEY_ROOT, uri] 19 21 20 22 export function useListQuery(uri?: string) { 21 23 return useQuery<AppBskyGraphDefs.ListView, Error>({
+4 -3
src/state/queries/my-blocked-accounts.ts
··· 1 1 import {AppBskyActorDefs, AppBskyGraphGetBlocks} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 9 import {getAgent} from '#/state/session' 10 10 11 - export const RQKEY = () => ['my-blocked-accounts'] 11 + const RQKEY_ROOT = 'my-blocked-accounts' 12 + export const RQKEY = () => [RQKEY_ROOT] 12 13 type RQPageParam = string | undefined 13 14 14 15 export function useMyBlockedAccountsQuery() { ··· 39 40 const queryDatas = queryClient.getQueriesData< 40 41 InfiniteData<AppBskyGraphGetBlocks.OutputSchema> 41 42 >({ 42 - queryKey: ['my-blocked-accounts'], 43 + queryKey: [RQKEY_ROOT], 43 44 }) 44 45 for (const [_queryKey, queryData] of queryDatas) { 45 46 if (!queryData?.pages) {
+4 -2
src/state/queries/my-follows.ts
··· 1 1 import {AppBskyActorDefs} from '@atproto/api' 2 2 import {useQuery} from '@tanstack/react-query' 3 - import {useSession, getAgent} from '../session' 3 + 4 4 import {STALE} from '#/state/queries' 5 + import {getAgent, useSession} from '../session' 5 6 6 7 // sanity limit is SANITY_PAGE_LIMIT*PAGE_SIZE total records 7 8 const SANITY_PAGE_LIMIT = 1000 8 9 const PAGE_SIZE = 100 9 10 // ...which comes 10,000k follows 10 11 11 - export const RQKEY = () => ['my-follows'] 12 + const RQKEY_ROOT = 'my-follows' 13 + export const RQKEY = () => [RQKEY_ROOT] 12 14 13 15 export function useMyFollowsQuery() { 14 16 const {currentAccount} = useSession()
+6 -4
src/state/queries/my-lists.ts
··· 1 1 import {AppBskyGraphDefs} from '@atproto/api' 2 - import {useQuery, QueryClient} from '@tanstack/react-query' 2 + import {QueryClient, useQuery} from '@tanstack/react-query' 3 3 4 4 import {accumulate} from '#/lib/async/accumulate' 5 - import {useSession, getAgent} from '#/state/session' 6 5 import {STALE} from '#/state/queries' 6 + import {getAgent, useSession} from '#/state/session' 7 7 8 8 export type MyListsFilter = 9 9 | 'all' 10 10 | 'curate' 11 11 | 'mod' 12 12 | 'all-including-subscribed' 13 - export const RQKEY = (filter: MyListsFilter) => ['my-lists', filter] 13 + 14 + const RQKEY_ROOT = 'my-lists' 15 + export const RQKEY = (filter: MyListsFilter) => [RQKEY_ROOT, filter] 14 16 15 17 export function useMyListsQuery(filter: MyListsFilter) { 16 18 const {currentAccount} = useSession() ··· 91 93 if (filter) { 92 94 qc.invalidateQueries({queryKey: RQKEY(filter)}) 93 95 } else { 94 - qc.invalidateQueries({queryKey: ['my-lists']}) 96 + qc.invalidateQueries({queryKey: [RQKEY_ROOT]}) 95 97 } 96 98 }
+4 -3
src/state/queries/my-muted-accounts.ts
··· 1 1 import {AppBskyActorDefs, AppBskyGraphGetMutes} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 9 import {getAgent} from '#/state/session' 10 10 11 - export const RQKEY = () => ['my-muted-accounts'] 11 + const RQKEY_ROOT = 'my-muted-accounts' 12 + export const RQKEY = () => [RQKEY_ROOT] 12 13 type RQPageParam = string | undefined 13 14 14 15 export function useMyMutedAccountsQuery() { ··· 39 40 const queryDatas = queryClient.getQueriesData< 40 41 InfiniteData<AppBskyGraphGetMutes.OutputSchema> 41 42 >({ 42 - queryKey: ['my-muted-accounts'], 43 + queryKey: [RQKEY_ROOT], 43 44 }) 44 45 for (const [_queryKey, queryData] of queryDatas) { 45 46 if (!queryData?.pages) {
+11 -9
src/state/queries/notifications/feed.ts
··· 19 19 import {useEffect, useRef} from 'react' 20 20 import {AppBskyFeedDefs} from '@atproto/api' 21 21 import { 22 - useInfiniteQuery, 23 22 InfiniteData, 23 + QueryClient, 24 24 QueryKey, 25 + useInfiniteQuery, 25 26 useQueryClient, 26 - QueryClient, 27 27 } from '@tanstack/react-query' 28 - import {useModerationOpts} from '../preferences' 29 - import {useUnreadNotificationsApi} from './unread' 30 - import {fetchPage} from './util' 31 - import {FeedPage} from './types' 28 + 32 29 import {useMutedThreads} from '#/state/muted-threads' 33 30 import {STALE} from '..' 31 + import {useModerationOpts} from '../preferences' 34 32 import {embedViewRecordToPostView, getEmbeddedPost} from '../util' 33 + import {FeedPage} from './types' 34 + import {useUnreadNotificationsApi} from './unread' 35 + import {fetchPage} from './util' 35 36 36 - export type {NotificationType, FeedNotification, FeedPage} from './types' 37 + export type {FeedNotification, FeedPage, NotificationType} from './types' 37 38 38 39 const PAGE_SIZE = 30 39 40 40 41 type RQPageParam = string | undefined 41 42 43 + const RQKEY_ROOT = 'notification-feed' 42 44 export function RQKEY() { 43 - return ['notification-feed'] 45 + return [RQKEY_ROOT] 44 46 } 45 47 46 48 export function useNotificationFeedQuery(opts?: {enabled?: boolean}) { ··· 138 140 uri: string, 139 141 ): Generator<AppBskyFeedDefs.PostView, void> { 140 142 const queryDatas = queryClient.getQueriesData<InfiniteData<FeedPage>>({ 141 - queryKey: ['notification-feed'], 143 + queryKey: [RQKEY_ROOT], 142 144 }) 143 145 for (const [_queryKey, queryData] of queryDatas) { 144 146 if (!queryData?.pages) {
+4 -3
src/state/queries/post-feed.ts
··· 58 58 59 59 type RQPageParam = {cursor: string | undefined; api: FeedAPI} | undefined 60 60 61 + const RQKEY_ROOT = 'post-feed' 61 62 export function RQKEY(feedDesc: FeedDescriptor, params?: FeedParams) { 62 - return ['post-feed', feedDesc, params || {}] 63 + return [RQKEY_ROOT, feedDesc, params || {}] 63 64 } 64 65 65 66 export interface FeedPostSliceItem { ··· 402 403 const queryDatas = queryClient.getQueriesData< 403 404 InfiniteData<FeedPageUnselected> 404 405 >({ 405 - queryKey: ['post-feed'], 406 + queryKey: [RQKEY_ROOT], 406 407 }) 407 408 for (const [_queryKey, queryData] of queryDatas) { 408 409 if (!queryData?.pages) { ··· 467 468 queryClient.resetQueries({ 468 469 predicate: query => 469 470 !!( 470 - query.queryKey[0] === 'post-feed' && 471 + query.queryKey[0] === RQKEY_ROOT && 471 472 (query.queryKey[1] as string)?.includes(did) 472 473 ), 473 474 })
+4 -3
src/state/queries/post-reposted-by.ts
··· 1 1 import {AppBskyActorDefs, AppBskyFeedGetRepostedBy} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 9 import {getAgent} from '#/state/session' ··· 12 12 type RQPageParam = string | undefined 13 13 14 14 // TODO refactor invalidate on mutate? 15 - export const RQKEY = (resolvedUri: string) => ['post-reposted-by', resolvedUri] 15 + const RQKEY_ROOT = 'post-reposted-by' 16 + export const RQKEY = (resolvedUri: string) => [RQKEY_ROOT, resolvedUri] 16 17 17 18 export function usePostRepostedByQuery(resolvedUri: string | undefined) { 18 19 return useInfiniteQuery< ··· 44 45 const queryDatas = queryClient.getQueriesData< 45 46 InfiniteData<AppBskyFeedGetRepostedBy.OutputSchema> 46 47 >({ 47 - queryKey: ['post-reposted-by'], 48 + queryKey: [RQKEY_ROOT], 48 49 }) 49 50 for (const [_queryKey, queryData] of queryDatas) { 50 51 if (!queryData?.pages) {
+8 -7
src/state/queries/post-thread.ts
··· 1 1 import { 2 + AppBskyEmbedRecord, 2 3 AppBskyFeedDefs, 3 - AppBskyFeedPost, 4 4 AppBskyFeedGetPostThread, 5 - AppBskyEmbedRecord, 5 + AppBskyFeedPost, 6 6 } from '@atproto/api' 7 - import {useQuery, useQueryClient, QueryClient} from '@tanstack/react-query' 7 + import {QueryClient, useQuery, useQueryClient} from '@tanstack/react-query' 8 8 9 + import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' 9 10 import {getAgent} from '#/state/session' 10 - import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' 11 + import {findAllPostsInQueryData as findAllPostsInNotifsQueryData} from './notifications/feed' 11 12 import {findAllPostsInQueryData as findAllPostsInFeedQueryData} from './post-feed' 12 - import {findAllPostsInQueryData as findAllPostsInNotifsQueryData} from './notifications/feed' 13 13 import {precacheThreadPostProfiles} from './profile' 14 14 import {getEmbeddedPost} from './util' 15 15 16 - export const RQKEY = (uri: string) => ['post-thread', uri] 16 + const RQKEY_ROOT = 'post-thread' 17 + export const RQKEY = (uri: string) => [RQKEY_ROOT, uri] 17 18 type ThreadViewNode = AppBskyFeedGetPostThread.OutputSchema['thread'] 18 19 19 20 export interface ThreadCtx { ··· 233 234 uri: string, 234 235 ): Generator<ThreadNode, void> { 235 236 const queryDatas = queryClient.getQueriesData<ThreadNode>({ 236 - queryKey: ['post-thread'], 237 + queryKey: [RQKEY_ROOT], 237 238 }) 238 239 for (const [_queryKey, queryData] of queryDatas) { 239 240 if (!queryData) {
+2 -1
src/state/queries/post.ts
··· 9 9 import {Shadow} from '#/state/cache/types' 10 10 import {getAgent} from '#/state/session' 11 11 12 - export const RQKEY = (postUri: string) => ['post', postUri] 12 + const RQKEY_ROOT = 'post' 13 + export const RQKEY = (postUri: string) => [RQKEY_ROOT, postUri] 13 14 14 15 export function usePostQuery(uri: string | undefined) { 15 16 return useQuery<AppBskyFeedDefs.PostView>({
+17 -16
src/state/queries/preferences/index.ts
··· 1 - import {useMemo, createContext, useContext} from 'react' 2 - import {useQuery, useMutation, useQueryClient} from '@tanstack/react-query' 1 + import {createContext, useContext, useMemo} from 'react' 3 2 import { 4 - LabelPreference, 3 + AppBskyActorDefs, 4 + BSKY_LABELER_DID, 5 5 BskyFeedViewPreference, 6 + LabelPreference, 6 7 ModerationOpts, 7 - AppBskyActorDefs, 8 - BSKY_LABELER_DID, 9 8 } from '@atproto/api' 9 + import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query' 10 10 11 11 import {track} from '#/lib/analytics/analytics' 12 12 import {getAge} from '#/lib/strings/time' 13 - import {getAgent, useSession} from '#/state/session' 14 - import { 15 - UsePreferencesQueryResponse, 16 - ThreadViewPreferences, 17 - } from '#/state/queries/preferences/types' 13 + import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' 14 + import {STALE} from '#/state/queries' 18 15 import { 19 16 DEFAULT_HOME_FEED_PREFS, 20 - DEFAULT_THREAD_VIEW_PREFS, 21 17 DEFAULT_LOGGED_OUT_PREFERENCES, 18 + DEFAULT_THREAD_VIEW_PREFS, 22 19 } from '#/state/queries/preferences/const' 23 20 import {DEFAULT_LOGGED_OUT_LABEL_PREFERENCES} from '#/state/queries/preferences/moderation' 24 - import {STALE} from '#/state/queries' 25 - import {useHiddenPosts, useLabelDefinitions} from '#/state/preferences' 21 + import { 22 + ThreadViewPreferences, 23 + UsePreferencesQueryResponse, 24 + } from '#/state/queries/preferences/types' 25 + import {getAgent, useSession} from '#/state/session' 26 26 import {saveLabelers} from '#/state/session/agent-config' 27 27 28 - export * from '#/state/queries/preferences/types' 29 - export * from '#/state/queries/preferences/moderation' 30 28 export * from '#/state/queries/preferences/const' 29 + export * from '#/state/queries/preferences/moderation' 30 + export * from '#/state/queries/preferences/types' 31 31 32 - export const preferencesQueryKey = ['getPreferences'] 32 + const preferencesQueryKeyRoot = 'getPreferences' 33 + export const preferencesQueryKey = [preferencesQueryKeyRoot] 33 34 34 35 export function usePreferencesQuery() { 35 36 return useQuery({
+3 -2
src/state/queries/profile-feedgens.ts
··· 1 1 import {AppBskyFeedGetActorFeeds} from '@atproto/api' 2 - import {useInfiniteQuery, InfiniteData, QueryKey} from '@tanstack/react-query' 2 + import {InfiniteData, QueryKey, useInfiniteQuery} from '@tanstack/react-query' 3 3 4 4 import {getAgent} from '#/state/session' 5 5 ··· 7 7 type RQPageParam = string | undefined 8 8 9 9 // TODO refactor invalidate on mutate? 10 - export const RQKEY = (did: string) => ['profile-feedgens', did] 10 + const RQKEY_ROOT = 'profile-feedgens' 11 + export const RQKEY = (did: string) => [RQKEY_ROOT, did] 11 12 12 13 export function useProfileFeedgensQuery( 13 14 did: string,
+4 -3
src/state/queries/profile-followers.ts
··· 1 1 import {AppBskyActorDefs, AppBskyGraphGetFollowers} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 9 import {getAgent} from '#/state/session' ··· 11 11 const PAGE_SIZE = 30 12 12 type RQPageParam = string | undefined 13 13 14 - export const RQKEY = (did: string) => ['profile-followers', did] 14 + const RQKEY_ROOT = 'profile-followers' 15 + export const RQKEY = (did: string) => [RQKEY_ROOT, did] 15 16 16 17 export function useProfileFollowersQuery(did: string | undefined) { 17 18 return useInfiniteQuery< ··· 43 44 const queryDatas = queryClient.getQueriesData< 44 45 InfiniteData<AppBskyGraphGetFollowers.OutputSchema> 45 46 >({ 46 - queryKey: ['profile-followers'], 47 + queryKey: [RQKEY_ROOT], 47 48 }) 48 49 for (const [_queryKey, queryData] of queryDatas) { 49 50 if (!queryData?.pages) {
+5 -4
src/state/queries/profile-follows.ts
··· 1 1 import {AppBskyActorDefs, AppBskyGraphGetFollows} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 4 QueryClient, 6 5 QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 - import {getAgent} from '#/state/session' 10 9 import {STALE} from '#/state/queries' 10 + import {getAgent} from '#/state/session' 11 11 12 12 const PAGE_SIZE = 30 13 13 type RQPageParam = string | undefined 14 14 15 15 // TODO refactor invalidate on mutate? 16 - export const RQKEY = (did: string) => ['profile-follows', did] 16 + const RQKEY_ROOT = 'profile-follows' 17 + export const RQKEY = (did: string) => [RQKEY_ROOT, did] 17 18 18 19 export function useProfileFollowsQuery(did: string | undefined) { 19 20 return useInfiniteQuery< ··· 46 47 const queryDatas = queryClient.getQueriesData< 47 48 InfiniteData<AppBskyGraphGetFollows.OutputSchema> 48 49 >({ 49 - queryKey: ['profile-follows'], 50 + queryKey: [RQKEY_ROOT], 50 51 }) 51 52 for (const [_queryKey, queryData] of queryDatas) { 52 53 if (!queryData?.pages) {
+4 -2
src/state/queries/profile-lists.ts
··· 1 1 import {AppBskyGraphGetLists} from '@atproto/api' 2 - import {useInfiniteQuery, InfiniteData, QueryKey} from '@tanstack/react-query' 2 + import {InfiniteData, QueryKey, useInfiniteQuery} from '@tanstack/react-query' 3 + 3 4 import {getAgent} from '#/state/session' 4 5 5 6 const PAGE_SIZE = 30 6 7 type RQPageParam = string | undefined 7 8 8 - export const RQKEY = (did: string) => ['profile-lists', did] 9 + const RQKEY_ROOT = 'profile-lists' 10 + export const RQKEY = (did: string) => [RQKEY_ROOT, did] 9 11 10 12 export function useProfileListsQuery(did: string, opts?: {enabled?: boolean}) { 11 13 const enabled = opts?.enabled !== false
+12 -4
src/state/queries/profile.ts
··· 30 30 import {RQKEY as RQKEY_MY_MUTED} from './my-muted-accounts' 31 31 import {ThreadNode} from './post-thread' 32 32 33 - export const RQKEY = (did: string) => ['profile', did] 34 - export const profilesQueryKey = (handles: string[]) => ['profiles', handles] 33 + const RQKEY_ROOT = 'profile' 34 + export const RQKEY = (did: string) => [RQKEY_ROOT, did] 35 + 36 + const profilesQueryKeyRoot = 'profiles' 37 + export const profilesQueryKey = (handles: string[]) => [ 38 + profilesQueryKeyRoot, 39 + handles, 40 + ] 41 + 42 + const profileBasicQueryKeyRoot = 'profileBasic' 35 43 export const profileBasicQueryKey = (didOrHandle: string) => [ 36 - 'profileBasic', 44 + profileBasicQueryKeyRoot, 37 45 didOrHandle, 38 46 ] 39 47 ··· 511 519 ): Generator<AppBskyActorDefs.ProfileViewDetailed, void> { 512 520 const queryDatas = 513 521 queryClient.getQueriesData<AppBskyActorDefs.ProfileViewDetailed>({ 514 - queryKey: ['profile'], 522 + queryKey: [RQKEY_ROOT], 515 523 }) 516 524 for (const [_queryKey, queryData] of queryDatas) { 517 525 if (!queryData) {
+5 -4
src/state/queries/resolve-uri.ts
··· 1 + import {AppBskyActorDefs, AtUri} from '@atproto/api' 1 2 import {useQuery, useQueryClient, UseQueryResult} from '@tanstack/react-query' 2 - import {AtUri, AppBskyActorDefs} from '@atproto/api' 3 3 4 - import {profileBasicQueryKey as RQKEY_PROFILE_BASIC} from './profile' 4 + import {STALE} from '#/state/queries' 5 5 import {getAgent} from '#/state/session' 6 - import {STALE} from '#/state/queries' 6 + import {profileBasicQueryKey as RQKEY_PROFILE_BASIC} from './profile' 7 7 8 - export const RQKEY = (didOrHandle: string) => ['resolved-did', didOrHandle] 8 + const RQKEY_ROOT = 'resolved-did' 9 + export const RQKEY = (didOrHandle: string) => [RQKEY_ROOT, didOrHandle] 9 10 10 11 type UriUseQueryResult = UseQueryResult<{did: string; uri: string}, Error> 11 12 export function useResolveUriQuery(uri: string | undefined): UriUseQueryResult {
+5 -4
src/state/queries/search-posts.ts
··· 1 1 import {AppBskyFeedDefs, AppBskyFeedSearchPosts} from '@atproto/api' 2 2 import { 3 - useInfiniteQuery, 4 3 InfiniteData, 5 - QueryKey, 6 4 QueryClient, 5 + QueryKey, 6 + useInfiniteQuery, 7 7 } from '@tanstack/react-query' 8 8 9 9 import {getAgent} from '#/state/session' 10 10 import {embedViewRecordToPostView, getEmbeddedPost} from './util' 11 11 12 + const searchPostsQueryKeyRoot = 'search-posts' 12 13 const searchPostsQueryKey = ({query}: {query: string}) => [ 13 - 'search-posts', 14 + searchPostsQueryKeyRoot, 14 15 query, 15 16 ] 16 17 ··· 43 44 const queryDatas = queryClient.getQueriesData< 44 45 InfiniteData<AppBskyFeedSearchPosts.OutputSchema> 45 46 >({ 46 - queryKey: ['search-posts'], 47 + queryKey: [searchPostsQueryKeyRoot], 47 48 }) 48 49 for (const [_queryKey, queryData] of queryDatas) { 49 50 if (!queryData?.pages) {
+2 -1
src/state/queries/service.ts
··· 1 1 import {BskyAgent} from '@atproto/api' 2 2 import {useQuery} from '@tanstack/react-query' 3 3 4 - export const RQKEY = (serviceUrl: string) => ['service', serviceUrl] 4 + const RQKEY_ROOT = 'service' 5 + export const RQKEY = (serviceUrl: string) => [RQKEY_ROOT, serviceUrl] 5 6 6 7 export function useServiceQuery(serviceUrl: string) { 7 8 return useQuery({
+4 -3
src/state/queries/suggested-feeds.ts
··· 1 - import {useInfiniteQuery, InfiniteData, QueryKey} from '@tanstack/react-query' 2 1 import {AppBskyFeedGetSuggestedFeeds} from '@atproto/api' 2 + import {InfiniteData, QueryKey, useInfiniteQuery} from '@tanstack/react-query' 3 3 4 - import {getAgent} from '#/state/session' 5 4 import {STALE} from '#/state/queries' 5 + import {getAgent} from '#/state/session' 6 6 7 - export const suggestedFeedsQueryKey = ['suggestedFeeds'] 7 + const suggestedFeedsQueryKeyRoot = 'suggestedFeeds' 8 + export const suggestedFeedsQueryKey = [suggestedFeedsQueryKeyRoot] 8 9 9 10 export function useSuggestedFeedsQuery() { 10 11 return useInfiniteQuery<
+12 -9
src/state/queries/suggested-follows.ts
··· 6 6 moderateProfile, 7 7 } from '@atproto/api' 8 8 import { 9 - useInfiniteQuery, 10 - useQueryClient, 11 - useQuery, 12 9 InfiniteData, 13 10 QueryClient, 14 11 QueryKey, 12 + useInfiniteQuery, 13 + useQuery, 14 + useQueryClient, 15 15 } from '@tanstack/react-query' 16 16 17 - import {useSession, getAgent} from '#/state/session' 17 + import {STALE} from '#/state/queries' 18 18 import {useModerationOpts} from '#/state/queries/preferences' 19 - import {STALE} from '#/state/queries' 19 + import {getAgent, useSession} from '#/state/session' 20 20 21 - const suggestedFollowsQueryKey = ['suggested-follows'] 21 + const suggestedFollowsQueryKeyRoot = 'suggested-follows' 22 + const suggestedFollowsQueryKey = [suggestedFollowsQueryKeyRoot] 23 + 24 + const suggestedFollowsByActorQueryKeyRoot = 'suggested-follows-by-actor' 22 25 const suggestedFollowsByActorQueryKey = (did: string) => [ 23 - 'suggested-follows-by-actor', 26 + suggestedFollowsByActorQueryKeyRoot, 24 27 did, 25 28 ] 26 29 ··· 125 128 const queryDatas = queryClient.getQueriesData< 126 129 InfiniteData<AppBskyActorGetSuggestions.OutputSchema> 127 130 >({ 128 - queryKey: ['suggested-follows'], 131 + queryKey: [suggestedFollowsQueryKeyRoot], 129 132 }) 130 133 for (const [_queryKey, queryData] of queryDatas) { 131 134 if (!queryData?.pages) { ··· 148 151 const queryDatas = 149 152 queryClient.getQueriesData<AppBskyGraphGetSuggestedFollowsByActor.OutputSchema>( 150 153 { 151 - queryKey: ['suggested-follows-by-actor'], 154 + queryKey: [suggestedFollowsByActorQueryKeyRoot], 152 155 }, 153 156 ) 154 157 for (const [_queryKey, queryData] of queryDatas) {