diff --git a/src/components/FeedInterstitials.tsx b/src/components/FeedInterstitials.tsx index 6278449a0..b9b08901d 100644 --- a/src/components/FeedInterstitials.tsx +++ b/src/components/FeedInterstitials.tsx @@ -9,6 +9,7 @@ import {type NavigationProp} from '#/lib/routes/types' import {logEvent} from '#/lib/statsig/statsig' import {logger} from '#/logger' import {isIOS} from '#/platform/detection' +import {useHideSimilarAccountsRecomm} from '#/state/preferences/hide-similar-accounts-recommendations' import {useModerationOpts} from '#/state/preferences/moderation-opts' import {useGetPopularFeedsQuery} from '#/state/queries/feed' import {type FeedDescriptor} from '#/state/queries/post-feed' @@ -258,6 +259,9 @@ export function ProfileGrid({ const maxLength = gtMobile ? 3 : isProfileHeaderContext ? 12 : 6 const minLength = gtMobile ? 3 : 4 + // hide similar accounts + const hideSimilarAccountsRecomm = useHideSimilarAccountsRecomm() + const content = isLoading ? Array(maxLength) .fill(0) @@ -363,61 +367,63 @@ export function ProfileGrid({ return null } - return ( - + if (!hideSimilarAccountsRecomm) { + return ( - - {isFeedContext ? ( - Suggested for you - ) : ( - Similar accounts + + + {isFeedContext ? ( + Suggested for you + ) : ( + Similar accounts + )} + + {!isProfileHeaderContext && ( + + See more + )} - - {!isProfileHeaderContext && ( - - See more - - )} - + - {gtMobile ? ( - - - {content} + {gtMobile ? ( + + + {content} + - - ) : ( - - - {content} + ) : ( + + + {content} - {!isProfileHeaderContext && } - - - )} - - ) + {!isProfileHeaderContext && } + + + )} + + ) + } } function SeeMoreSuggestedProfilesCard() { diff --git a/src/screens/Settings/DeerSettings.tsx b/src/screens/Settings/DeerSettings.tsx index 12f3d17be..0ae9ae3fd 100644 --- a/src/screens/Settings/DeerSettings.tsx +++ b/src/screens/Settings/DeerSettings.tsx @@ -61,6 +61,10 @@ import { useHideFeedsPromoTab, useSetHideFeedsPromoTab, } from '#/state/preferences/hide-feeds-promo-tab' +import { + useHideSimilarAccountsRecomm, + useSetHideSimilarAccountsRecomm, +} from '#/state/preferences/hide-similar-accounts-recommendations' import { useHighQualityImages, useSetHighQualityImages, @@ -269,6 +273,9 @@ export function DeerSettingsScreen({}: Props) { const disableReplyMetrics = useDisableReplyMetrics() const setDisableReplyMetrics = useSetDisableReplyMetrics() + const hideSimilarAccountsRecomm = useHideSimilarAccountsRecomm() + const setHideSimilarAccountsRecomm = useSetHideSimilarAccountsRecomm() + const constellationInstance = useConstellationInstance() const setConstellationInstanceControl = Dialog.useDialogControl() @@ -564,6 +571,18 @@ export function DeerSettingsScreen({}: Props) { you like/repost a post someone else has reposted for privacy. + + setHideSimilarAccountsRecomm(value)} + style={[a.w_full]}> + + Hide similar accounts recommendations + + + diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index 79445b4c3..7dca12067 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -140,6 +140,7 @@ const schema = z.object({ disableQuotesMetrics: z.boolean().optional(), disableSavesMetrics: z.boolean().optional(), disableReplyMetrics: z.boolean().optional(), + hideSimilarAccountsRecomm: z.boolean().optional(), deerVerification: z .object({ enabled: z.boolean(), @@ -216,6 +217,7 @@ export const defaults: Schema = { disableQuotesMetrics: false, disableSavesMetrics: false, disableReplyMetrics: false, + hideSimilarAccountsRecomm: false, deerVerification: { enabled: false, // https://social.daniela.lol/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep/post/3lndyqyyr4k2k diff --git a/src/state/preferences/hide-similar-accounts-recommendations.tsx b/src/state/preferences/hide-similar-accounts-recommendations.tsx new file mode 100644 index 000000000..d8b5ff246 --- /dev/null +++ b/src/state/preferences/hide-similar-accounts-recommendations.tsx @@ -0,0 +1,52 @@ +import React from 'react' + +import * as persisted from '#/state/persisted' + +// Preference: hideSimilarAccountsRecomm – when true, hides similar accounts recommendations + +type StateContext = persisted.Schema['hideSimilarAccountsRecomm'] +// Same setter signature used across other preference modules +type SetContext = (v: persisted.Schema['hideSimilarAccountsRecomm']) => void + +const stateContext = React.createContext( + persisted.defaults.hideSimilarAccountsRecomm, +) +const setContext = React.createContext( + (_: persisted.Schema['hideSimilarAccountsRecomm']) => {}, +) + +export function Provider({children}: React.PropsWithChildren<{}>) { + const [state, setState] = React.useState( + persisted.get('hideSimilarAccountsRecomm'), + ) + + const setStateWrapped = React.useCallback( + (value: persisted.Schema['hideSimilarAccountsRecomm']) => { + setState(value) + persisted.write('hideSimilarAccountsRecomm', value) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate('hideSimilarAccountsRecomm', next => { + setState(next) + }) + }, [setStateWrapped]) + + return ( + + + {children} + + + ) +} + +export function useHideSimilarAccountsRecomm() { + return React.useContext(stateContext) +} + +export function useSetHideSimilarAccountsRecomm() { + return React.useContext(setContext) +} diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index 0d43a9a33..83fd5acd4 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -17,6 +17,7 @@ import {Provider as ExternalEmbedsProvider} from './external-embeds-prefs' import {Provider as GoLinksProvider} from './go-links-enabled' import {Provider as HiddenPostsProvider} from './hidden-posts' import {Provider as HideFeedsPromoTabProvider} from './hide-feeds-promo-tab' +import {Provider as HideSimilarAccountsRecommProvider} from './hide-similar-accounts-recommendations' import {Provider as HighQualityImagesProvider} from './high-quality-images' import {Provider as InAppBrowserProvider} from './in-app-browser' import {Provider as KawaiiProvider} from './kawaii' @@ -81,7 +82,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { - {children} + + {children} +