nicolium: improve queries helpers

Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
nicole mikołajczyk
2026-02-26 21:14:05 +01:00
parent 2a691b9572
commit 94652b520b
8 changed files with 53 additions and 38 deletions

View File

@ -1,5 +1,5 @@
<h1>About us</h1>
<p>This is an example about page for a Fediverse instance using <Nav></Nav>.</p>
<p>This is an example about page for a Fediverse instance using Nicolium.</p>
<h2 id="site-rules">Site rules</h2>
<ol>
@ -10,5 +10,7 @@
<p>Nicolium is free and open source (FOSS) software.</p>
<p>
The Nicolium repository can be found at
<a href="https://codeberg.org/mkljczk/nicolium" target="_blank" rel="noopener noreferrer">Codeberg</a>
<a href="https://codeberg.org/mkljczk/nicolium" target="_blank" rel="noopener noreferrer"
>Codeberg</a
>
</p>

View File

@ -23,12 +23,8 @@ const useFollowing = makePaginatedResponseQuery(
);
const useSubscribers = makePaginatedResponseQuery(
(accountId?: string, includeExpired?: boolean) => [
'accountsLists',
'subscribers',
accountId,
includeExpired || false,
],
(accountId?: string, includeExpired?: boolean) =>
queryKeys.accountsLists.subscribers(accountId!, includeExpired ?? false),
(client, [accountId, includeExpired]) =>
client.accounts
.getAccountSubscribers(accountId!, {

View File

@ -26,11 +26,8 @@ import type {
} from 'pl-api';
const useAdminAccounts = makePaginatedResponseQuery(
(params: Omit<AdminGetAccountsParams, keyof PaginationParams>) => [
'admin',
'accountLists',
params,
],
(params: Omit<AdminGetAccountsParams, keyof PaginationParams>) =>
queryKeys.admin.accountLists.show(params),
(client, [params]) => client.admin.accounts.getAccounts(params).then(minifyAdminAccountList),
undefined,
'isAdmin',

View File

@ -105,7 +105,7 @@ const useMarkConversationRead = (conversationId: string) => {
const previous = queryClient.getQueryData(queryKeys.conversations.all);
updatePaginatedResponse<MinifiedConversation>(queryKeys.conversations.all, (items) =>
updatePaginatedResponse(queryKeys.conversations.all, (items) =>
items.map((item) => (item.id === conversationId ? { ...item, unread: false } : item)),
);

View File

@ -25,13 +25,9 @@ const minifyRequestList = (
},
);
type MinifiedRequestList = ReturnType<typeof minifyRequestList>;
type MinifiedRequest = MinifiedRequestList['items'][0];
const removeRequest = (statusId: string, accountId: string) =>
updatePaginatedResponse<MinifiedRequest>(
queryKeys.accountsLists.eventParticipationRequests(statusId),
(items) => items.filter(({ account_id }) => account_id !== accountId),
updatePaginatedResponse(queryKeys.accountsLists.eventParticipationRequests(statusId), (items) =>
items.filter(({ account_id }) => account_id !== accountId),
);
const useEventParticipationRequests = makePaginatedResponseQuery(

View File

@ -1,4 +1,9 @@
import { type InfiniteData, infiniteQueryOptions, type QueryKey } from '@tanstack/react-query';
import {
type DataTag,
type InfiniteData,
infiniteQueryOptions,
type QueryKey,
} from '@tanstack/react-query';
import { getClient } from '@/api';
@ -16,7 +21,9 @@ const makePaginatedResponseQueryOptions =
IsArray extends boolean = true,
T3 = PaginatedResponseQueryResult<T2, IsArray>,
>(
queryKey: QueryKey | ((...params: T1) => QueryKey),
queryKey:
| DataTag<QueryKey, InfiniteData<PaginatedResponse<T2, IsArray>>>
| ((...params: T1) => DataTag<QueryKey, InfiniteData<PaginatedResponse<T2, IsArray>>>),
queryFn: (client: PlApiClient, params: T1) => Promise<PaginatedResponse<T2, IsArray>>,
select?: (data: InfiniteData<PaginatedResponse<T2, IsArray>>) => T3,
) =>

View File

@ -1,4 +1,9 @@
import { type InfiniteData, type QueryKey, useInfiniteQuery } from '@tanstack/react-query';
import {
type DataTag,
type InfiniteData,
type QueryKey,
useInfiniteQuery,
} from '@tanstack/react-query';
import { useClient } from '@/hooks/use-client';
import { useOwnAccount } from '@/hooks/use-own-account';
@ -23,7 +28,9 @@ const makePaginatedResponseQuery =
IsArray extends boolean = true,
T3 = PaginatedResponseQueryResult<T2, IsArray>,
>(
queryKey: QueryKey | ((...params: T1) => QueryKey),
queryKey:
| DataTag<QueryKey, InfiniteData<PaginatedResponse<T2, IsArray>>>
| ((...params: T1) => DataTag<QueryKey, InfiniteData<PaginatedResponse<T2, IsArray>>>),
queryFn: (client: PlApiClient, params: T1) => Promise<PaginatedResponse<T2, IsArray>>,
select?: (data: InfiniteData<PaginatedResponse<T2, IsArray>>) => T3,
enabled?: ((...params: T1) => boolean) | 'isLoggedIn' | 'isAdmin',

View File

@ -1,21 +1,31 @@
import { queryClient } from '@/queries/client';
import type { InfiniteData, QueryKey } from '@tanstack/react-query';
import type { DataTag, InfiniteData, QueryKey } from '@tanstack/react-query';
import type { PaginatedResponse } from 'pl-api';
const updatePaginatedResponse = <T>(
queryKey: QueryKey,
updater: (items: PaginatedResponse<T>['items']) => PaginatedResponse<T>['items'],
type InferPaginatedItem<TKey extends QueryKey> =
TKey extends DataTag<QueryKey, InfiniteData<PaginatedResponse<infer U, any>>> ? U : never;
const updatePaginatedResponse = <
TKey extends DataTag<QueryKey, InfiniteData<PaginatedResponse<any>>>,
>(
queryKey: TKey,
updater: (
items: PaginatedResponse<InferPaginatedItem<TKey>>['items'],
) => PaginatedResponse<InferPaginatedItem<TKey>>['items'],
) =>
queryClient.setQueryData<InfiniteData<PaginatedResponse<T>>>(queryKey, (data) => {
if (!data) return undefined;
return {
...data,
pages: data.pages.map((page) => ({
...page,
items: updater(page.items),
})),
};
});
queryClient.setQueryData<InfiniteData<PaginatedResponse<InferPaginatedItem<TKey>>>>(
queryKey,
(data) => {
if (!data) return undefined;
return {
...data,
pages: data.pages.map((page) => ({
...page,
items: updater(page.items),
})),
};
},
);
export { updatePaginatedResponse };