Skip to content

Commit 5efabaa

Browse files
Revert ConfirmationPage modal removal, fix navigation and data reset
Reverts the approach of delegating the success modal to ImportedMembersPage. Instead, keeps ImportSpreadsheetConfirmModal on ImportedMembersConfirmationPage for consistency with other import screens (categories, tags, per diem). Fixes: - Navigation after "Got it": moves Navigation.goBack() into closeImportPageAndModal (the onModalHide callback is overridden by ConfirmModalWrapper so it never fires). - Modal reopening: calls closeImportPage() in closeImportPageAndModal to immediately clear shouldFinalModalBeOpened before navigating, preventing ImportedMembersPage's modal from firing during the transition. - Data reset behind modal: freezes the displayed member list once import starts using a ref, so the UI doesn't flash empty data when the policy updates with the newly imported members. Co-authored-by: Yauheni Horbach <ZhenjaHorbach@users.noreply.github.com>
1 parent 6d98c1c commit 5efabaa

File tree

2 files changed

+33
-13
lines changed

2 files changed

+33
-13
lines changed

src/pages/workspace/members/ImportedMembersConfirmationPage.tsx

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1-
import React, {useCallback, useEffect, useMemo, useState} from 'react';
1+
import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';
22
import {View} from 'react-native';
33
import type {GestureResponderEvent} from 'react-native/Libraries/Types/CoreEventTypes';
44
import type {ValueOf} from 'type-fest';
55
import Button from '@components/Button';
66
import FixedFooter from '@components/FixedFooter';
77
import HeaderWithBackButton from '@components/HeaderWithBackButton';
8+
import ImportSpreadsheetConfirmModal from '@components/ImportSpreadsheetConfirmModal';
89
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
910
import {usePersonalDetails} from '@components/OnyxListItemProvider';
1011
import PressableWithoutFeedback from '@components/Pressable/PressableWithoutFeedback';
1112
import ReportActionAvatars from '@components/ReportActionAvatars';
1213
import ScreenWrapper from '@components/ScreenWrapper';
1314
import Text from '@components/Text';
15+
import useCloseImportPage from '@hooks/useCloseImportPage';
1416
import useLocalize from '@hooks/useLocalize';
1517
import useNetwork from '@hooks/useNetwork';
1618
import useOnyx from '@hooks/useOnyx';
1719
import usePolicy from '@hooks/usePolicy';
1820
import useThemeStyles from '@hooks/useThemeStyles';
21+
import {closeImportPage} from '@libs/actions/ImportSpreadsheet';
1922
import {openExternalLink} from '@libs/actions/Link';
2023
import {clearImportedSpreadsheetMemberData, importPolicyMembers} from '@libs/actions/Policy/Member';
2124
import Navigation from '@libs/Navigation/Navigation';
@@ -28,6 +31,7 @@ import WorkspaceMemberDetailsRoleSelectionModal from '@pages/workspace/Workspace
2831
import type {ListItemType} from '@pages/workspace/WorkspaceMemberRoleSelectionModal';
2932
import CONST from '@src/CONST';
3033
import ONYXKEYS from '@src/ONYXKEYS';
34+
import ROUTES from '@src/ROUTES';
3135
import type SCREENS from '@src/SCREENS';
3236

3337
type ImportedMembersConfirmationPageProps = PlatformStackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.MEMBERS_IMPORTED>;
@@ -45,26 +49,26 @@ function ImportedMembersConfirmationPage({route}: ImportedMembersConfirmationPag
4549
const {isOffline} = useNetwork();
4650

4751
const personalDetails = usePersonalDetails();
52+
const {setIsClosing} = useCloseImportPage();
53+
4854
useEffect(() => {
4955
return () => {
5056
clearImportedSpreadsheetMemberData();
5157
};
5258
}, []);
5359

54-
// Navigate back to ImportedMembersPage when import succeeds so the
55-
// confirm-details screen closes while the global success modal (rendered
56-
// by ImportedMembersPage's ImportSpreadsheetConfirmModal) is shown.
57-
useEffect(() => {
58-
if (!spreadsheet?.shouldFinalModalBeOpened) {
59-
return;
60-
}
61-
Navigation.goBack();
62-
}, [spreadsheet?.shouldFinalModalBeOpened]);
63-
6460
const [importedSpreadsheetMemberData] = useOnyx(ONYXKEYS.IMPORTED_SPREADSHEET_MEMBER_DATA);
65-
const newMembers = useMemo(() => {
61+
const computedNewMembers = useMemo(() => {
6662
return importedSpreadsheetMemberData?.filter((member) => !isPolicyMemberWithoutPendingDelete(member.email, policy) && !member.role) ?? [];
6763
}, [importedSpreadsheetMemberData, policy]);
64+
65+
// Freeze the displayed members once import starts so the UI doesn't reset
66+
// when the policy updates with the newly imported members.
67+
const newMembersRef = useRef(computedNewMembers);
68+
if (!isImporting) {
69+
newMembersRef.current = computedNewMembers;
70+
}
71+
const newMembers = newMembersRef.current;
6872
const invitedEmailsToAccountIDsDraft = useMemo(() => {
6973
const memberEmails = newMembers.map((member) => member.email);
7074
return memberEmails.reduce(
@@ -93,6 +97,13 @@ function ImportedMembersConfirmationPage({route}: ImportedMembersConfirmationPag
9397
importPolicyMembers(policy, membersWithRole);
9498
}, [importedSpreadsheetMemberData, newMembers, policy, role]);
9599

100+
const closeImportPageAndModal = () => {
101+
setIsClosing(true);
102+
setIsImporting(false);
103+
closeImportPage();
104+
Navigation.goBack(ROUTES.WORKSPACE_MEMBERS.getRoute(policyID));
105+
};
106+
96107
const onRoleChange = (item: ListItemType) => {
97108
setRole(item.value);
98109
setIsRoleSelectionModalVisible(false);
@@ -200,6 +211,11 @@ function ImportedMembersConfirmationPage({route}: ImportedMembersConfirmationPag
200211
</View>
201212
</PressableWithoutFeedback>
202213
</FixedFooter>
214+
<ImportSpreadsheetConfirmModal
215+
isVisible={spreadsheet?.shouldFinalModalBeOpened}
216+
closeImportPageAndModal={closeImportPageAndModal}
217+
shouldHandleNavigationBack={false}
218+
/>
203219
<WorkspaceMemberDetailsRoleSelectionModal
204220
isVisible={isRoleSelectionModalVisible}
205221
items={roleItems}

src/pages/workspace/members/ImportedMembersPage.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {useIsFocused} from '@react-navigation/native';
22
import React, {useCallback, useState} from 'react';
3+
import {InteractionManager} from 'react-native';
34
import HeaderWithBackButton from '@components/HeaderWithBackButton';
45
import type {ColumnRole} from '@components/ImportColumn';
56
import ImportSpreadsheetColumns from '@components/ImportSpreadsheetColumns';
@@ -174,7 +175,6 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
174175
setIsClosing(true);
175176
setIsImporting(false);
176177
setShouldShowConfirmModal(false);
177-
Navigation.goBack(ROUTES.WORKSPACE_MEMBERS.getRoute(policyID));
178178
};
179179

180180
return (
@@ -199,6 +199,10 @@ function ImportedMembersPage({route}: ImportedMembersPageProps) {
199199
<ImportSpreadsheetConfirmModal
200200
isVisible={spreadsheet?.shouldFinalModalBeOpened && shouldShowConfirmModal && isFocused}
201201
closeImportPageAndModal={closeImportPageAndModal}
202+
onModalHide={() => {
203+
// eslint-disable-next-line @typescript-eslint/no-deprecated
204+
InteractionManager.runAfterInteractions(() => Navigation.goBack(ROUTES.WORKSPACE_MEMBERS.getRoute(policyID)));
205+
}}
202206
/>
203207
</ScreenWrapper>
204208
);

0 commit comments

Comments
 (0)