···11import React from 'react'
22import {
33 InteractionManager,
44- StyleProp,
44+ type StyleProp,
55 StyleSheet,
66 View,
77- ViewStyle,
77+ type ViewStyle,
88} from 'react-native'
99-import {MeasuredDimensions, runOnJS, runOnUI} from 'react-native-reanimated'
99+import {
1010+ type MeasuredDimensions,
1111+ runOnJS,
1212+ runOnUI,
1313+} from 'react-native-reanimated'
1014import {Image} from 'expo-image'
1115import {
1216 AppBskyEmbedExternal,
···1822 AppBskyGraphDefs,
1923 moderateFeedGenerator,
2024 moderateUserList,
2121- ModerationDecision,
2525+ type ModerationDecision,
2226} from '@atproto/api'
23272424-import {HandleRef, measureHandle} from '#/lib/hooks/useHandleRef'
2828+import {type HandleRef, measureHandle} from '#/lib/hooks/useHandleRef'
2529import {usePalette} from '#/lib/hooks/usePalette'
2630import {useLightboxControls} from '#/state/lightbox'
2731import {useModerationOpts} from '#/state/preferences/moderation-opts'
···3034import * as ListCard from '#/components/ListCard'
3135import {Embed as StarterPackCard} from '#/components/StarterPack/StarterPackCard'
3236import {ContentHider} from '../../../../components/moderation/ContentHider'
3333-import {Dimensions} from '../../lightbox/ImageViewing/@types'
3737+import {type Dimensions} from '../../lightbox/ImageViewing/@types'
3438import {AutoSizedImage} from '../images/AutoSizedImage'
3539import {ImageLayoutGrid} from '../images/ImageLayoutGrid'
3640import {ExternalLinkEmbed} from './ExternalLinkEmbed'
+58-7
src/view/screens/Home.tsx
···88import {useSetTitle} from '#/lib/hooks/useSetTitle'
99import {useRequestNotificationsPermission} from '#/lib/notifications/notifications'
1010import {
1111- HomeTabNavigatorParams,
1212- NativeStackScreenProps,
1111+ type HomeTabNavigatorParams,
1212+ type NativeStackScreenProps,
1313} from '#/lib/routes/types'
1414import {logEvent} from '#/lib/statsig/statsig'
1515import {isWeb} from '#/platform/detection'
1616import {emitSoftReset} from '#/state/events'
1717-import {SavedFeedSourceInfo, usePinnedFeedsInfos} from '#/state/queries/feed'
1818-import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed'
1717+import {
1818+ type SavedFeedSourceInfo,
1919+ usePinnedFeedsInfos,
2020+} from '#/state/queries/feed'
2121+import {type FeedDescriptor, type FeedParams} from '#/state/queries/post-feed'
1922import {usePreferencesQuery} from '#/state/queries/preferences'
2020-import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
2323+import {type UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
2124import {useSession} from '#/state/session'
2225import {useSetMinimalShellMode} from '#/state/shell'
2326import {useLoggedOutViewControls} from '#/state/shell/logged-out'
2427import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed'
2528import {FeedPage} from '#/view/com/feeds/FeedPage'
2629import {HomeHeader} from '#/view/com/home/HomeHeader'
2727-import {Pager, PagerRef, RenderTabBarFnProps} from '#/view/com/pager/Pager'
3030+import {
3131+ Pager,
3232+ type PagerRef,
3333+ type RenderTabBarFnProps,
3434+} from '#/view/com/pager/Pager'
2835import {CustomFeedEmptyState} from '#/view/com/posts/CustomFeedEmptyState'
2936import {FollowingEmptyState} from '#/view/com/posts/FollowingEmptyState'
3037import {FollowingEndOfFeed} from '#/view/com/posts/FollowingEndOfFeed'
3138import {NoFeedsPinned} from '#/screens/Home/NoFeedsPinned'
3239import * as Layout from '#/components/Layout'
4040+import {useDemoMode} from '#/storage/hooks/demo-mode'
33413442type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home' | 'Start'>
3543export function HomeScreen(props: Props) {
···184192 [setMinimalShellMode],
185193 )
186194195195+ const [demoMode] = useDemoMode()
196196+187197 const renderTabBar = React.useCallback(
188198 (props: RenderTabBarFnProps) => {
199199+ if (demoMode) {
200200+ return (
201201+ <HomeHeader
202202+ key="FEEDS_TAB_BAR"
203203+ {...props}
204204+ testID="homeScreenFeedTabs"
205205+ onPressSelected={onPressSelected}
206206+ // @ts-ignore
207207+ feeds={[{displayName: 'Following'}, {displayName: 'Discover'}]}
208208+ />
209209+ )
210210+ }
189211 return (
190212 <HomeHeader
191213 key="FEEDS_TAB_BAR"
···196218 />
197219 )
198220 },
199199- [onPressSelected, pinnedFeedInfos],
221221+ [onPressSelected, pinnedFeedInfos, demoMode],
200222 )
201223202224 const renderFollowingEmptyState = React.useCallback(() => {
···217239 : [],
218240 }
219241 }, [preferences])
242242+243243+ if (demoMode) {
244244+ return (
245245+ <Pager
246246+ ref={pagerRef}
247247+ testID="homeScreen"
248248+ onPageSelected={onPageSelected}
249249+ onPageScrollStateChanged={onPageScrollStateChanged}
250250+ renderTabBar={renderTabBar}
251251+ initialPage={selectedIndex}>
252252+ <FeedPage
253253+ testID="demoFeedPage"
254254+ isPageFocused
255255+ isPageAdjacent={false}
256256+ feed="demo"
257257+ renderEmptyState={renderCustomFeedEmptyState}
258258+ feedInfo={pinnedFeedInfos[0]}
259259+ />
260260+ <FeedPage
261261+ testID="customFeedPage"
262262+ isPageFocused
263263+ isPageAdjacent={false}
264264+ feed={`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`}
265265+ renderEmptyState={renderCustomFeedEmptyState}
266266+ feedInfo={pinnedFeedInfos[0]}
267267+ />
268268+ </Pager>
269269+ )
270270+ }
220271221272 return hasSession ? (
222273 <Pager
+9-5
src/view/shell/bottom-bar/BottomBar.tsx
···11-import React, {ComponentProps} from 'react'
22-import {GestureResponderEvent, View} from 'react-native'
11+import React, {type ComponentProps} from 'react'
22+import {type GestureResponderEvent, View} from 'react-native'
33import Animated from 'react-native-reanimated'
44import {useSafeAreaInsets} from 'react-native-safe-area-context'
55import {msg, plural, Trans} from '@lingui/macro'
66import {useLingui} from '@lingui/react'
77-import {BottomTabBarProps} from '@react-navigation/bottom-tabs'
77+import {type BottomTabBarProps} from '@react-navigation/bottom-tabs'
88import {StackActions} from '@react-navigation/native'
991010import {PressableScale} from '#/lib/custom-animations/PressableScale'
1111+import {BOTTOM_BAR_AVI} from '#/lib/demo'
1112import {useHaptics} from '#/lib/haptics'
1213import {useDedupe} from '#/lib/hooks/useDedupe'
1314import {useMinimalShellFooterTransform} from '#/lib/hooks/useMinimalShellTransform'
···4748 Message_Stroke2_Corner0_Rounded as Message,
4849 Message_Stroke2_Corner0_Rounded_Filled as MessageFilled,
4950} from '#/components/icons/Message'
5151+import {useDemoMode} from '#/storage/hooks/demo-mode'
5052import {styles} from './BottomBarStyles'
51535254type TabOptions =
···123125 playHaptic()
124126 accountSwitchControl.open()
125127 }, [accountSwitchControl, playHaptic])
128128+129129+ const [demoMode] = useDemoMode()
126130127131 return (
128132 <>
···259263 {borderColor: pal.text.color},
260264 ]}>
261265 <UserAvatar
262262- avatar={profile?.avatar}
266266+ avatar={demoMode ? BOTTOM_BAR_AVI : profile?.avatar}
263267 size={iconWidth - 3}
264268 // See https://github.com/bluesky-social/social-app/pull/1801:
265269 usePlainRNImage={true}
···270274 <View
271275 style={[styles.ctrlIcon, pal.text, styles.profileIcon]}>
272276 <UserAvatar
273273- avatar={profile?.avatar}
277277+ avatar={demoMode ? BOTTOM_BAR_AVI : profile?.avatar}
274278 size={iconWidth - 3}
275279 // See https://github.com/bluesky-social/social-app/pull/1801:
276280 usePlainRNImage={true}