From 971c8025e6cadec74525d42a978dabddb878b8eb Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 19 Sep 2023 21:44:23 -0700 Subject: Feeds tab fixes (#1486) * Bold the saved feeds on mobile * Improve the saved feeds loading state * Add soft reset handler to feeds page * Show feed descriptions in profile listing * Add an 'about this feed' modal * Fix type assertion --- src/state/models/ui/my-feeds.ts | 8 +++++++- src/view/screens/CustomFeed.tsx | 33 +++++++++++++++++++++++++++++---- src/view/screens/Feeds.tsx | 41 +++++++++++++++++++++++++++++++++++------ src/view/screens/Profile.tsx | 4 +++- 4 files changed, 74 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/state/models/ui/my-feeds.ts b/src/state/models/ui/my-feeds.ts index f9ad06f77..6b017709e 100644 --- a/src/state/models/ui/my-feeds.ts +++ b/src/state/models/ui/my-feeds.ts @@ -8,6 +8,11 @@ export type MyFeedsItem = _reactKey: string type: 'spinner' } + | { + _reactKey: string + type: 'saved-feeds-loading' + numItems: number + } | { _reactKey: string type: 'discover-feeds-loading' @@ -91,7 +96,8 @@ export class MyFeedsUIModel { if (this.saved.isLoading) { items.push({ _reactKey: '__saved_feeds_loading__', - type: 'spinner', + type: 'saved-feeds-loading', + numItems: this.rootStore.preferences.savedFeeds.length || 3, }) } else if (this.saved.hasError) { items.push({ diff --git a/src/view/screens/CustomFeed.tsx b/src/view/screens/CustomFeed.tsx index eaa21f292..f8ceda940 100644 --- a/src/view/screens/CustomFeed.tsx +++ b/src/view/screens/CustomFeed.tsx @@ -185,6 +185,17 @@ export const CustomFeedScreenInner = observer( }) }, [store, currentFeed]) + const onPressAbout = React.useCallback(() => { + store.shell.openModal({ + name: 'confirm', + title: currentFeed?.displayName || '', + message: + currentFeed?.data.description || 'This feed has no description.', + confirmBtnText: 'Close', + onPressConfirm() {}, + }) + }, [store, currentFeed]) + const onPressViewAuthor = React.useCallback(() => { navigation.navigate('Profile', {name: handleOrDid}) }, [handleOrDid, navigation]) @@ -233,7 +244,21 @@ export const CustomFeedScreenInner = observer( }, [store, onSoftReset, isScreenFocused]) const dropdownItems: DropdownItem[] = React.useMemo(() => { - let items: DropdownItem[] = [ + return [ + currentFeed + ? { + testID: 'feedHeaderDropdownAboutBtn', + label: 'About this feed', + onPress: onPressAbout, + icon: { + ios: { + name: 'info.circle', + }, + android: '', + web: 'info', + }, + } + : undefined, { testID: 'feedHeaderDropdownViewAuthorBtn', label: 'View author', @@ -292,10 +317,10 @@ export const CustomFeedScreenInner = observer( web: 'share', }, }, - ] - return items + ].filter(Boolean) as DropdownItem[] }, [ - currentFeed?.isSaved, + currentFeed, + onPressAbout, onToggleSaved, onPressReport, onPressShare, diff --git a/src/view/screens/Feeds.tsx b/src/view/screens/Feeds.tsx index d2c4a6d2d..6ca24bae9 100644 --- a/src/view/screens/Feeds.tsx +++ b/src/view/screens/Feeds.tsx @@ -16,7 +16,10 @@ import {ComposeIcon2, CogIcon} from 'lib/icons' import {s} from 'lib/styles' import {SearchInput} from 'view/com/util/forms/SearchInput' import {UserAvatar} from 'view/com/util/UserAvatar' -import {FeedFeedLoadingPlaceholder} from 'view/com/util/LoadingPlaceholder' +import { + LoadingPlaceholder, + FeedFeedLoadingPlaceholder, +} from 'view/com/util/LoadingPlaceholder' import {ErrorMessage} from 'view/com/util/error/ErrorMessage' import debounce from 'lodash.debounce' import {Text} from 'view/com/util/text/Text' @@ -42,7 +45,12 @@ export const FeedsScreen = withAuthRequired( React.useCallback(() => { store.shell.setMinimalShellMode(false) myFeeds.setup() - }, [store.shell, myFeeds]), + + const softResetSub = store.onScreenSoftReset(() => myFeeds.refresh()) + return () => { + softResetSub.remove() + } + }, [store, myFeeds]), ) const onPressCompose = React.useCallback(() => { @@ -119,6 +127,14 @@ export const FeedsScreen = withAuthRequired( ) } return + } else if (item.type === 'saved-feeds-loading') { + return ( + <> + {Array.from(Array(item.numItems)).map((_, i) => ( + + ))} + + ) } else if (item.type === 'saved-feed') { return ( - + {displayName} {isMobile && ( @@ -279,6 +292,22 @@ function SavedFeed({ ) } +function SavedFeedLoadingPlaceholder() { + const pal = usePalette('default') + const {isMobile} = useWebMediaQueries() + return ( + + + + + ) +} + const styles = StyleSheet.create({ container: { flex: 1, diff --git a/src/view/screens/Profile.tsx b/src/view/screens/Profile.tsx index 241bae1ed..efcb588f6 100644 --- a/src/view/screens/Profile.tsx +++ b/src/view/screens/Profile.tsx @@ -187,7 +187,9 @@ export const ProfileScreen = withAuthRequired( /> ) } else if (item instanceof CustomFeedModel) { - return + return ( + + ) } // if section is posts or posts & replies } else { -- cgit 1.4.1