nicolium: improve queries helpers
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
@ -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>
|
||||
|
||||
@ -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!, {
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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)),
|
||||
);
|
||||
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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,
|
||||
) =>
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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 };
|
||||
|
||||
Reference in New Issue
Block a user