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.
This commit is contained in:
Chad Curtis
2026-03-14 11:15:59 -05:00
parent cf1edc3230
commit 79ea07098d
2 changed files with 14 additions and 9 deletions
+3 -3
View File
@@ -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)];
+11 -6
View File
@@ -255,14 +255,19 @@ export function SearchPage() {
const kindOptions = useMemo(() => buildKindOptions(), []);
// Resolve kindsOverride from the current kind filter state
const kindsOverride = useMemo<number[] | undefined>(
() => 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<number[]>(
() => 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');