about summary refs log tree commit diff
diff options
context:
space:
mode:
authordan <dan.abramov@gmail.com>2023-11-16 22:37:48 +0000
committerGitHub <noreply@github.com>2023-11-16 14:37:48 -0800
commit22df70b3cc7ee2aa96aad3a724e885014ae28cd1 (patch)
tree51a497c488fee6ca526a90ea8958deb037aee5be
parent8475312422579c2c7d2798fcd0ff58009c366690 (diff)
downloadvoidsky-22df70b3cc7ee2aa96aad3a724e885014ae28cd1.tar.zst
Fix blank feed (#1935)
* Split feed into two components

* Rm unused

* Add a spinner
-rw-r--r--src/view/screens/Home.tsx53
1 files changed, 35 insertions, 18 deletions
diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx
index 50db7e81f..18a0cbc15 100644
--- a/src/view/screens/Home.tsx
+++ b/src/view/screens/Home.tsx
@@ -1,4 +1,5 @@
 import React from 'react'
+import {View, ActivityIndicator, StyleSheet} from 'react-native'
 import {useFocusEffect} from '@react-navigation/native'
 import {NativeStackScreenProps, HomeTabNavigatorParams} from 'lib/routes/types'
 import {FeedDescriptor, FeedParams} from '#/state/queries/post-feed'
@@ -7,28 +8,41 @@ 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 {Pager, RenderTabBarFnProps} from 'view/com/pager/Pager'
 import {FeedPage} from 'view/com/feeds/FeedPage'
 import {useSetMinimalShellMode, useSetDrawerSwipeDisabled} from '#/state/shell'
 import {usePreferencesQuery} from '#/state/queries/preferences'
+import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types'
 import {emitSoftReset} from '#/state/events'
 
 type Props = NativeStackScreenProps<HomeTabNavigatorParams, 'Home'>
-export const HomeScreen = withAuthRequired(function HomeScreenImpl({}: Props) {
+export const HomeScreen = withAuthRequired(function HomeScreenImpl(
+  props: Props,
+) {
+  const {data: preferences} = usePreferencesQuery()
+  if (preferences) {
+    return <HomeScreenReady {...props} preferences={preferences} />
+  } else {
+    return (
+      <View style={styles.loading}>
+        <ActivityIndicator size="large" />
+      </View>
+    )
+  }
+})
+
+function HomeScreenReady({
+  preferences,
+}: Props & {
+  preferences: UsePreferencesQueryResponse
+}) {
   const setMinimalShellMode = useSetMinimalShellMode()
   const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled()
-  const pagerRef = React.useRef<PagerRef>(null)
   const [selectedPage, setSelectedPage] = React.useState(0)
-  const [customFeeds, setCustomFeeds] = React.useState<FeedDescriptor[]>([])
-  const {data: preferences} = usePreferencesQuery()
-
-  React.useEffect(() => {
-    if (!preferences?.feeds?.pinned) return
 
+  const customFeeds = React.useMemo(() => {
     const pinned = preferences.feeds.pinned
-
     const feeds: FeedDescriptor[] = []
-
     for (const uri of pinned) {
       if (uri.includes('app.bsky.feed.generator')) {
         feeds.push(`feedgen|${uri}`)
@@ -36,15 +50,10 @@ export const HomeScreen = withAuthRequired(function HomeScreenImpl({}: Props) {
         feeds.push(`list|${uri}`)
       }
     }
-
-    setCustomFeeds(feeds)
-
-    pagerRef.current?.setPage(0)
-  }, [preferences?.feeds?.pinned, setCustomFeeds, pagerRef])
+    return feeds
+  }, [preferences.feeds.pinned])
 
   const homeFeedParams = React.useMemo<FeedParams>(() => {
-    if (!preferences) return {}
-
     return {
       mergeFeedEnabled: Boolean(preferences.feedViewPrefs.lab_mergeFeedEnabled),
       mergeFeedSources: preferences.feeds.saved,
@@ -108,7 +117,6 @@ export const HomeScreen = withAuthRequired(function HomeScreenImpl({}: Props) {
 
   return (
     <Pager
-      ref={pagerRef}
       testID="homeScreen"
       onPageSelected={onPageSelected}
       onPageScrollStateChanged={onPageScrollStateChanged}
@@ -136,4 +144,13 @@ export const HomeScreen = withAuthRequired(function HomeScreenImpl({}: Props) {
       })}
     </Pager>
   )
+}
+
+const styles = StyleSheet.create({
+  loading: {
+    height: '100%',
+    alignContent: 'center',
+    justifyContent: 'center',
+    paddingBottom: 100,
+  },
 })