From 79ea07098dd1ac8cc2acdd8b27c79bcaf8f83d46 Mon Sep 17 00:00:00 2001 From: Chad Curtis Date: Sat, 14 Mar 2026 11:15:59 -0500 Subject: [PATCH] fix: use all picker kinds when kind filter is set to 'all' parseKindFilter returned undefined for 'all', causing useStreamPosts to fall back to the user's enabled feed-settings kinds instead of every kind in the kind picker list. Now kindsOverride always contains explicit kind numbers: all picker kinds when filter is 'all', or the specific selection otherwise. --- src/hooks/useStreamPosts.ts | 6 +++--- src/pages/SearchPage.tsx | 17 +++++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/hooks/useStreamPosts.ts b/src/hooks/useStreamPosts.ts index d0e93f0f..e167c64a 100644 --- a/src/hooks/useStreamPosts.ts +++ b/src/hooks/useStreamPosts.ts @@ -206,11 +206,11 @@ export function useStreamPosts(query: string, options: StreamPostsOptions) { } else if (options.mediaType === 'vines') { kinds = [22, 34236]; // shorts + vines } else if (options.mediaType === 'videos') { - kinds = [1, 21, 22, ...enabledKinds.filter((k) => !isRepostKind(k))]; + kinds = [21, 22, ...enabledKinds.filter((k) => !isRepostKind(k))]; } else if (options.mediaType === 'images') { - kinds = [1, 20, ...enabledKinds.filter((k) => !isRepostKind(k))]; + kinds = [20, ...enabledKinds.filter((k) => !isRepostKind(k))]; } else { - kinds = [1, ...enabledKinds.filter((k) => !isRepostKind(k))]; + kinds = enabledKinds.filter((k) => !isRepostKind(k)); } // Deduplicate kinds = [...new Set(kinds)]; diff --git a/src/pages/SearchPage.tsx b/src/pages/SearchPage.tsx index 8567810c..8a61778a 100644 --- a/src/pages/SearchPage.tsx +++ b/src/pages/SearchPage.tsx @@ -255,14 +255,19 @@ export function SearchPage() { const kindOptions = useMemo(() => buildKindOptions(), []); - // Resolve kindsOverride from the current kind filter state - const kindsOverride = useMemo( - () => parseKindFilter(kindFilter, customKindText), - [kindFilter, customKindText], + // All kind numbers available in the picker — used as the "all kinds" default. + const allKindNumbers = useMemo(() => kindOptions.map((o) => Number(o.value)), [kindOptions]); + + // Resolve kindsOverride from the current kind filter state. + // "all" means every kind in the picker list, not undefined (which would let + // useStreamPosts fall back to only the user's enabled feed-settings kinds). + const kindsOverride = useMemo( + () => kindFilter === 'all' ? allKindNumbers : (parseKindFilter(kindFilter, customKindText) ?? allKindNumbers), + [kindFilter, customKindText, allKindNumbers], ); // Detect kind + media type conflict: a specific kind is selected AND a media type is set - const hasKindMediaConflict = kindsOverride !== undefined && mediaType !== 'all'; + const hasKindMediaConflict = kindFilter !== 'all' && kindsOverride.length > 0 && mediaType !== 'all'; // Determine if any filter differs from the default const hasActiveFilters = !includeReplies || mediaType !== DEFAULT_FILTERS.mediaType || @@ -294,7 +299,7 @@ export function SearchPage() { : ['protocol:nostr']; if (debouncedSearchQuery.trim()) parts.push(debouncedSearchQuery.trim()); if (language !== 'global') parts.push(`language:${language}`); - const isDedicatedKindQuery = !kindsOverride && (mediaType === 'vines' || mediaType === 'images' || mediaType === 'videos'); + const isDedicatedKindQuery = kindFilter === 'all' && (mediaType === 'vines' || mediaType === 'images' || mediaType === 'videos'); if (!isDedicatedKindQuery && !hasKindMediaConflict) { if (mediaType === 'images') { parts.push('media:true'); parts.push('video:false'); } else if (mediaType === 'videos') parts.push('video:true');