Nicolium: use notifyManager

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2026-03-01 17:14:27 +01:00
parent 0d1450e922
commit 46b12c5497
9 changed files with 159 additions and 107 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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<SearchAccountParams, 'off
{ signal },
)
.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);
}),
enabled: !!query?.trim(),

View File

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

View File

@ -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);

View File

@ -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);
}),

View File

@ -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 }));
};

View File

@ -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<Account>): 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<Group>): 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<AdminAccount>) =>
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<AdminReport>) =>
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),
);
}
});
},
);

View File

@ -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<State>()(
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;
});