From 02c80f09487e9447ea5fede8b1944958490699ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 5 Mar 2026 16:53:50 +0100 Subject: [PATCH] nicolium: some markers support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../api/hooks/streaming/use-user-stream.ts | 14 ++++--- packages/nicolium/src/features/ui/index.tsx | 13 +++---- packages/nicolium/src/queries/keys.ts | 5 ++- .../src/queries/markers/use-markers.ts | 38 ++++++++++++++++--- .../notifications/use-notifications.ts | 23 +++-------- 5 files changed, 55 insertions(+), 38 deletions(-) diff --git a/packages/nicolium/src/api/hooks/streaming/use-user-stream.ts b/packages/nicolium/src/api/hooks/streaming/use-user-stream.ts index d46fe8b82..fb6140801 100644 --- a/packages/nicolium/src/api/hooks/streaming/use-user-stream.ts +++ b/packages/nicolium/src/api/hooks/streaming/use-user-stream.ts @@ -162,12 +162,16 @@ const useUserStream = () => { case 'announcement.delete': deleteAnnouncement(event.payload); break; - case 'marker': - queryClient.setQueryData( - queryKeys.markers.notifications, - event.payload.notifications ?? null, - ); + case 'marker': { + for (const timeline in event.payload) { + queryClient.setQueryData( + queryKeys.markers.timeline(timeline as 'home' | 'notifications'), + event.payload[timeline] ?? null, + ); + } + break; + } } }, []); diff --git a/packages/nicolium/src/features/ui/index.tsx b/packages/nicolium/src/features/ui/index.tsx index ca314889e..076615877 100644 --- a/packages/nicolium/src/features/ui/index.tsx +++ b/packages/nicolium/src/features/ui/index.tsx @@ -19,17 +19,17 @@ import { useOwnAccount } from '@/hooks/use-own-account'; import { prefetchFollowRequests } from '@/queries/accounts/use-follow-requests'; import { queryClient } from '@/queries/client'; import { prefetchCustomEmojis } from '@/queries/instance/use-custom-emojis'; -import { - usePrefetchNotifications, - usePrefetchNotificationsMarker, -} from '@/queries/notifications/use-notifications'; +import { usePrefetchNotificationsMarker } from '@/queries/markers/use-markers'; +import { usePrefetchNotifications } from '@/queries/notifications/use-notifications'; import { useFilters } from '@/queries/settings/use-filters'; import { scheduledStatusesQueryOptions } from '@/queries/statuses/scheduled-statuses'; import { useShoutboxSubscription } from '@/stores/shoutbox'; import { useIsDropdownMenuOpen } from '@/stores/ui'; import { getVapidKey } from '@/utils/auth'; import { isStandalone } from '@/utils/state'; - +// Dummy import, to make sure that ends up in the application bundle. +// Without this it ends up in ~8 very commonly used bundles. +import '@/components/statuses/status'; import { ModalRoot, AccountHoverCard, @@ -37,9 +37,6 @@ import { DropdownNavigation, StatusHoverCard, } from './util/async-components'; -// Dummy import, to make sure that ends up in the application bundle. -// Without this it ends up in ~8 very commonly used bundles. -import '@/components/statuses/status'; import GlobalHotkeys from './util/global-hotkeys'; const UI: React.FC = React.memo(() => { diff --git a/packages/nicolium/src/queries/keys.ts b/packages/nicolium/src/queries/keys.ts index b8526882a..07ed0ae86 100644 --- a/packages/nicolium/src/queries/keys.ts +++ b/packages/nicolium/src/queries/keys.ts @@ -375,7 +375,10 @@ const notifications = { const markers = { root: ['markers'] as const, - notifications: ['markers', 'notifications'] as TaggedKey<['markers', 'notifications'], Marker>, + timeline: (timeline: 'home' | 'notifications') => { + const key = ['markers', timeline] as const; + return key as TaggedKey; + }, }; const search = { diff --git a/packages/nicolium/src/queries/markers/use-markers.ts b/packages/nicolium/src/queries/markers/use-markers.ts index 0beaf19c8..17d43d789 100644 --- a/packages/nicolium/src/queries/markers/use-markers.ts +++ b/packages/nicolium/src/queries/markers/use-markers.ts @@ -1,20 +1,46 @@ -import { useQuery } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import { useEffect } from 'react'; import { useClient } from '@/hooks/use-client'; import { useLoggedIn } from '@/hooks/use-logged-in'; import { queryKeys } from '../keys'; -const useNotificationsMarker = () => { +const useMarker = (timeline: 'home' | 'notifications') => { const client = useClient(); const { me } = useLoggedIn(); return useQuery({ - queryKey: queryKeys.markers.notifications, - queryFn: async () => - (await client.timelines.getMarkers(['notifications'])).notifications ?? null, + queryKey: queryKeys.markers.timeline(timeline), + queryFn: async () => (await client.timelines.getMarkers([timeline]))[timeline] ?? null, enabled: !!me, }); }; -export { useNotificationsMarker }; +const useNotificationsMarker = () => useMarker('notifications'); + +const useHomeTimelineMarker = () => useMarker('home'); + +const usePrefetchMarker = (timeline: 'home' | 'notifications') => { + const client = useClient(); + const queryClient = useQueryClient(); + const { me } = useLoggedIn(); + + useEffect(() => { + if (!me) return; + queryClient.prefetchQuery({ + queryKey: queryKeys.markers.timeline(timeline), + queryFn: async () => (await client.timelines.getMarkers([timeline]))[timeline] ?? null, + }); + }, [me, timeline]); +}; + +const usePrefetchHomeTimelineMarker = () => usePrefetchMarker('home'); +const usePrefetchNotificationsMarker = () => usePrefetchMarker('notifications'); + +export { + useNotificationsMarker, + useHomeTimelineMarker, + usePrefetchHomeTimelineMarker, + usePrefetchNotificationsMarker, +}; diff --git a/packages/nicolium/src/queries/notifications/use-notifications.ts b/packages/nicolium/src/queries/notifications/use-notifications.ts index a838c510d..8594c5b6e 100644 --- a/packages/nicolium/src/queries/notifications/use-notifications.ts +++ b/packages/nicolium/src/queries/notifications/use-notifications.ts @@ -149,21 +149,6 @@ const useNotification = (notification: NotificationGroup) => { }, [notification, status, target, accounts.data]); }; -const usePrefetchNotificationsMarker = () => { - const client = useClient(); - const queryClient = useQueryClient(); - const { me } = useLoggedIn(); - - useEffect(() => { - if (!me) return; - queryClient.prefetchQuery({ - queryKey: queryKeys.markers.notifications, - queryFn: async () => - (await client.timelines.getMarkers(['notifications'])).notifications ?? null, - }); - }, [me]); -}; - const useProcessStreamNotification = () => { const intl = useIntl(); const { data: filters = [] } = useFiltersByContext('notifications'); @@ -261,7 +246,7 @@ const useMarkNotificationsReadMutation = () => { mutationFn: async (lastReadId?: string | null) => { if (!lastReadId) return; - const currentMarker = queryClient.getQueryData(queryKeys.markers.notifications); + const currentMarker = queryClient.getQueryData(queryKeys.markers.timeline('notifications')); if (currentMarker && compareId(currentMarker.last_read_id, lastReadId) >= 0) { return; } @@ -274,7 +259,10 @@ const useMarkNotificationsReadMutation = () => { }, onSuccess: (markers) => { if (markers?.notifications) { - queryClient.setQueryData(queryKeys.markers.notifications, markers.notifications); + queryClient.setQueryData( + queryKeys.markers.timeline('notifications'), + markers.notifications, + ); } }, }); @@ -359,6 +347,5 @@ export { useNotification, useNotificationsUnreadCount, usePrefetchNotifications, - usePrefetchNotificationsMarker, useProcessStreamNotification, };