diff --git a/src/libs/Navigation/Navigation.ts b/src/libs/Navigation/Navigation.ts index 4301c2f13b92..3fa3e0c5c317 100644 --- a/src/libs/Navigation/Navigation.ts +++ b/src/libs/Navigation/Navigation.ts @@ -19,6 +19,7 @@ import originalGetTopmostReportId from './getTopmostReportId'; import linkingConfig from './linkingConfig'; import linkTo from './linkTo'; import navigationRef from './navigationRef'; +import setNavigationActionToMicrotaskQueue from './setNavigationActionToMicrotaskQueue'; import switchPolicyID from './switchPolicyID'; import type {NavigationStateRoute, State, StateOrRoute, SwitchPolicyIDParams} from './types'; @@ -384,6 +385,7 @@ export default { resetToHome, isDisplayedInModal, closeRHPFlow, + setNavigationActionToMicrotaskQueue, }; export {navigationRef}; diff --git a/src/libs/Navigation/setNavigationActionToMicrotaskQueue.ts b/src/libs/Navigation/setNavigationActionToMicrotaskQueue.ts new file mode 100644 index 000000000000..f6c221185de6 --- /dev/null +++ b/src/libs/Navigation/setNavigationActionToMicrotaskQueue.ts @@ -0,0 +1,13 @@ +export default function setNavigationActionToMicrotaskQueue(navigationAction: () => void) { + /** + * The function is used when the app needs to set a navigation action to the microtask queue, it guarantees to execute Onyx.update first, then the navigation action. + * More details - https://github.com/Expensify/App/issues/37785#issuecomment-1989056726. + */ + new Promise((resolve) => { + resolve(); + }).then(() => { + requestAnimationFrame(() => { + navigationAction(); + }); + }); +} diff --git a/src/pages/iou/request/step/IOURequestStepCurrency.tsx b/src/pages/iou/request/step/IOURequestStepCurrency.tsx index 8669563f3b9f..9fec4019f49c 100644 --- a/src/pages/iou/request/step/IOURequestStepCurrency.tsx +++ b/src/pages/iou/request/step/IOURequestStepCurrency.tsx @@ -61,7 +61,8 @@ function IOURequestStepCurrency({ if (pageIndex !== 'confirm') { IOU.setMoneyRequestCurrency(transactionID, option.currencyCode, action === CONST.IOU.ACTION.EDIT); } - navigateBack(option.currencyCode); + + Navigation.setNavigationActionToMicrotaskQueue(() => navigateBack(option.currencyCode)); }; return ( diff --git a/src/pages/workspace/WorkspaceProfileCurrencyPage.tsx b/src/pages/workspace/WorkspaceProfileCurrencyPage.tsx index 8d00975c7494..9ee7840c2cf6 100644 --- a/src/pages/workspace/WorkspaceProfileCurrencyPage.tsx +++ b/src/pages/workspace/WorkspaceProfileCurrencyPage.tsx @@ -20,7 +20,7 @@ function WorkspaceProfileCurrencyPage({policy}: WorkspaceProfileCurrencyPageProp const onSelectCurrency = (item: CurrencyListItem) => { Policy.updateGeneralSettings(policy?.id ?? '', policy?.name ?? '', item.currencyCode); - Navigation.goBack(); + Navigation.setNavigationActionToMicrotaskQueue(Navigation.goBack); }; return (