diff --git a/packages/nicolium/src/actions/importer.ts b/packages/nicolium/src/actions/importer.ts index 1d9c68ecd..f47c120f0 100644 --- a/packages/nicolium/src/actions/importer.ts +++ b/packages/nicolium/src/actions/importer.ts @@ -1,3 +1,5 @@ +import { notifyManager } from '@tanstack/react-query'; + import { normalizeStatus } from '@/normalizers/status'; import { selectAccount } from '@/queries/accounts/selectors'; import { queryClient } from '@/queries/client'; @@ -102,45 +104,53 @@ const importEntities = ( entities.statuses?.forEach((status) => status && processStatus(status, options.withParents)); } - if (!isEmpty(accounts)) { - for (const account of Object.values(accounts)) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - } - } - if (!isEmpty(groups)) - for (const group of Object.values(groups)) { - queryClient.setQueryData(queryKeys.groups.show(group.id), group); - if (group.relationship) { - queryClient.setQueryData(queryKeys.groupRelationships.show(group.id), group.relationship); + notifyManager.batch(() => { + if (!isEmpty(accounts)) { + for (const account of Object.values(accounts)) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); } } - if (!isEmpty(polls)) { - for (const poll of Object.values(polls)) { - queryClient.setQueryData(queryKeys.statuses.polls.show(poll.id), poll); + if (!isEmpty(groups)) + for (const group of Object.values(groups)) { + queryClient.setQueryData(queryKeys.groups.show(group.id), group); + if (group.relationship) { + queryClient.setQueryData(queryKeys.groupRelationships.show(group.id), group.relationship); + } + } + if (!isEmpty(polls)) { + for (const poll of Object.values(polls)) { + queryClient.setQueryData(queryKeys.statuses.polls.show(poll.id), poll); + } } - } - if (!isEmpty(relationships)) { - for (const relationship of Object.values(relationships)) { - queryClient.setQueryData(queryKeys.accountRelationships.show(relationship.id), relationship); + if (!isEmpty(relationships)) { + for (const relationship of Object.values(relationships)) { + queryClient.setQueryData( + queryKeys.accountRelationships.show(relationship.id), + relationship, + ); + } } - } - if (!isEmpty(statuses)) - useContextStore.getState().actions.importStatuses(Object.values(statuses)); + if (!isEmpty(statuses)) + useContextStore.getState().actions.importStatuses(Object.values(statuses)); - if (!isEmpty(statuses)) { - for (const status of Object.values(statuses)) { - const oldStatus = queryClient.getQueryData(queryKeys.statuses.show(status.id)); - const normalized = normalizeStatus(status, oldStatus); - queryClient.setQueryData(queryKeys.statuses.show(status.id), normalized); - } - } - if (!isEmpty(translations)) { - for (const [statusId, translationsByLanguage] of Object.entries(translations)) { - for (const [language, translation] of Object.entries(translationsByLanguage)) { - queryClient.setQueryData(queryKeys.statuses.translations(statusId, language), translation); + if (!isEmpty(statuses)) { + for (const status of Object.values(statuses)) { + const oldStatus = queryClient.getQueryData(queryKeys.statuses.show(status.id)); + const normalized = normalizeStatus(status, oldStatus); + queryClient.setQueryData(queryKeys.statuses.show(status.id), normalized); } } - } + if (!isEmpty(translations)) { + for (const [statusId, translationsByLanguage] of Object.entries(translations)) { + for (const [language, translation] of Object.entries(translationsByLanguage)) { + queryClient.setQueryData( + queryKeys.statuses.translations(statusId, language), + translation, + ); + } + } + } + }); }; type ImporterAction = never; diff --git a/packages/nicolium/src/queries/accounts/use-directory.ts b/packages/nicolium/src/queries/accounts/use-directory.ts index a38b96927..2edb39ce5 100644 --- a/packages/nicolium/src/queries/accounts/use-directory.ts +++ b/packages/nicolium/src/queries/accounts/use-directory.ts @@ -1,4 +1,4 @@ -import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { notifyManager, useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; import { useClient } from '@/hooks/use-client'; import { queryKeys } from '@/queries/keys'; @@ -17,9 +17,11 @@ const useDirectory = (order: 'active' | 'new', local: boolean = false) => { offset, }) .then((accounts) => { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - } + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + } + }); return accounts.map(({ id }) => id); }), initialPageParam: 0, diff --git a/packages/nicolium/src/queries/search/use-search-accounts.ts b/packages/nicolium/src/queries/search/use-search-accounts.ts index 31c8fead5..f0b61a854 100644 --- a/packages/nicolium/src/queries/search/use-search-accounts.ts +++ b/packages/nicolium/src/queries/search/use-search-accounts.ts @@ -1,4 +1,4 @@ -import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { notifyManager, useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; import { useClient } from '@/hooks/use-client'; @@ -23,9 +23,11 @@ const useAccountSearch = (query: string, params?: Omit { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - } + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + } + }); return accounts.map(({ id }) => id); }), enabled: !!query?.trim(), diff --git a/packages/nicolium/src/queries/search/use-search.ts b/packages/nicolium/src/queries/search/use-search.ts index cb340b49d..f0dd3f53f 100644 --- a/packages/nicolium/src/queries/search/use-search.ts +++ b/packages/nicolium/src/queries/search/use-search.ts @@ -1,4 +1,4 @@ -import { useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; +import { notifyManager, useInfiniteQuery, useQueryClient } from '@tanstack/react-query'; import { importEntities } from '@/actions/importer'; import { useClient } from '@/hooks/use-client'; @@ -30,15 +30,17 @@ const useSearchAccounts = ( { signal }, ) .then(({ accounts }) => { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - if (account.relationship) { - queryClient.setQueryData( - queryKeys.accountRelationships.show(account.id), - account.relationship, - ); + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + if (account.relationship) { + queryClient.setQueryData( + queryKeys.accountRelationships.show(account.id), + account.relationship, + ); + } } - } + }); return accounts.map(({ id }) => id); }), enabled: !!query?.trim(), @@ -135,9 +137,11 @@ const useSearchGroups = ( { signal }, ) .then(({ groups }) => { - for (const group of groups) { - queryClient.setQueryData(queryKeys.groups.show(group.id), group); - } + notifyManager.batch(() => { + for (const group of groups) { + queryClient.setQueryData(queryKeys.groups.show(group.id), group); + } + }); return groups.map(({ id }) => id); }), enabled: !!query?.trim(), diff --git a/packages/nicolium/src/queries/statuses/use-status-history.ts b/packages/nicolium/src/queries/statuses/use-status-history.ts index 720a44774..42fda13ca 100644 --- a/packages/nicolium/src/queries/statuses/use-status-history.ts +++ b/packages/nicolium/src/queries/statuses/use-status-history.ts @@ -21,8 +21,9 @@ const useStatusHistory = (statusId: string) => { queryKey: queryKeys.statuses.history(statusId), queryFn: async () => { const history = await client.statuses.getStatusHistory(statusId); - for (const { account } of history) { - // why am i even doing this it's always the same account lol + // All entries include a current version of the same account. + const account = history[0]?.account; + if (account) { queryClient.setQueryData(queryKeys.accounts.show(account.id), account); } return history.map(minifyStatusEdit); diff --git a/packages/nicolium/src/queries/statuses/use-status-interactions.ts b/packages/nicolium/src/queries/statuses/use-status-interactions.ts index a8b522a32..b9b457dcf 100644 --- a/packages/nicolium/src/queries/statuses/use-status-interactions.ts +++ b/packages/nicolium/src/queries/statuses/use-status-interactions.ts @@ -1,4 +1,10 @@ -import { type InfiniteData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { + type InfiniteData, + notifyManager, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query'; import { create } from 'mutative'; import { defineMessages, useIntl } from 'react-intl'; @@ -94,11 +100,13 @@ const useStatusReactions = (statusId: string, emoji?: string) => { queryKey: queryKeys.accountsLists.statusReactions(statusId, emoji), queryFn: () => client.statuses.getStatusReactions(statusId, emoji).then((reactions) => { - for (const { accounts } of reactions) { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + notifyManager.batch(() => { + for (const { accounts } of reactions) { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + } } - } + }); return reactions.map(minifyEmojiReaction); }), diff --git a/packages/nicolium/src/queries/trends/use-suggested-accounts.ts b/packages/nicolium/src/queries/trends/use-suggested-accounts.ts index 143521657..d5cbe2982 100644 --- a/packages/nicolium/src/queries/trends/use-suggested-accounts.ts +++ b/packages/nicolium/src/queries/trends/use-suggested-accounts.ts @@ -1,4 +1,10 @@ -import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { + keepPreviousData, + notifyManager, + useMutation, + useQuery, + useQueryClient, +} from '@tanstack/react-query'; import { batcher } from '@/api/batcher'; import { useClient } from '@/hooks/use-client'; @@ -23,10 +29,12 @@ const useSuggestedAccounts = () => { const fetcher = batcher.relationships(client).fetch; - for (const { account } of response) { - fetcher(account.id); - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - } + notifyManager.batch(() => { + for (const { account } of response) { + fetcher(account.id); + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + } + }); return response.map(({ account, ...x }) => ({ ...x, account_id: account.id })); }; diff --git a/packages/nicolium/src/queries/utils/minify-list.ts b/packages/nicolium/src/queries/utils/minify-list.ts index 1aec92286..fcbd12a1b 100644 --- a/packages/nicolium/src/queries/utils/minify-list.ts +++ b/packages/nicolium/src/queries/utils/minify-list.ts @@ -1,3 +1,5 @@ +import { notifyManager } from '@tanstack/react-query'; + import { importEntities } from '@/actions/importer'; import { queryClient } from '../client'; @@ -54,15 +56,17 @@ const minifyAccountList = (response: PaginatedResponse): PaginatedRespo response, (account) => account.id, (accounts) => { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - if (account.relationship) { - queryClient.setQueryData( - queryKeys.accountRelationships.show(account.id), - account.relationship, - ); + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + if (account.relationship) { + queryClient.setQueryData( + queryKeys.accountRelationships.show(account.id), + account.relationship, + ); + } } - } + }); }, ); @@ -73,15 +77,17 @@ const minifyBlockedAccountList = ( response, (account) => [account.id, account.block_expires_at], (accounts) => { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - if (account.relationship) { - queryClient.setQueryData( - queryKeys.accountRelationships.show(account.id), - account.relationship, - ); + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + if (account.relationship) { + queryClient.setQueryData( + queryKeys.accountRelationships.show(account.id), + account.relationship, + ); + } } - } + }); }, ); @@ -92,15 +98,17 @@ const minifyMutedAccountList = ( response, (account) => [account.id, account.mute_expires_at], (accounts) => { - for (const account of accounts) { - queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - if (account.relationship) { - queryClient.setQueryData( - queryKeys.accountRelationships.show(account.id), - account.relationship, - ); + notifyManager.batch(() => { + for (const account of accounts) { + queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + if (account.relationship) { + queryClient.setQueryData( + queryKeys.accountRelationships.show(account.id), + account.relationship, + ); + } } - } + }); }, ); @@ -109,9 +117,11 @@ const minifyGroupList = (response: PaginatedResponse): PaginatedResponse< response, (group) => group.id, (groups) => { - for (const group of groups) { - queryClient.setQueryData(queryKeys.groups.show(group.id), group); - } + notifyManager.batch(() => { + for (const group of groups) { + queryClient.setQueryData(queryKeys.groups.show(group.id), group); + } + }); }, ); @@ -161,10 +171,12 @@ const minifyAdminAccountList = (response: PaginatedResponse) => response, (account) => account.id, (accounts) => { - for (const { account, ...adminAccount } of accounts) { - if (account) queryClient.setQueryData(queryKeys.accounts.show(account.id), account); - queryClient.setQueryData(queryKeys.admin.accounts.show(adminAccount.id), adminAccount); - } + notifyManager.batch(() => { + for (const { account, ...adminAccount } of accounts) { + if (account) queryClient.setQueryData(queryKeys.accounts.show(account.id), account); + queryClient.setQueryData(queryKeys.admin.accounts.show(adminAccount.id), adminAccount); + } + }); }, ); @@ -211,12 +223,14 @@ const minifyAdminReportList = (response: PaginatedResponse) => response, (report) => report.id, (reports) => { - for (const report of reports) { - queryClient.setQueryData( - queryKeys.admin.reports.show(report.id), - minifyAdminReport(report), - ); - } + notifyManager.batch(() => { + for (const report of reports) { + queryClient.setQueryData( + queryKeys.admin.reports.show(report.id), + minifyAdminReport(report), + ); + } + }); }, ); diff --git a/packages/nicolium/src/stores/shoutbox.ts b/packages/nicolium/src/stores/shoutbox.ts index eeb5302dd..9a6148f2f 100644 --- a/packages/nicolium/src/stores/shoutbox.ts +++ b/packages/nicolium/src/stores/shoutbox.ts @@ -1,3 +1,4 @@ +import { notifyManager } from '@tanstack/react-query'; import { useEffect } from 'react'; import { create } from 'zustand'; import { mutative } from 'zustand-mutative'; @@ -37,12 +38,14 @@ const useShoutboxStore = create()( actions: { setMessages: (messages) => { set((state: State) => { - for (const { author } of messages.toReversed()) { - queryClient.setQueryData( - queryKeys.accounts.show(author.id), - (account) => account || author, - ); - } + notifyManager.batch(() => { + for (const { author } of messages.toReversed()) { + queryClient.setQueryData( + queryKeys.accounts.show(author.id), + (account) => account || author, + ); + } + }); state.messages = messages.map(minifyMessage); state.isLoading = false; });