diff --git a/src/screens/Settings/DeerSettings.tsx b/src/screens/Settings/DeerSettings.tsx index f04cb5955..fde918990 100644 --- a/src/screens/Settings/DeerSettings.tsx +++ b/src/screens/Settings/DeerSettings.tsx @@ -34,6 +34,10 @@ import { useDirectFetchRecords, useSetDirectFetchRecords, } from '#/state/preferences/direct-fetch-records' +import { + useHideFeedsPromoTab, + useSetHideFeedsPromoTab, +} from '#/state/preferences/hide-feeds-promo-tab' import { useHideFollowNotifications, useSetHideFollowNotifications, @@ -263,6 +267,9 @@ export function DeerSettingsScreen({}: Props) { const hideFollowNotifications = useHideFollowNotifications() const setHideFollowNotifications = useSetHideFollowNotifications() + const hideFeedsPromoTab = useHideFeedsPromoTab() + const setHideFeedsPromoTab = useSetHideFeedsPromoTab() + const location = useGeolocation() const setLocationControl = Dialog.useDialogControl() @@ -521,6 +528,19 @@ export function DeerSettingsScreen({}: Props) { + setHideFeedsPromoTab(value)} + style={[a.w_full]}> + + Hide "Feeds ✨" tab when only one feed is selected + + + diff --git a/src/state/persisted/schema.ts b/src/state/persisted/schema.ts index df03cfd73..afc497d9b 100644 --- a/src/state/persisted/schema.ts +++ b/src/state/persisted/schema.ts @@ -134,6 +134,7 @@ const schema = z.object({ hideFollowNotifications: z.boolean().optional(), constellationInstance: z.string().optional(), showLinkInHandle: z.boolean().optional(), + hideFeedsPromoTab: z.boolean().optional(), deerVerification: z .object({ enabled: z.boolean(), @@ -203,6 +204,7 @@ export const defaults: Schema = { hideFollowNotifications: false, constellationInstance: 'https://constellation.microcosm.blue/', showLinkInHandle: false, + hideFeedsPromoTab: false, deerVerification: { enabled: false, // https://deer.social/profile/did:plc:p2cp5gopk7mgjegy6wadk3ep/post/3lndyqyyr4k2k diff --git a/src/state/preferences/hide-feeds-promo-tab.tsx b/src/state/preferences/hide-feeds-promo-tab.tsx new file mode 100644 index 000000000..4479c1842 --- /dev/null +++ b/src/state/preferences/hide-feeds-promo-tab.tsx @@ -0,0 +1,50 @@ +import React from 'react' + +import * as persisted from '#/state/persisted' + +// Preference: hideFeedsPromoTab – when true, suppress the "Feeds ✨" promotional tab in HomeHeader. + +type StateContext = persisted.Schema['hideFeedsPromoTab'] +// Same setter signature used across other preference modules +type SetContext = (v: persisted.Schema['hideFeedsPromoTab']) => void + +const stateContext = React.createContext( + persisted.defaults.hideFeedsPromoTab, +) +const setContext = React.createContext( + (_: persisted.Schema['hideFeedsPromoTab']) => {}, +) + +export function Provider({children}: React.PropsWithChildren<{}>) { + const [state, setState] = React.useState(persisted.get('hideFeedsPromoTab')) + + const setStateWrapped = React.useCallback( + (value: persisted.Schema['hideFeedsPromoTab']) => { + setState(value) + persisted.write('hideFeedsPromoTab', value) + }, + [setState], + ) + + React.useEffect(() => { + return persisted.onUpdate('hideFeedsPromoTab', next => { + setState(next) + }) + }, [setStateWrapped]) + + return ( + + + {children} + + + ) +} + +export function useHideFeedsPromoTab() { + return React.useContext(stateContext) +} + +export function useSetHideFeedsPromoTab() { + return React.useContext(setContext) +} \ No newline at end of file diff --git a/src/state/preferences/index.tsx b/src/state/preferences/index.tsx index f7a00d62e..9f4188729 100644 --- a/src/state/preferences/index.tsx +++ b/src/state/preferences/index.tsx @@ -8,9 +8,10 @@ import {Provider as DeerVerificationProvider} from './deer-verification' import {Provider as DirectFetchRecordsProvider} from './direct-fetch-records' import {Provider as DisableHapticsProvider} from './disable-haptics' import {Provider as ExternalEmbedsProvider} from './external-embeds-prefs' +import {Provider as FollowNotificationsProvider} from './hide-follow-notifications' import {Provider as GoLinksProvider} from './go-links-enabled' import {Provider as HiddenPostsProvider} from './hidden-posts' -import {Provider as FollowNotificationsProvider} from './hide-follow-notifications' +import {Provider as HideFeedsPromoTabProvider} from './hide-feeds-promo-tab' import {Provider as InAppBrowserProvider} from './in-app-browser' import {Provider as KawaiiProvider} from './kawaii' import {Provider as LanguagesProvider} from './languages' @@ -35,6 +36,7 @@ export { } from './external-embeds-prefs' export {useGoLinksEnabled, useSetGoLinksEnabled} from './go-links-enabled' export * from './hidden-posts' +export {useHideFeedsPromoTab, useSetHideFeedsPromoTab} from './hide-feeds-promo-tab' export {useLabelDefinitions} from './label-defs' export {useLanguagePrefs, useLanguagePrefsApi} from './languages' export {useSetSubtitlesEnabled, useSubtitlesEnabled} from './subtitles' @@ -63,7 +65,9 @@ export function Provider({children}: React.PropsWithChildren<{}>) { - {children} + + {children} + diff --git a/src/view/com/home/HomeHeader.tsx b/src/view/com/home/HomeHeader.tsx index 0ec9ac753..9c647c8ee 100644 --- a/src/view/com/home/HomeHeader.tsx +++ b/src/view/com/home/HomeHeader.tsx @@ -1,5 +1,6 @@ import React from 'react' import {useNavigation} from '@react-navigation/native' +import {useHideFeedsPromoTab} from '#/state/preferences/hide-feeds-promo-tab' import {NavigationProp} from '#/lib/routes/types' import {FeedSourceInfo} from '#/state/queries/feed' @@ -17,6 +18,7 @@ export function HomeHeader( ) { const {feeds} = props const {hasSession} = useSession() + const hideFeedsPromoTab = useHideFeedsPromoTab() const navigation = useNavigation() const hasPinnedCustom = React.useMemo(() => { @@ -29,11 +31,11 @@ export function HomeHeader( const items = React.useMemo(() => { const pinnedNames = feeds.map(f => f.displayName) - if (!hasPinnedCustom) { + if (!hasPinnedCustom && !hideFeedsPromoTab) { return pinnedNames.concat('Feeds ✨') } return pinnedNames - }, [hasPinnedCustom, feeds]) + }, [hasPinnedCustom, hideFeedsPromoTab, feeds]) const onPressFeedsLink = React.useCallback(() => { navigation.navigate('Feeds') @@ -41,13 +43,13 @@ export function HomeHeader( const onSelect = React.useCallback( (index: number) => { - if (!hasPinnedCustom && index === items.length - 1) { + if (!hasPinnedCustom && !hideFeedsPromoTab && index === items.length - 1) { onPressFeedsLink() } else if (props.onSelect) { props.onSelect(index) } }, - [items.length, onPressFeedsLink, props, hasPinnedCustom], + [items.length, onPressFeedsLink, props, hasPinnedCustom, hideFeedsPromoTab], ) return (