Skip to content

Commit e246376

Browse files
Merge pull request Expensify#67010 from Krishna2323/krishna2323/issue/64107_2
mWeb - Incorrect navigation to confirm details page & discard changes popup briefly visible
2 parents 095540c + c095444 commit e246376

4 files changed

Lines changed: 30 additions & 11 deletions

File tree

src/pages/iou/request/step/DiscardChangesConfirmation/index.tsx

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import React, {memo, useCallback, useEffect, useRef, useState} from 'react';
44
import ConfirmModal from '@components/ConfirmModal';
55
import useBeforeRemove from '@hooks/useBeforeRemove';
66
import useLocalize from '@hooks/useLocalize';
7+
import navigateAfterInteraction from '@libs/Navigation/navigateAfterInteraction';
78
import navigationRef from '@libs/Navigation/navigationRef';
89
import type {PlatformStackNavigationProp} from '@libs/Navigation/PlatformStackNavigation/types';
910
import type {RootNavigatorParamList} from '@libs/Navigation/types';
1011
import type DiscardChangesConfirmationProps from './types';
1112

12-
function DiscardChangesConfirmation({getHasUnsavedChanges}: DiscardChangesConfirmationProps) {
13+
function DiscardChangesConfirmation({getHasUnsavedChanges, onCancel}: DiscardChangesConfirmationProps) {
1314
const navigation = useNavigation<PlatformStackNavigationProp<RootNavigatorParamList>>();
1415
const {translate} = useLocalize();
1516
const [isVisible, setIsVisible] = useState(false);
@@ -25,7 +26,7 @@ function DiscardChangesConfirmation({getHasUnsavedChanges}: DiscardChangesConfir
2526

2627
e.preventDefault();
2728
blockedNavigationAction.current = e.data.action;
28-
setIsVisible(true);
29+
navigateAfterInteraction(() => setIsVisible((prev) => !prev));
2930
},
3031
[getHasUnsavedChanges],
3132
),
@@ -39,16 +40,19 @@ function DiscardChangesConfirmation({getHasUnsavedChanges}: DiscardChangesConfir
3940
useEffect(() => {
4041
// transitionStart is triggered before the previous page is fully loaded so RHP sliding animation
4142
// could be less "glitchy" when going back and forth between the previous and current pages
42-
const unsubscribe = navigation.addListener('transitionStart', () => {
43+
const unsubscribe = navigation.addListener('transitionStart', ({data: {closing}}) => {
4344
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
44-
if (!getHasUnsavedChanges() || blockedNavigationAction.current || shouldNavigateBack.current) {
45+
if (!getHasUnsavedChanges()) {
46+
return;
47+
}
48+
shouldNavigateBack.current = true;
49+
if (closing) {
50+
window.history.go(1);
4551
return;
4652
}
47-
4853
// Navigation.navigate() rerenders the current page and resets its states
4954
window.history.go(1);
50-
setIsVisible(true);
51-
shouldNavigateBack.current = true;
55+
navigateAfterInteraction(() => setIsVisible((prev) => !prev));
5256
});
5357

5458
return unsubscribe;
@@ -78,6 +82,10 @@ function DiscardChangesConfirmation({getHasUnsavedChanges}: DiscardChangesConfir
7882
blockedNavigationAction.current = undefined;
7983
shouldNavigateBack.current = false;
8084
}}
85+
onModalHide={() => {
86+
shouldNavigateBack.current = false;
87+
onCancel?.();
88+
}}
8189
/>
8290
);
8391
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
type DiscardChangesConfirmationProps = {
22
getHasUnsavedChanges: () => boolean;
3+
onCancel?: () => void;
34
};
45

56
export default DiscardChangesConfirmationProps;

src/pages/iou/request/step/IOURequestStepDescription.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import lodashIsEmpty from 'lodash/isEmpty';
22
import React, {useCallback, useMemo, useRef} from 'react';
3-
import {View} from 'react-native';
3+
import {InteractionManager, View} from 'react-native';
44
import type {OnyxEntry} from 'react-native-onyx';
55
import FormProvider from '@components/Form/FormProvider';
66
import InputWrapper from '@components/Form/InputWrapper';
@@ -64,7 +64,7 @@ function IOURequestStepDescription({
6464
const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: false});
6565
const styles = useThemeStyles();
6666
const {translate} = useLocalize();
67-
const {inputCallbackRef} = useAutoFocusInput(true);
67+
const {inputCallbackRef, inputRef} = useAutoFocusInput(true);
6868
const isEditing = action === CONST.IOU.ACTION.EDIT;
6969
// In the split flow, when editing we use SPLIT_TRANSACTION_DRAFT to save draft value
7070
const isEditingSplit = (iouType === CONST.IOU.TYPE.SPLIT || iouType === CONST.IOU.TYPE.SPLIT_EXPENSE) && isEditing;
@@ -200,6 +200,11 @@ function IOURequestStepDescription({
200200
</View>
201201
</FormProvider>
202202
<DiscardChangesConfirmation
203+
onCancel={() => {
204+
InteractionManager.runAfterInteractions(() => {
205+
inputRef.current?.focus();
206+
});
207+
}}
203208
getHasUnsavedChanges={() => {
204209
if (isSavedRef.current) {
205210
return false;

src/pages/iou/request/step/IOURequestStepMerchant.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, {useCallback, useRef} from 'react';
2-
import {View} from 'react-native';
2+
import {InteractionManager, View} from 'react-native';
33
import FormProvider from '@components/Form/FormProvider';
44
import InputWrapper from '@components/Form/InputWrapper';
55
import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
@@ -42,7 +42,7 @@ function IOURequestStepMerchant({
4242
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${report?.policyID}`, {canBeMissing: true});
4343
const styles = useThemeStyles();
4444
const {translate} = useLocalize();
45-
const {inputCallbackRef} = useAutoFocusInput();
45+
const {inputCallbackRef, inputRef} = useAutoFocusInput();
4646
const isEditing = action === CONST.IOU.ACTION.EDIT;
4747
// eslint-disable-next-line rulesdir/no-negated-variables
4848
const shouldShowNotFoundPage = useShowNotFoundPageInIOUStep(action, iouType, report, CONST.EDIT_REQUEST_FIELD.MERCHANT);
@@ -144,6 +144,11 @@ function IOURequestStepMerchant({
144144
</View>
145145
</FormProvider>
146146
<DiscardChangesConfirmation
147+
onCancel={() => {
148+
InteractionManager.runAfterInteractions(() => {
149+
inputRef.current?.focus();
150+
});
151+
}}
147152
getHasUnsavedChanges={() => {
148153
if (isSavedRef.current) {
149154
return false;

0 commit comments

Comments
 (0)