From 9a13fe50cc4b81c389679750d496ceee1a759653 Mon Sep 17 00:00:00 2001 From: Cooper Edmunds Date: Fri, 1 Dec 2023 15:02:42 -0500 Subject: [PATCH 1/2] Use lastActiveTab from AsyncStorage for non-desktop --- src/view/screens/Home.tsx | 40 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index e5a3035a..025a0b15 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -14,13 +14,43 @@ import {usePreferencesQuery} from '#/state/queries/preferences' import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' import {emitSoftReset} from '#/state/events' import {useSession} from '#/state/session' +import {save, load} from '#/lib/storage' +import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' type Props = NativeStackScreenProps export function HomeScreen(props: Props) { const {data: preferences} = usePreferencesQuery() + const {isDesktop} = useWebMediaQueries() + const [lastActiveTab, setLastActiveTab] = React.useState( + undefined, + ) - if (preferences) { - return + React.useEffect(() => { + const loadLastActieTab = async () => { + try { + const savedTab = await load('lastActiveTab') + const tabIndex = savedTab ? parseInt(savedTab, 10) : 0 + setLastActiveTab(tabIndex) + } catch { + setLastActiveTab(0) + } + } + // Ignoring lastActiveTab for desktop + if (isDesktop) { + setLastActiveTab(0) + } else { + loadLastActieTab() + } + }, [isDesktop]) + + if (preferences && lastActiveTab !== undefined) { + return ( + + ) } else { return ( @@ -32,13 +62,15 @@ export function HomeScreen(props: Props) { function HomeScreenReady({ preferences, + lastActiveTab, }: Props & { preferences: UsePreferencesQueryResponse + lastActiveTab: number }) { const {hasSession} = useSession() const setMinimalShellMode = useSetMinimalShellMode() const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() - const [selectedPage, setSelectedPage] = React.useState(0) + const [selectedPage, setSelectedPage] = React.useState(lastActiveTab) /** * Used to ensure that we re-compute `customFeeds` AND force a re-render of @@ -80,6 +112,7 @@ function HomeScreenReady({ (index: number) => { setMinimalShellMode(false) setSelectedPage(index) + save('lastActiveTab', index) setDrawerSwipeDisabled(index > 0) }, [setDrawerSwipeDisabled, setSelectedPage, setMinimalShellMode], @@ -125,6 +158,7 @@ function HomeScreenReady({ customFeeds.length ? 0 : selectedPage} onPageSelected={onPageSelected} onPageScrollStateChanged={onPageScrollStateChanged} renderTabBar={renderTabBar} From 17c58d40ffe6a5532b5436f1a2bd2c9dc85fd8a0 Mon Sep 17 00:00:00 2001 From: Cooper Edmunds Date: Mon, 4 Dec 2023 16:10:03 -0500 Subject: [PATCH 2/2] Track active page using string instead of index --- src/view/screens/Home.tsx | 62 ++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index 025a0b15..6100d42d 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -14,41 +14,36 @@ import {usePreferencesQuery} from '#/state/queries/preferences' import {UsePreferencesQueryResponse} from '#/state/queries/preferences/types' import {emitSoftReset} from '#/state/events' import {useSession} from '#/state/session' -import {save, load} from '#/lib/storage' +import {loadString, saveString} from '#/lib/storage' import {useWebMediaQueries} from '#/lib/hooks/useWebMediaQueries' type Props = NativeStackScreenProps export function HomeScreen(props: Props) { const {data: preferences} = usePreferencesQuery() const {isDesktop} = useWebMediaQueries() - const [lastActiveTab, setLastActiveTab] = React.useState( + const [initialPage, setInitialPage] = React.useState( undefined, ) React.useEffect(() => { - const loadLastActieTab = async () => { + const loadLastActivePage = async () => { try { - const savedTab = await load('lastActiveTab') - const tabIndex = savedTab ? parseInt(savedTab, 10) : 0 - setLastActiveTab(tabIndex) + const lastActivePage = + (await loadString('lastActivePage')) ?? 'Following' + setInitialPage(lastActivePage) } catch { - setLastActiveTab(0) + setInitialPage('Following') } } - // Ignoring lastActiveTab for desktop - if (isDesktop) { - setLastActiveTab(0) - } else { - loadLastActieTab() - } - }, [isDesktop]) + loadLastActivePage() + }, []) - if (preferences && lastActiveTab !== undefined) { + if (preferences && initialPage !== undefined) { return ( ) } else { @@ -62,15 +57,15 @@ export function HomeScreen(props: Props) { function HomeScreenReady({ preferences, - lastActiveTab, + initialPage, }: Props & { preferences: UsePreferencesQueryResponse - lastActiveTab: number + initialPage: string }) { const {hasSession} = useSession() const setMinimalShellMode = useSetMinimalShellMode() const setDrawerSwipeDisabled = useSetDrawerSwipeDisabled() - const [selectedPage, setSelectedPage] = React.useState(lastActiveTab) + const [selectedPage, setSelectedPage] = React.useState(initialPage) /** * Used to ensure that we re-compute `customFeeds` AND force a re-render of @@ -78,6 +73,13 @@ function HomeScreenReady({ */ const pinnedFeedOrderKey = JSON.stringify(preferences.feeds.pinned) + const selectedPageIndex = React.useMemo(() => { + const index = ['Following', ...preferences.feeds.pinned].indexOf( + selectedPage, + ) + return Math.max(index, 0) + }, [preferences.feeds.pinned, selectedPage]) + const customFeeds = React.useMemo(() => { const pinned = preferences.feeds.pinned const feeds: FeedDescriptor[] = [] @@ -101,21 +103,27 @@ function HomeScreenReady({ useFocusEffect( React.useCallback(() => { setMinimalShellMode(false) - setDrawerSwipeDisabled(selectedPage > 0) + setDrawerSwipeDisabled(selectedPageIndex > 0) return () => { setDrawerSwipeDisabled(false) } - }, [setDrawerSwipeDisabled, selectedPage, setMinimalShellMode]), + }, [setDrawerSwipeDisabled, selectedPageIndex, setMinimalShellMode]), ) const onPageSelected = React.useCallback( (index: number) => { setMinimalShellMode(false) - setSelectedPage(index) - save('lastActiveTab', index) setDrawerSwipeDisabled(index > 0) + const page = ['Following', ...preferences.feeds.pinned][index] + setSelectedPage(page) + saveString('lastActivePage', page) }, - [setDrawerSwipeDisabled, setSelectedPage, setMinimalShellMode], + [ + setDrawerSwipeDisabled, + setSelectedPage, + setMinimalShellMode, + preferences.feeds.pinned, + ], ) const onPressSelected = React.useCallback(() => { @@ -158,7 +166,7 @@ function HomeScreenReady({ customFeeds.length ? 0 : selectedPage} + initialPage={selectedPageIndex} onPageSelected={onPageSelected} onPageScrollStateChanged={onPageScrollStateChanged} renderTabBar={renderTabBar} @@ -166,7 +174,7 @@ function HomeScreenReady({