diff --git a/src/screens/Feeds/NoFollowingFeed.tsx b/src/screens/Feeds/NoFollowingFeed.tsx
new file mode 100644
index 0000000000..ec80209316
--- /dev/null
+++ b/src/screens/Feeds/NoFollowingFeed.tsx
@@ -0,0 +1,48 @@
+import React from 'react'
+import {View} from 'react-native'
+import {msg, Trans} from '@lingui/macro'
+import {useLingui} from '@lingui/react'
+
+import {useAddSavedFeedMutation} from '#/state/queries/preferences'
+import {atoms as a, useTheme} from '#/alf'
+import {InlineLinkText} from '#/components/Link'
+import {Text} from '#/components/Typography'
+
+export function NoFollowingFeed() {
+ const t = useTheme()
+ const {_} = useLingui()
+ const {mutateAsync: addSavedFeed} = useAddSavedFeedMutation()
+
+ const addRecommendedFeeds = React.useCallback(
+ (e: any) => {
+ e.preventDefault()
+
+ addSavedFeed({
+ type: 'timeline',
+ value: 'home',
+ pinned: true,
+ })
+
+ // prevent navigation
+ return false
+ },
+ [addSavedFeed],
+ )
+
+ return (
+
+
+ Looks like you're missing a following feed.{' '}
+
+
+
+ Click here to add one.
+
+
+ )
+}
diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx
index a1e5c0229a..25b44eb183 100644
--- a/src/view/screens/Feeds.tsx
+++ b/src/view/screens/Feeds.tsx
@@ -45,6 +45,7 @@ import {
import {Text} from 'view/com/util/text/Text'
import {UserAvatar} from 'view/com/util/UserAvatar'
import {ViewHeader} from 'view/com/util/ViewHeader'
+import {NoFollowingFeed} from '#/screens/Feeds/NoFollowingFeed'
import {NoSavedFeeds} from '#/screens/Feeds/NoSavedFeeds'
import {atoms as a, useTheme} from '#/alf'
import {IconCircle} from '#/components/IconCircle'
@@ -104,6 +105,10 @@ type FlatlistSlice =
type: 'popularFeedsLoadingMore'
key: string
}
+ | {
+ type: 'noFollowingFeed'
+ key: string
+ }
// HACK
// the protocol doesn't yet tell us which feeds are personalized
@@ -241,6 +246,10 @@ export function FeedsScreen(_props: Props) {
})
} else {
if (preferences.savedFeeds?.length) {
+ const noFollowingFeed = preferences.savedFeeds.every(
+ f => f.type !== 'timeline',
+ )
+
slices = slices.concat(
preferences.savedFeeds
.filter(f => {
@@ -265,6 +274,13 @@ export function FeedsScreen(_props: Props) {
savedFeedConfig: feed,
})),
)
+
+ if (noFollowingFeed) {
+ slices.push({
+ key: 'noFollowingFeed',
+ type: 'noFollowingFeed',
+ })
+ }
} else {
slices.push({
key: 'savedFeedNoResults',
@@ -540,6 +556,18 @@ export function FeedsScreen(_props: Props) {
)
+ } else if (item.type === 'noFollowingFeed') {
+ return (
+
+
+
+ )
}
return null
},
diff --git a/src/view/screens/SavedFeeds.tsx b/src/view/screens/SavedFeeds.tsx
index 652e45cf55..f643ec570c 100644
--- a/src/view/screens/SavedFeeds.tsx
+++ b/src/view/screens/SavedFeeds.tsx
@@ -28,6 +28,7 @@ import {Text} from 'view/com/util/text/Text'
import * as Toast from 'view/com/util/Toast'
import {ViewHeader} from 'view/com/util/ViewHeader'
import {CenteredView, ScrollView} from 'view/com/util/Views'
+import {NoFollowingFeed} from '#/screens/Feeds/NoFollowingFeed'
import {NoSavedFeeds} from '#/screens/Feeds/NoSavedFeeds'
import {atoms as a, useTheme} from '#/alf'
import {FilterTimeline_Stroke2_Corner0_Rounded as FilterTimeline} from '#/components/icons/FilterTimeline'
@@ -71,6 +72,8 @@ export function SavedFeeds({}: Props) {
const pinnedFeeds = currentFeeds.filter(f => f.pinned)
const unpinnedFeeds = currentFeeds.filter(f => !f.pinned)
const noSavedFeeds = pinnedFeeds.length + unpinnedFeeds.length === 0
+ const noFollowingFeed =
+ currentFeeds.every(f => f.type !== 'timeline') && !noSavedFeeds
useFocusEffect(
React.useCallback(() => {
@@ -129,6 +132,13 @@ export function SavedFeeds({}: Props) {
) : (
)}
+
+ {noFollowingFeed && (
+
+
+
+ )}
+
Saved Feeds