From 94652b520b8e7ccf5206ac5afc923eafe0aef04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 26 Feb 2026 21:14:05 +0100 Subject: [PATCH] nicolium: improve queries helpers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../src/instance/about.example/index.html | 6 ++- .../src/queries/account-lists/use-follows.ts | 8 +--- .../pl-fe/src/queries/admin/use-accounts.ts | 7 +--- .../conversations/use-conversations.ts | 2 +- .../use-event-participation-requests.ts | 8 +--- .../make-paginated-response-query-options.ts | 11 +++++- .../utils/make-paginated-response-query.ts | 11 +++++- .../utils/update-paginated-response.ts | 38 ++++++++++++------- 8 files changed, 53 insertions(+), 38 deletions(-) diff --git a/packages/pl-fe/src/instance/about.example/index.html b/packages/pl-fe/src/instance/about.example/index.html index b313d33f4..6464eb004 100644 --- a/packages/pl-fe/src/instance/about.example/index.html +++ b/packages/pl-fe/src/instance/about.example/index.html @@ -1,5 +1,5 @@

About us

-

This is an example about page for a Fediverse instance using

.

+

This is an example about page for a Fediverse instance using Nicolium.

Site rules

    @@ -10,5 +10,7 @@

    Nicolium is free and open source (FOSS) software.

    The Nicolium repository can be found at - Codeberg + Codeberg

    diff --git a/packages/pl-fe/src/queries/account-lists/use-follows.ts b/packages/pl-fe/src/queries/account-lists/use-follows.ts index 04f5c4788..29ae0be5c 100644 --- a/packages/pl-fe/src/queries/account-lists/use-follows.ts +++ b/packages/pl-fe/src/queries/account-lists/use-follows.ts @@ -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!, { diff --git a/packages/pl-fe/src/queries/admin/use-accounts.ts b/packages/pl-fe/src/queries/admin/use-accounts.ts index 28f3c1e9c..f5ce21381 100644 --- a/packages/pl-fe/src/queries/admin/use-accounts.ts +++ b/packages/pl-fe/src/queries/admin/use-accounts.ts @@ -26,11 +26,8 @@ import type { } from 'pl-api'; const useAdminAccounts = makePaginatedResponseQuery( - (params: Omit) => [ - 'admin', - 'accountLists', - params, - ], + (params: Omit) => + queryKeys.admin.accountLists.show(params), (client, [params]) => client.admin.accounts.getAccounts(params).then(minifyAdminAccountList), undefined, 'isAdmin', diff --git a/packages/pl-fe/src/queries/conversations/use-conversations.ts b/packages/pl-fe/src/queries/conversations/use-conversations.ts index e40b582fb..3d5cceeae 100644 --- a/packages/pl-fe/src/queries/conversations/use-conversations.ts +++ b/packages/pl-fe/src/queries/conversations/use-conversations.ts @@ -105,7 +105,7 @@ const useMarkConversationRead = (conversationId: string) => { const previous = queryClient.getQueryData(queryKeys.conversations.all); - updatePaginatedResponse(queryKeys.conversations.all, (items) => + updatePaginatedResponse(queryKeys.conversations.all, (items) => items.map((item) => (item.id === conversationId ? { ...item, unread: false } : item)), ); diff --git a/packages/pl-fe/src/queries/events/use-event-participation-requests.ts b/packages/pl-fe/src/queries/events/use-event-participation-requests.ts index 318f8d63d..8506c01e7 100644 --- a/packages/pl-fe/src/queries/events/use-event-participation-requests.ts +++ b/packages/pl-fe/src/queries/events/use-event-participation-requests.ts @@ -25,13 +25,9 @@ const minifyRequestList = ( }, ); -type MinifiedRequestList = ReturnType; -type MinifiedRequest = MinifiedRequestList['items'][0]; - const removeRequest = (statusId: string, accountId: string) => - updatePaginatedResponse( - 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( diff --git a/packages/pl-fe/src/queries/utils/make-paginated-response-query-options.ts b/packages/pl-fe/src/queries/utils/make-paginated-response-query-options.ts index cc48f0c01..04e866dc9 100644 --- a/packages/pl-fe/src/queries/utils/make-paginated-response-query-options.ts +++ b/packages/pl-fe/src/queries/utils/make-paginated-response-query-options.ts @@ -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, >( - queryKey: QueryKey | ((...params: T1) => QueryKey), + queryKey: + | DataTag>> + | ((...params: T1) => DataTag>>), queryFn: (client: PlApiClient, params: T1) => Promise>, select?: (data: InfiniteData>) => T3, ) => diff --git a/packages/pl-fe/src/queries/utils/make-paginated-response-query.ts b/packages/pl-fe/src/queries/utils/make-paginated-response-query.ts index 61e5bebbe..4fda81d16 100644 --- a/packages/pl-fe/src/queries/utils/make-paginated-response-query.ts +++ b/packages/pl-fe/src/queries/utils/make-paginated-response-query.ts @@ -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, >( - queryKey: QueryKey | ((...params: T1) => QueryKey), + queryKey: + | DataTag>> + | ((...params: T1) => DataTag>>), queryFn: (client: PlApiClient, params: T1) => Promise>, select?: (data: InfiniteData>) => T3, enabled?: ((...params: T1) => boolean) | 'isLoggedIn' | 'isAdmin', diff --git a/packages/pl-fe/src/queries/utils/update-paginated-response.ts b/packages/pl-fe/src/queries/utils/update-paginated-response.ts index 64aceb50e..ec920251e 100644 --- a/packages/pl-fe/src/queries/utils/update-paginated-response.ts +++ b/packages/pl-fe/src/queries/utils/update-paginated-response.ts @@ -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 = ( - queryKey: QueryKey, - updater: (items: PaginatedResponse['items']) => PaginatedResponse['items'], +type InferPaginatedItem = + TKey extends DataTag>> ? U : never; + +const updatePaginatedResponse = < + TKey extends DataTag>>, +>( + queryKey: TKey, + updater: ( + items: PaginatedResponse>['items'], + ) => PaginatedResponse>['items'], ) => - queryClient.setQueryData>>(queryKey, (data) => { - if (!data) return undefined; - return { - ...data, - pages: data.pages.map((page) => ({ - ...page, - items: updater(page.items), - })), - }; - }); + queryClient.setQueryData>>>( + queryKey, + (data) => { + if (!data) return undefined; + return { + ...data, + pages: data.pages.map((page) => ({ + ...page, + items: updater(page.items), + })), + }; + }, + ); export { updatePaginatedResponse };