From 39ff07bc89f5e2a73465842ad9fd38400c2c9679 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 19 Feb 2026 17:43:31 +0100 Subject: [PATCH] Only suggest `discoverable` accounts in collection account editor (#37920) --- app/javascript/mastodon/api_types/accounts.ts | 21 +++++++++++++++++++ .../features/collections/editor/accounts.tsx | 6 +++++- .../features/lists/use_search_accounts.ts | 7 +++++-- app/javascript/mastodon/models/account.ts | 5 +++++ app/javascript/testing/factories.ts | 5 +++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/app/javascript/mastodon/api_types/accounts.ts b/app/javascript/mastodon/api_types/accounts.ts index 913a201fef4..9fe076ce96d 100644 --- a/app/javascript/mastodon/api_types/accounts.ts +++ b/app/javascript/mastodon/api_types/accounts.ts @@ -12,6 +12,26 @@ export interface ApiAccountRoleJSON { name: string; } +type ApiFeaturePolicy = + | 'public' + | 'followers' + | 'following' + | 'disabled' + | 'unsupported_policy'; + +type ApiUserFeaturePolicy = + | 'automatic' + | 'manual' + | 'denied' + | 'missing' + | 'unknown'; + +interface ApiFeaturePolicyJSON { + automatic: ApiFeaturePolicy[]; + manual: ApiFeaturePolicy[]; + current_user: ApiUserFeaturePolicy; +} + // See app/serializers/rest/account_serializer.rb export interface BaseApiAccountJSON { acct: string; @@ -23,6 +43,7 @@ export interface BaseApiAccountJSON { indexable: boolean; display_name: string; emojis: ApiCustomEmojiJSON[]; + feature_approval: ApiFeaturePolicyJSON; fields: ApiAccountFieldJSON[]; followers_count: number; following_count: number; diff --git a/app/javascript/mastodon/features/collections/editor/accounts.tsx b/app/javascript/mastodon/features/collections/editor/accounts.tsx index 4266de94d1a..f20c9eb2e8e 100644 --- a/app/javascript/mastodon/features/collections/editor/accounts.tsx +++ b/app/javascript/mastodon/features/collections/editor/accounts.tsx @@ -129,7 +129,11 @@ export const CollectionAccounts: React.FC<{ accountIds: suggestedAccountIds, isLoading: isLoadingSuggestions, searchAccounts, - } = useSearchAccounts(); + } = useSearchAccounts({ + filterResults: (account) => + // Only suggest accounts who allow being featured/recommended + account.feature_approval.current_user === 'automatic', + }); const suggestedItems = suggestedAccountIds.map((id) => ({ id, diff --git a/app/javascript/mastodon/features/lists/use_search_accounts.ts b/app/javascript/mastodon/features/lists/use_search_accounts.ts index d5a86998fb1..30d3d26ce19 100644 --- a/app/javascript/mastodon/features/lists/use_search_accounts.ts +++ b/app/javascript/mastodon/features/lists/use_search_accounts.ts @@ -10,8 +10,10 @@ import { useAppDispatch } from 'mastodon/store'; export function useSearchAccounts({ resetOnInputClear = true, onSettled, + filterResults, }: { onSettled?: (value: string) => void; + filterResults?: (account: ApiAccountJSON) => boolean; resetOnInputClear?: boolean; } = {}) { const dispatch = useAppDispatch(); @@ -49,8 +51,9 @@ export function useSearchAccounts({ }, }) .then((data) => { - dispatch(importFetchedAccounts(data)); - setAccountIds(data.map((a) => a.id)); + const accounts = filterResults ? data.filter(filterResults) : data; + dispatch(importFetchedAccounts(accounts)); + setAccountIds(accounts.map((a) => a.id)); setLoadingState('idle'); onSettled?.(value); }) diff --git a/app/javascript/mastodon/models/account.ts b/app/javascript/mastodon/models/account.ts index b834a022ad0..c8109fffb50 100644 --- a/app/javascript/mastodon/models/account.ts +++ b/app/javascript/mastodon/models/account.ts @@ -69,6 +69,11 @@ export const accountDefaultValues: AccountShape = { display_name: '', display_name_html: '', emojis: ImmutableList(), + feature_approval: { + automatic: [], + manual: [], + current_user: 'missing', + }, fields: ImmutableList(), group: false, header: '', diff --git a/app/javascript/testing/factories.ts b/app/javascript/testing/factories.ts index 7855157f6a0..1efd22c3c97 100644 --- a/app/javascript/testing/factories.ts +++ b/app/javascript/testing/factories.ts @@ -31,6 +31,11 @@ export const accountFactory: FactoryFunction = ({ created_at: '2023-01-01T00:00:00.000Z', discoverable: true, emojis: [], + feature_approval: { + automatic: [], + manual: [], + current_user: 'missing', + }, fields: [], followers_count: 0, following_count: 0,