From a94f3b9c336f9ba61aea92c4ef934c161dc3a9c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Thu, 5 Mar 2026 15:58:00 +0100 Subject: [PATCH] nicolium: restore error handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- .../src/pages/timelines/landing-timeline.tsx | 8 ++++---- .../nicolium/src/queries/timelines/use-timeline.ts | 6 +++--- packages/nicolium/src/stores/timelines.ts | 12 ++++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/nicolium/src/pages/timelines/landing-timeline.tsx b/packages/nicolium/src/pages/timelines/landing-timeline.tsx index 2b8bef735..770465dc8 100644 --- a/packages/nicolium/src/pages/timelines/landing-timeline.tsx +++ b/packages/nicolium/src/pages/timelines/landing-timeline.tsx @@ -1,5 +1,5 @@ import clsx from 'clsx'; -import React, { useState } from 'react'; +import React from 'react'; import { FormattedMessage } from 'react-intl'; import { PublicTimelineColumn } from '@/columns/timeline'; @@ -12,6 +12,7 @@ import Stack from '@/components/ui/stack'; import { useInstance } from '@/hooks/use-instance'; import { useRegistrationStatus } from '@/hooks/use-registration-status'; import { About } from '@/pages/utils/about'; +import { usePublicTimeline } from '@/queries/timelines/use-timelines'; import { getTextDirection } from '@/utils/rtl'; interface ILogoText extends Pick, 'className' | 'dir'> { @@ -53,8 +54,7 @@ const LandingTimelinePage = () => { const instance = useInstance(); const { isOpen } = useRegistrationStatus(); - // todo fix this - const [timelineFailed, _setTimelineFailed] = useState(false); + const { isError } = usePublicTimeline({ local: true }); const timelineEnabled = !instance.pleroma.metadata.restrict_unauthenticated.timelines.local; @@ -75,7 +75,7 @@ const LandingTimelinePage = () => { )} - {timelineEnabled && !timelineFailed ? ( + {timelineEnabled && !isError ? ( { - if (!timeline.isPending) return; + if (!timeline.isPending || timeline.isFetching) return; fetchInitial(); }, []); @@ -32,7 +32,7 @@ const useTimeline = (timelineId: string, fetcher: TimelineFetcher, streamConfig? importEntities({ statuses: response.items }); timelineActions.expandTimeline(timelineId, response.items, !!response.next, true); } catch (error) { - // + timelineActions.setError(timelineId, true); } }, [timelineId]); @@ -46,7 +46,7 @@ const useTimeline = (timelineId: string, fetcher: TimelineFetcher, streamConfig? timelineActions.expandTimeline(timelineId, response.items, !!response.next, false); } catch (error) { - // + timelineActions.setError(timelineId, true); } }, [timelineId, timeline.oldestStatusId]); diff --git a/packages/nicolium/src/stores/timelines.ts b/packages/nicolium/src/stores/timelines.ts index d23070cc9..b9cb23a57 100644 --- a/packages/nicolium/src/stores/timelines.ts +++ b/packages/nicolium/src/stores/timelines.ts @@ -31,6 +31,7 @@ interface TimelineData { queuedCount: number; isFetching: boolean; isPending: boolean; + isError: boolean; hasNextPage: boolean; oldestStatusId?: string; } @@ -47,6 +48,7 @@ interface State { receiveStreamingStatus: (timelineId: string, status: Status) => void; deleteStatus: (statusId: string) => void; setLoading: (timelineId: string, isFetching: boolean) => void; + setError: (timelineId: string, isError: boolean) => void; dequeueEntries: (timelineId: string) => void; importPendingStatus: (params: CreateStatusParams, idempotencyKey: string) => void; replacePendingStatus: (idempotencyKey: string, newId: string) => void; @@ -193,6 +195,15 @@ const useTimelinesStore = create()( if (!isFetching) timeline.isPending = false; state.timelines[timelineId] = timeline; }), + setError: (timelineId, isError) => + set((state) => { + const timeline = state.timelines[timelineId] ?? createEmptyTimeline(); + + timeline.isFetching = false; + timeline.isPending = false; + timeline.isError = isError; + state.timelines[timelineId] = timeline; + }), dequeueEntries: (timelineId) => set((state) => { const timeline = state.timelines[timelineId]; @@ -289,6 +300,7 @@ const createEmptyTimeline = (): TimelineData => ({ queuedCount: 0, isFetching: false, isPending: true, + isError: false, hasNextPage: true, oldestStatusId: undefined, });