From 6f5b551bdaa133ec6fa0f91f3f9621542b4217a8 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Fri, 10 May 2024 21:57:21 -0700 Subject: Add shutdown message to for you feed (#3776) --- src/view/com/posts/FeedShutdownMsg.tsx | 159 +++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 src/view/com/posts/FeedShutdownMsg.tsx (limited to 'src/view/com/posts/FeedShutdownMsg.tsx') diff --git a/src/view/com/posts/FeedShutdownMsg.tsx b/src/view/com/posts/FeedShutdownMsg.tsx new file mode 100644 index 000000000..bc047e831 --- /dev/null +++ b/src/view/com/posts/FeedShutdownMsg.tsx @@ -0,0 +1,159 @@ +import React from 'react' +import {View} from 'react-native' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {PROD_DEFAULT_FEED} from '#/lib/constants' +import {logger} from '#/logger' +import { + useAddSavedFeedsMutation, + usePreferencesQuery, + useRemoveFeedMutation, + useUpdateSavedFeedsMutation, +} from '#/state/queries/preferences' +import {useSetSelectedFeed} from '#/state/shell/selected-feed' +import * as Toast from '#/view/com/util/Toast' +import {atoms as a, useTheme} from '#/alf' +import {Button, ButtonIcon, ButtonText} from '#/components/Button' +import {InlineLinkText} from '#/components/Link' +import {Loader} from '#/components/Loader' +import {Text} from '#/components/Typography' + +export function FeedShutdownMsg({feedUri}: {feedUri: string}) { + const t = useTheme() + const {_} = useLingui() + const setSelectedFeed = useSetSelectedFeed() + const {data: preferences} = usePreferencesQuery() + const {mutateAsync: addSavedFeeds, isPending: isAddSavedFeedPending} = + useAddSavedFeedsMutation() + const {mutateAsync: removeFeed, isPending: isRemovePending} = + useRemoveFeedMutation() + const {mutateAsync: updateSavedFeeds, isPending: isUpdateFeedPending} = + useUpdateSavedFeedsMutation() + + const feedConfig = preferences?.savedFeeds?.find( + f => f.value === feedUri && f.pinned, + ) + const discoverFeedConfig = preferences?.savedFeeds?.find( + f => f.value === PROD_DEFAULT_FEED('whats-hot'), + ) + const hasFeedPinned = Boolean(feedConfig) + const hasDiscoverPinned = Boolean(discoverFeedConfig?.pinned) + + const onRemoveFeed = React.useCallback(async () => { + try { + if (feedConfig) { + await removeFeed(feedConfig) + Toast.show(_(msg`Removed from your feeds`)) + } + } catch (err: any) { + Toast.show( + _( + msg`There was an an issue updating your feeds, please check your internet connection and try again.`, + ), + ) + logger.error('Failed up update feeds', {message: err}) + } + }, [removeFeed, feedConfig, _]) + + const onReplaceFeed = React.useCallback(async () => { + try { + if (!discoverFeedConfig) { + await addSavedFeeds([ + { + type: 'feed', + value: PROD_DEFAULT_FEED('whats-hot'), + pinned: true, + }, + ]) + } else { + await updateSavedFeeds([ + { + ...discoverFeedConfig, + pinned: true, + }, + ]) + } + setSelectedFeed(`feedgen|${PROD_DEFAULT_FEED('whats-hot')}`) + if (feedConfig) { + await removeFeed(feedConfig) + } + Toast.show(_(msg`The feed has been replaced with Discover.`)) + } catch (err: any) { + Toast.show( + _( + msg`There was an an issue updating your feeds, please check your internet connection and try again.`, + ), + ) + logger.error('Failed up update feeds', {message: err}) + } + }, [ + addSavedFeeds, + updateSavedFeeds, + removeFeed, + discoverFeedConfig, + feedConfig, + setSelectedFeed, + _, + ]) + + const isProcessing = + isAddSavedFeedPending || isUpdateFeedPending || isRemovePending + return ( + + + :( + + + + This feed is no longer online. We are showing{' '} + + Discover + {' '} + instead. + + + {hasFeedPinned ? ( + + + {!hasDiscoverPinned && ( + + )} + + ) : undefined} + + ) +} -- cgit 1.4.1