import React from 'react' import {useWindowDimensions} from 'react-native' import {useFocusEffect} from '@react-navigation/native' import {observer} from 'mobx-react-lite' import isEqual from 'lodash.isequal' import {NativeStackScreenProps, HomeTabNavigatorParams} from 'lib/routes/types' import {PostsFeedModel} from 'state/models/feeds/posts' import {withAuthRequired} from 'view/com/auth/withAuthRequired' import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState' import {FollowingEndOfFeed} from 'view/com/posts/FollowingEndOfFeed' import {CustomFeedEmptyState} from 'view/com/posts/CustomFeedEmptyState' import {FeedsTabBar} from '../com/pager/FeedsTabBar' import {Pager, PagerRef, RenderTabBarFnProps} from 'view/com/pager/Pager' import {useStores} from 'state/index' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {FeedPage} from 'view/com/feeds/FeedPage' export const POLL_FREQ = 30e3 // 30sec type Props = NativeStackScreenProps export const HomeScreen = withAuthRequired( observer(function HomeScreenImpl({}: Props) { const store = useStores() const pagerRef = React.useRef(null) const [selectedPage, setSelectedPage] = React.useState(0) const [customFeeds, setCustomFeeds] = React.useState([]) const [requestedCustomFeeds, setRequestedCustomFeeds] = React.useState< string[] >([]) React.useEffect(() => { const pinned = store.preferences.pinnedFeeds if (isEqual(pinned, requestedCustomFeeds)) { // no changes return } const feeds = [] for (const uri of pinned) { if (uri.includes('app.bsky.feed.generator')) { const model = new PostsFeedModel(store, 'custom', {feed: uri}) feeds.push(model) } else if (uri.includes('app.bsky.graph.list')) { const model = new PostsFeedModel(store, 'list', {list: uri}) feeds.push(model) } } pagerRef.current?.setPage(0) setCustomFeeds(feeds) setRequestedCustomFeeds(pinned) }, [ store, store.preferences.pinnedFeeds, customFeeds, setCustomFeeds, pagerRef, requestedCustomFeeds, setRequestedCustomFeeds, ]) useFocusEffect( React.useCallback(() => { store.shell.setMinimalShellMode(false) store.shell.setIsDrawerSwipeDisabled(selectedPage > 0) return () => { store.shell.setIsDrawerSwipeDisabled(false) } }, [store, selectedPage]), ) const onPageSelected = React.useCallback( (index: number) => { store.shell.setMinimalShellMode(false) setSelectedPage(index) store.shell.setIsDrawerSwipeDisabled(index > 0) }, [store, setSelectedPage], ) const onPressSelected = React.useCallback(() => { store.emitScreenSoftReset() }, [store]) const renderTabBar = React.useCallback( (props: RenderTabBarFnProps) => { return ( ) }, [onPressSelected], ) const renderFollowingEmptyState = React.useCallback(() => { return }, []) const renderCustomFeedEmptyState = React.useCallback(() => { return }, []) return ( {customFeeds.map((f, index) => { return ( ) })} ) }), ) export function useHeaderOffset() { const {isDesktop, isTablet} = useWebMediaQueries() const {fontScale} = useWindowDimensions() if (isDesktop) { return 0 } if (isTablet) { return 50 } // default text takes 44px, plus 34px of pad // scale the 44px by the font scale return 34 + 44 * fontScale }