From b3bec111beb4ffdc254a7d1e27700f205f26d700 Mon Sep 17 00:00:00 2001 From: "Yuwen Memon (via MelvinBot)" Date: Mon, 23 Mar 2026 21:19:11 +0000 Subject: [PATCH] Add non-disruptive cleanup to useDocumentTitle hook Instead of reverting the cleanup removal entirely, add a new clearPageTitle() function that resets the module-level currentPageTitle variable without triggering updateDocumentTitle(). This avoids the "New Expensify" title flash from the original cleanup (setPageTitle('')) while still clearing the stale title when the RHP closes. Co-authored-by: Yuwen Memon --- src/hooks/useDocumentTitle.ts | 3 ++- .../updateUnread/index.android.ts | 4 +++- .../UnreadIndicatorUpdater/updateUnread/index.ios.ts | 4 +++- src/libs/UnreadIndicatorUpdater/updateUnread/index.ts | 11 ++++++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/hooks/useDocumentTitle.ts b/src/hooks/useDocumentTitle.ts index ec40ada435006..87e8991f1d8da 100644 --- a/src/hooks/useDocumentTitle.ts +++ b/src/hooks/useDocumentTitle.ts @@ -1,11 +1,12 @@ import {useFocusEffect} from '@react-navigation/native'; import {useCallback} from 'react'; -import {setPageTitle} from '@libs/UnreadIndicatorUpdater/updateUnread'; +import {clearPageTitle, setPageTitle} from '@libs/UnreadIndicatorUpdater/updateUnread'; function useDocumentTitle(title: string) { useFocusEffect( useCallback(() => { setPageTitle(title); + return () => clearPageTitle(); }, [title]), ); } diff --git a/src/libs/UnreadIndicatorUpdater/updateUnread/index.android.ts b/src/libs/UnreadIndicatorUpdater/updateUnread/index.android.ts index 3831a8b975794..8026d5be45660 100644 --- a/src/libs/UnreadIndicatorUpdater/updateUnread/index.android.ts +++ b/src/libs/UnreadIndicatorUpdater/updateUnread/index.android.ts @@ -7,5 +7,7 @@ const updateUnread: UpdateUnread = () => {}; // eslint-disable-next-line @typescript-eslint/no-unused-vars function setPageTitle(_title: string) {} +function clearPageTitle() {} + export default updateUnread; -export {setPageTitle}; +export {clearPageTitle, setPageTitle}; diff --git a/src/libs/UnreadIndicatorUpdater/updateUnread/index.ios.ts b/src/libs/UnreadIndicatorUpdater/updateUnread/index.ios.ts index 05aa541c8c6d8..e490222db8bdc 100644 --- a/src/libs/UnreadIndicatorUpdater/updateUnread/index.ios.ts +++ b/src/libs/UnreadIndicatorUpdater/updateUnread/index.ios.ts @@ -13,5 +13,7 @@ const updateUnread: UpdateUnread = (totalCount) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars function setPageTitle(_title: string) {} +function clearPageTitle() {} + export default updateUnread; -export {setPageTitle}; +export {clearPageTitle, setPageTitle}; diff --git a/src/libs/UnreadIndicatorUpdater/updateUnread/index.ts b/src/libs/UnreadIndicatorUpdater/updateUnread/index.ts index 43218d4d880a2..5e5ad56b406d0 100644 --- a/src/libs/UnreadIndicatorUpdater/updateUnread/index.ts +++ b/src/libs/UnreadIndicatorUpdater/updateUnread/index.ts @@ -52,5 +52,14 @@ window.addEventListener('popstate', () => { updateUnread(unreadTotalCount); }); +/** + * Clear the page title without triggering a document title update. + * Used as cleanup in useDocumentTitle to avoid the "New Expensify" flash + * that occurs when setPageTitle('') queues an async updateDocumentTitle(). + */ +function clearPageTitle() { + currentPageTitle = ''; +} + export default updateUnread; -export {setPageTitle}; +export {clearPageTitle, setPageTitle};