From c31d19f89169a82b5ac0d85114241d96448f131c Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Thu, 4 Sep 2025 15:20:07 +0200 Subject: [PATCH 1/9] fix impl of useCurrentUserPersonalDetails --- src/hooks/useCurrentUserPersonalDetails.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/hooks/useCurrentUserPersonalDetails.ts b/src/hooks/useCurrentUserPersonalDetails.ts index fadab893f113..e0ae413c31e6 100644 --- a/src/hooks/useCurrentUserPersonalDetails.ts +++ b/src/hooks/useCurrentUserPersonalDetails.ts @@ -1,14 +1,17 @@ import {useMemo} from 'react'; -import {usePersonalDetails, useSession} from '@components/OnyxListItemProvider'; +import {useSession} from '@components/OnyxListItemProvider'; import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; import type {PersonalDetails} from '@src/types/onyx'; +import useOnyx from './useOnyx'; function useCurrentUserPersonalDetails() { const session = useSession(); - const personalDetails = usePersonalDetails(); + const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); + const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID]}); + const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; - const accountPersonalDetails = personalDetails?.[accountID]; - const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...accountPersonalDetails, accountID}), [accountPersonalDetails, accountID]); + const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); return currentUserPersonalDetails; } From 400c1463165e88968628989c393d57ff4d78eb06 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Mon, 8 Sep 2025 12:20:29 +0200 Subject: [PATCH 2/9] fix lint --- src/hooks/useCurrentUserPersonalDetails.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useCurrentUserPersonalDetails.ts b/src/hooks/useCurrentUserPersonalDetails.ts index e0ae413c31e6..b4efc3b6b9fd 100644 --- a/src/hooks/useCurrentUserPersonalDetails.ts +++ b/src/hooks/useCurrentUserPersonalDetails.ts @@ -8,7 +8,7 @@ import useOnyx from './useOnyx'; function useCurrentUserPersonalDetails() { const session = useSession(); const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); - const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID]}); + const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID], canBeMissing: true}); const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); From a5fb2e09d01106e27c597a8caba644d8f567f7e2 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Tue, 9 Sep 2025 13:21:45 +0200 Subject: [PATCH 3/9] change useCurrentUserPersonalDetails implementation to use context --- src/App.tsx | 2 ++ .../CurrentUserPersonalDetailsProvider.tsx | 21 +++++++++++++++++++ src/hooks/useCurrentUserPersonalDetails.ts | 17 +++------------ 3 files changed, 26 insertions(+), 14 deletions(-) create mode 100644 src/components/CurrentUserPersonalDetailsProvider.tsx diff --git a/src/App.tsx b/src/App.tsx index 1bf42a54d2a5..eaad7f22310c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,6 +4,7 @@ import {LogBox, View} from 'react-native'; import {GestureHandlerRootView} from 'react-native-gesture-handler'; import {PickerStateProvider} from 'react-native-picker-select'; import {SafeAreaProvider} from 'react-native-safe-area-context'; +import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersonalDetailsProvider'; import '../wdyr'; import {ActionSheetAwareScrollViewProvider} from './components/ActionSheetAwareScrollView'; import ActiveElementRoleProvider from './components/ActiveElementRoleProvider'; @@ -116,6 +117,7 @@ function App() { FullScreenBlockingViewContextProvider, FullScreenLoaderContextProvider, SidePanelContextProvider, + CurrentUserPersonalDetailsProvider, ]} > diff --git a/src/components/CurrentUserPersonalDetailsProvider.tsx b/src/components/CurrentUserPersonalDetailsProvider.tsx new file mode 100644 index 000000000000..d5ec9c12f30c --- /dev/null +++ b/src/components/CurrentUserPersonalDetailsProvider.tsx @@ -0,0 +1,21 @@ +import React, {createContext, useMemo} from 'react'; +import useOnyx from '@hooks/useOnyx'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {PersonalDetails} from '@src/types/onyx'; +import {useSession} from './OnyxListItemProvider'; + +const CurrentUserPersonalDetailsContext = createContext(undefined); + +function CurrentUserPersonalDetailsProvider({children}: {children: React.ReactNode}) { + const session = useSession(); + const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); + const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID], canBeMissing: true}); + + const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; + const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); + + return {children}; +} + +export {CurrentUserPersonalDetailsContext, CurrentUserPersonalDetailsProvider}; diff --git a/src/hooks/useCurrentUserPersonalDetails.ts b/src/hooks/useCurrentUserPersonalDetails.ts index b4efc3b6b9fd..7ba41727d076 100644 --- a/src/hooks/useCurrentUserPersonalDetails.ts +++ b/src/hooks/useCurrentUserPersonalDetails.ts @@ -1,19 +1,8 @@ -import {useMemo} from 'react'; -import {useSession} from '@components/OnyxListItemProvider'; -import CONST from '@src/CONST'; -import ONYXKEYS from '@src/ONYXKEYS'; -import type {PersonalDetails} from '@src/types/onyx'; -import useOnyx from './useOnyx'; +import {useContext} from 'react'; +import {CurrentUserPersonalDetailsContext} from '@components/CurrentUserPersonalDetailsProvider'; function useCurrentUserPersonalDetails() { - const session = useSession(); - const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); - const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID], canBeMissing: true}); - - const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; - const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); - - return currentUserPersonalDetails; + return useContext(CurrentUserPersonalDetailsContext); } export default useCurrentUserPersonalDetails; From de1b87a07bddc3b60c547398b618986c87b543ff Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Tue, 9 Sep 2025 15:07:31 +0200 Subject: [PATCH 4/9] fix tests --- src/components/CurrentUserPersonalDetailsProvider.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/CurrentUserPersonalDetailsProvider.tsx b/src/components/CurrentUserPersonalDetailsProvider.tsx index d5ec9c12f30c..ce220849d52e 100644 --- a/src/components/CurrentUserPersonalDetailsProvider.tsx +++ b/src/components/CurrentUserPersonalDetailsProvider.tsx @@ -5,7 +5,11 @@ import ONYXKEYS from '@src/ONYXKEYS'; import type {PersonalDetails} from '@src/types/onyx'; import {useSession} from './OnyxListItemProvider'; -const CurrentUserPersonalDetailsContext = createContext(undefined); +const defaultCurrentUserPersonalDetails: PersonalDetails = { + accountID: CONST.DEFAULT_NUMBER_ID, +}; + +const CurrentUserPersonalDetailsContext = createContext(defaultCurrentUserPersonalDetails); function CurrentUserPersonalDetailsProvider({children}: {children: React.ReactNode}) { const session = useSession(); From 9632b2e2f13f8da5c4e456926f315dcc1453ebed Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Tue, 9 Sep 2025 16:51:29 +0200 Subject: [PATCH 5/9] fix tests --- src/App.tsx | 2 +- .../IOURequestStepConfirmationPageTest.tsx | 105 ++++++++++-------- 2 files changed, 57 insertions(+), 50 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index eaad7f22310c..9157983a83ec 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -89,6 +89,7 @@ function App() { diff --git a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx index 4e30c225c83a..5f23c80f4c87 100644 --- a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx +++ b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx @@ -1,6 +1,7 @@ import {fireEvent, render, screen} from '@testing-library/react-native'; import React from 'react'; import Onyx from 'react-native-onyx'; +import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersonalDetailsProvider'; import {LocaleContextProvider} from '@components/LocaleContextProvider'; import OnyxListItemProvider from '@components/OnyxListItemProvider'; import {translateLocal} from '@libs/Localize'; @@ -101,22 +102,24 @@ describe('IOURequestStepConfirmationPageTest', () => { render( - - - + + + + + , ); @@ -138,22 +141,24 @@ describe('IOURequestStepConfirmationPageTest', () => { render( - - - + + + + + , ); @@ -162,7 +167,7 @@ describe('IOURequestStepConfirmationPageTest', () => { }); it('should create a split expense for each scanned receipt', async () => { - await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN); + // await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}1`, { ...DEFAULT_SPLIT_TRANSACTION, @@ -182,22 +187,24 @@ describe('IOURequestStepConfirmationPageTest', () => { render( - - - + + + + + , ); From 84e8df6ff1a19dbae86a2b4433a6dd3840afdf9d Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Tue, 9 Sep 2025 17:39:08 +0200 Subject: [PATCH 6/9] fix tests --- tests/ui/PersonalDetailsOnboarding.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/ui/PersonalDetailsOnboarding.tsx b/tests/ui/PersonalDetailsOnboarding.tsx index 9436e5543697..e9326a0eab6e 100644 --- a/tests/ui/PersonalDetailsOnboarding.tsx +++ b/tests/ui/PersonalDetailsOnboarding.tsx @@ -4,6 +4,7 @@ import {act, fireEvent, render, screen, waitFor} from '@testing-library/react-na import React from 'react'; import Onyx from 'react-native-onyx'; import ComposeProviders from '@components/ComposeProviders'; +import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersonalDetailsProvider'; import {LocaleContextProvider} from '@components/LocaleContextProvider'; import OnyxListItemProvider from '@components/OnyxListItemProvider'; import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID'; @@ -41,7 +42,7 @@ const renderOnboardingPersonalDetailsPage = ( initialParams: OnboardingModalNavigatorParamList[typeof SCREENS.ONBOARDING.PERSONAL_DETAILS], ) => { return render( - + From 3c6e7168e4567ce2b11950bf0ea2afe025fa5b5e Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Tue, 9 Sep 2025 18:02:10 +0200 Subject: [PATCH 7/9] make selector reference stable --- src/components/CurrentUserPersonalDetailsProvider.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/CurrentUserPersonalDetailsProvider.tsx b/src/components/CurrentUserPersonalDetailsProvider.tsx index ce220849d52e..caa00f7fbef3 100644 --- a/src/components/CurrentUserPersonalDetailsProvider.tsx +++ b/src/components/CurrentUserPersonalDetailsProvider.tsx @@ -1,8 +1,9 @@ -import React, {createContext, useMemo} from 'react'; +import React, {createContext, useCallback, useMemo} from 'react'; +import type {OnyxEntry} from 'react-native-onyx'; import useOnyx from '@hooks/useOnyx'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {PersonalDetails} from '@src/types/onyx'; +import type {PersonalDetails, PersonalDetailsList} from '@src/types/onyx'; import {useSession} from './OnyxListItemProvider'; const defaultCurrentUserPersonalDetails: PersonalDetails = { @@ -14,7 +15,8 @@ const CurrentUserPersonalDetailsContext = createContext(default function CurrentUserPersonalDetailsProvider({children}: {children: React.ReactNode}) { const session = useSession(); const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); - const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: (allPersonalDetails) => allPersonalDetails?.[userAccountID], canBeMissing: true}); + const userAccountSelector = useCallback((allPersonalDetails: OnyxEntry) => allPersonalDetails?.[userAccountID], [userAccountID]); + const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: userAccountSelector, canBeMissing: true}); const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); From 19dcda4451ac48f20353e35e5f84cb7a99b73313 Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Wed, 10 Sep 2025 09:44:28 +0200 Subject: [PATCH 8/9] fix PR comments --- .../CurrentUserPersonalDetailsProvider.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/components/CurrentUserPersonalDetailsProvider.tsx b/src/components/CurrentUserPersonalDetailsProvider.tsx index caa00f7fbef3..876cbdbac483 100644 --- a/src/components/CurrentUserPersonalDetailsProvider.tsx +++ b/src/components/CurrentUserPersonalDetailsProvider.tsx @@ -1,4 +1,4 @@ -import React, {createContext, useCallback, useMemo} from 'react'; +import React, {createContext, useCallback} from 'react'; import type {OnyxEntry} from 'react-native-onyx'; import useOnyx from '@hooks/useOnyx'; import CONST from '@src/CONST'; @@ -14,12 +14,16 @@ const CurrentUserPersonalDetailsContext = createContext(default function CurrentUserPersonalDetailsProvider({children}: {children: React.ReactNode}) { const session = useSession(); - const userAccountID = useMemo(() => session?.accountID ?? CONST.DEFAULT_NUMBER_ID, [session?.accountID]); - const userAccountSelector = useCallback((allPersonalDetails: OnyxEntry) => allPersonalDetails?.[userAccountID], [userAccountID]); - const [userPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: userAccountSelector, canBeMissing: true}); - - const accountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; - const currentUserPersonalDetails: PersonalDetails = useMemo(() => ({...userPersonalDetails, accountID}), [userPersonalDetails, accountID]); + const userAccountID = session?.accountID ?? CONST.DEFAULT_NUMBER_ID; + const userAccountSelector = useCallback( + (allPersonalDetails: OnyxEntry): PersonalDetails => { + const personalDetailsForUser = allPersonalDetails?.[userAccountID] ?? ({} as PersonalDetails); + personalDetailsForUser.accountID = userAccountID; + return personalDetailsForUser; + }, + [userAccountID], + ); + const [currentUserPersonalDetails = defaultCurrentUserPersonalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {selector: userAccountSelector, canBeMissing: true}); return {children}; } From d246d9de7910eb9a434ab8d398cb22725d4ae70a Mon Sep 17 00:00:00 2001 From: Jakub Szymczak Date: Wed, 10 Sep 2025 19:23:13 +0200 Subject: [PATCH 9/9] fix lint warnings --- src/App.tsx | 2 +- tests/ui/components/IOURequestStepConfirmationPageTest.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 9157983a83ec..e0f8d3ec96cf 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,12 +4,12 @@ import {LogBox, View} from 'react-native'; import {GestureHandlerRootView} from 'react-native-gesture-handler'; import {PickerStateProvider} from 'react-native-picker-select'; import {SafeAreaProvider} from 'react-native-safe-area-context'; -import {CurrentUserPersonalDetailsProvider} from '@components/CurrentUserPersonalDetailsProvider'; import '../wdyr'; import {ActionSheetAwareScrollViewProvider} from './components/ActionSheetAwareScrollView'; import ActiveElementRoleProvider from './components/ActiveElementRoleProvider'; import ColorSchemeWrapper from './components/ColorSchemeWrapper'; import ComposeProviders from './components/ComposeProviders'; +import {CurrentUserPersonalDetailsProvider} from './components/CurrentUserPersonalDetailsProvider'; import CustomStatusBarAndBackground from './components/CustomStatusBarAndBackground'; import CustomStatusBarAndBackgroundContextProvider from './components/CustomStatusBarAndBackground/CustomStatusBarAndBackgroundContextProvider'; import ErrorBoundary from './components/ErrorBoundary'; diff --git a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx index 5f23c80f4c87..f1014384c7e6 100644 --- a/tests/ui/components/IOURequestStepConfirmationPageTest.tsx +++ b/tests/ui/components/IOURequestStepConfirmationPageTest.tsx @@ -167,7 +167,7 @@ describe('IOURequestStepConfirmationPageTest', () => { }); it('should create a split expense for each scanned receipt', async () => { - // await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN); + await signInWithTestUser(ACCOUNT_ID, ACCOUNT_LOGIN); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}1`, { ...DEFAULT_SPLIT_TRANSACTION,