From c8e380a5726a64730b475a3b347b6c01dcfb72ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?nicole=20miko=C5=82ajczyk?= Date: Sun, 8 Mar 2026 13:36:34 +0100 Subject: [PATCH] nicolium: a bugged filtering implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: nicole mikołajczyk --- packages/nicolium/src/columns/timeline.tsx | 18 +++++++++- .../src/features/preferences/index.tsx | 36 +++++++++++++++++-- .../nicolium/src/schemas/frontend-settings.ts | 13 +++---- packages/nicolium/src/stores/timelines.ts | 4 +++ 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/packages/nicolium/src/columns/timeline.tsx b/packages/nicolium/src/columns/timeline.tsx index a2937e029..6d77d6094 100644 --- a/packages/nicolium/src/columns/timeline.tsx +++ b/packages/nicolium/src/columns/timeline.tsx @@ -32,9 +32,11 @@ import { usePublicTimeline, useWrenchedTimeline, } from '@/queries/timelines/use-timelines'; +import { useSettings } from '@/stores/settings'; import { selectChild } from '@/utils/scroll-utils'; import type { FilterContextType } from '@/queries/settings/use-filters'; +import type { Settings } from '@/schemas/frontend-settings'; import type { TimelineEntry } from '@/stores/timelines'; import type { VirtuosoHandle } from 'react-virtuoso'; @@ -368,6 +370,7 @@ type IBaseTimeline = Pick< 'emptyMessageIcon' | 'emptyMessageText' | 'onTopItemChanged' > & { featuredStatusIds?: Array; + filters?: Settings['timelines'][string]; }; interface ITimeline extends IBaseTimeline { @@ -379,6 +382,7 @@ const Timeline: React.FC = ({ query, contextType = 'public', featuredStatusIds, + filters, ...props }) => { const node = useRef(null); @@ -426,6 +430,15 @@ const Timeline: React.FC = ({ const renderEntry = (entry: TimelineEntry, index: number) => { if (entry.type === 'status') { + if ( + (filters?.showDirect === false && entry.isDirect) || + (filters?.showReblogs === false && entry.isReblog) || + (filters?.showReplies === false && entry.isReply) || + (filters?.showQuotes === false && entry.isQuote) || + (filters?.showNonMedia === false && !entry.hasMedia) + ) { + return null; + } return ( = ({ } return rendered; - }, [entries, contextType, timelineId, featuredStatusIds]); + }, [entries, contextType, timelineId, featuredStatusIds, filters]); return ( <> @@ -533,6 +546,8 @@ const getRestoredPosition = (me: string) => { const HomeTimelineColumn: React.FC = (props) => { const me = useAppSelector((state) => state.me); + const timelineFilters = useSettings().timelines.home; + const maxId = useMemo(() => { if (!me) return undefined; @@ -563,6 +578,7 @@ const HomeTimelineColumn: React.FC = (props) => { query={timelineQuery} contextType='home' onTopItemChanged={handleTopItemChanged} + filters={timelineFilters} {...props} /> ); diff --git a/packages/nicolium/src/features/preferences/index.tsx b/packages/nicolium/src/features/preferences/index.tsx index e14e438e3..3a201f294 100644 --- a/packages/nicolium/src/features/preferences/index.tsx +++ b/packages/nicolium/src/features/preferences/index.tsx @@ -318,7 +318,7 @@ const Preferences = () => { > @@ -334,7 +334,39 @@ const Preferences = () => { > + + + + } + > + + + + + } + > + diff --git a/packages/nicolium/src/schemas/frontend-settings.ts b/packages/nicolium/src/schemas/frontend-settings.ts index 90345c595..c11cc958f 100644 --- a/packages/nicolium/src/schemas/frontend-settings.ts +++ b/packages/nicolium/src/schemas/frontend-settings.ts @@ -78,14 +78,11 @@ const settingsSchema = v.object({ v.record( v.string(), coerceObject({ - shows: coerceObject({ - reblog: v.optional(v.boolean(), true), - reply: v.optional(v.boolean(), true), - direct: v.optional(v.boolean(), false), - }), - other: coerceObject({ - onlyMedia: v.optional(v.boolean(), false), - }), + showReblogs: v.optional(v.boolean(), true), + showReplies: v.optional(v.boolean(), true), + showQuotes: v.optional(v.boolean(), true), + showDirect: v.optional(v.boolean(), true), + showNonMedia: v.optional(v.boolean(), true), }), ), {}, diff --git a/packages/nicolium/src/stores/timelines.ts b/packages/nicolium/src/stores/timelines.ts index 2d57e4e2c..981d39fa3 100644 --- a/packages/nicolium/src/stores/timelines.ts +++ b/packages/nicolium/src/stores/timelines.ts @@ -20,6 +20,7 @@ type TimelineEntry = // this actually indicates whether the status exclusively appeared as a reblog on the processed page isReblog: boolean; isQuote: boolean; + isDirect: boolean; hasMedia: boolean; } | { @@ -128,6 +129,7 @@ const processPage = (statuses: Array): Array => { isReply: status.reblog.in_reply_to_id !== null, isReblog: true, isQuote: status.reblog.quote !== null, + isDirect: status.reblog.visibility === 'direct', hasMedia: status.reblog.media_attachments.length > 0, }); } @@ -144,6 +146,7 @@ const processPage = (statuses: Array): Array => { isReply: status.in_reply_to_id !== null, isReblog: false, isQuote: status.quote !== null, + isDirect: status.visibility === 'direct', hasMedia: status.media_attachments.length > 0, }); @@ -346,6 +349,7 @@ const useTimelinesStore = create()( isReply: status.in_reply_to_id !== null, isReblog: false, isQuote: status.quote !== null, + isDirect: status.visibility === 'direct', hasMedia: status.media_attachments.length > 0, }; }