about summary refs log tree commit diff
path: root/src/view/shell/desktop/Feeds.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/view/shell/desktop/Feeds.tsx')
-rw-r--r--src/view/shell/desktop/Feeds.tsx67
1 files changed, 40 insertions, 27 deletions
diff --git a/src/view/shell/desktop/Feeds.tsx b/src/view/shell/desktop/Feeds.tsx
index a8f5f1c66..c3b1caa35 100644
--- a/src/view/shell/desktop/Feeds.tsx
+++ b/src/view/shell/desktop/Feeds.tsx
@@ -1,18 +1,24 @@
 import React from 'react'
 import {View, StyleSheet} from 'react-native'
-import {useNavigationState} from '@react-navigation/native'
+import {useNavigationState, useNavigation} from '@react-navigation/native'
 import {usePalette} from 'lib/hooks/usePalette'
 import {TextLink} from 'view/com/util/Link'
 import {getCurrentRoute} from 'lib/routes/helpers'
 import {useLingui} from '@lingui/react'
 import {msg} from '@lingui/macro'
 import {usePinnedFeedsInfos} from '#/state/queries/feed'
+import {useSelectedFeed, useSetSelectedFeed} from '#/state/shell/selected-feed'
+import {FeedDescriptor} from '#/state/queries/post-feed'
+import {NavigationProp} from 'lib/routes/types'
+import {emitSoftReset} from '#/state/events'
 
 export function DesktopFeeds() {
   const pal = usePalette('default')
   const {_} = useLingui()
-  const {feeds} = usePinnedFeedsInfos()
-
+  const {feeds: pinnedFeedInfos} = usePinnedFeedsInfos()
+  const selectedFeed = useSelectedFeed()
+  const setSelectedFeed = useSetSelectedFeed()
+  const navigation = useNavigation<NavigationProp>()
   const route = useNavigationState(state => {
     if (!state) {
       return {name: 'Home'}
@@ -22,30 +28,34 @@ export function DesktopFeeds() {
 
   return (
     <View style={[styles.container, pal.view]}>
-      <FeedItem href="/" title="Following" current={route.name === 'Home'} />
-      {feeds
-        .filter(f => f.displayName !== 'Following')
-        .map(feed => {
-          try {
-            const params = route.params as Record<string, string>
-            const routeName =
-              feed.type === 'feed' ? 'ProfileFeed' : 'ProfileList'
-            return (
-              <FeedItem
-                key={feed.uri}
-                href={feed.route.href}
-                title={feed.displayName}
-                current={
-                  route.name === routeName &&
-                  params.name === feed.route.params.name &&
-                  params.rkey === feed.route.params.rkey
-                }
-              />
-            )
-          } catch {
-            return null
-          }
-        })}
+      {pinnedFeedInfos.map(feedInfo => {
+        const uri = feedInfo.uri
+        let feed: FeedDescriptor
+        if (!uri) {
+          feed = 'home'
+        } else if (uri.includes('app.bsky.feed.generator')) {
+          feed = `feedgen|${uri}`
+        } else if (uri.includes('app.bsky.graph.list')) {
+          feed = `list|${uri}`
+        } else {
+          return null
+        }
+        return (
+          <FeedItem
+            key={feed}
+            href={'/?' + new URLSearchParams([['feed', feed]])}
+            title={feedInfo.displayName}
+            current={route.name === 'Home' && feed === selectedFeed}
+            onPress={() => {
+              setSelectedFeed(feed)
+              navigation.navigate('Home')
+              if (feed === selectedFeed) {
+                emitSoftReset()
+              }
+            }}
+          />
+        )
+      })}
       <View style={{paddingTop: 8, paddingBottom: 6}}>
         <TextLink
           type="lg"
@@ -62,10 +72,12 @@ function FeedItem({
   title,
   href,
   current,
+  onPress,
 }: {
   title: string
   href: string
   current: boolean
+  onPress: () => void
 }) {
   const pal = usePalette('default')
   return (
@@ -74,6 +86,7 @@ function FeedItem({
         type="xl"
         href={href}
         text={title}
+        onPress={onPress}
         style={[
           current ? pal.text : pal.textLight,
           {letterSpacing: 0.15, fontWeight: current ? '500' : 'normal'},