diff --git a/app/javascript/flavours/glitch/api_types/accounts.ts b/app/javascript/flavours/glitch/api_types/accounts.ts index 913a201fef..9fe076ce96 100644 --- a/app/javascript/flavours/glitch/api_types/accounts.ts +++ b/app/javascript/flavours/glitch/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/flavours/glitch/features/collections/editor/accounts.tsx b/app/javascript/flavours/glitch/features/collections/editor/accounts.tsx index b01ecac39d..dcf5d9580e 100644 --- a/app/javascript/flavours/glitch/features/collections/editor/accounts.tsx +++ b/app/javascript/flavours/glitch/features/collections/editor/accounts.tsx @@ -132,7 +132,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/flavours/glitch/features/lists/use_search_accounts.ts b/app/javascript/flavours/glitch/features/lists/use_search_accounts.ts index d707adad46..90c25e7b48 100644 --- a/app/javascript/flavours/glitch/features/lists/use_search_accounts.ts +++ b/app/javascript/flavours/glitch/features/lists/use_search_accounts.ts @@ -10,8 +10,10 @@ import { useAppDispatch } from 'flavours/glitch/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/flavours/glitch/models/account.ts b/app/javascript/flavours/glitch/models/account.ts index e9117d8113..2b403130ec 100644 --- a/app/javascript/flavours/glitch/models/account.ts +++ b/app/javascript/flavours/glitch/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: '',