diff --git a/src/pages/workspace/tags/ImportTagsOptionsPage.tsx b/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
index 5b5c80f754722..4f8cc743bbaa0 100644
--- a/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
+++ b/src/pages/workspace/tags/ImportTagsOptionsPage.tsx
@@ -1,13 +1,14 @@
import {useFocusEffect} from '@react-navigation/native';
import React, {useCallback, useMemo, useState} from 'react';
import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView';
-import ConfirmModal from '@components/ConfirmModal';
import DecisionModal from '@components/DecisionModal';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import MenuItem from '@components/MenuItem';
+import {ModalActions} from '@components/Modal/Global/ModalContext';
import ScreenWrapper from '@components/ScreenWrapper';
import Text from '@components/Text';
import TextLink from '@components/TextLink';
+import useConfirmModal from '@hooks/useConfirmModal';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
import useOnyx from '@hooks/useOnyx';
@@ -49,10 +50,9 @@ function ImportTagsOptionsPage({route}: ImportTagsOptionsPageProps) {
const isQuickSettingsFlow = !!backTo;
const {translate} = useLocalize();
const styles = useThemeStyles();
- const [isSwitchSingleToMultipleLevelTagWarningModalVisible, setIsSwitchSingleToMultipleLevelTagWarningModalVisible] = useState(false);
+ const {showConfirmModal} = useConfirmModal();
const expensifyIcons = useMemoizedLazyExpensifyIcons(['MultiTag', 'Tag']);
- const [isOverridingMultiTag, setIsOverridingMultiTag] = useState(false);
const [isDownloadFailureModalVisible, setIsDownloadFailureModalVisible] = useState(false);
const [shouldRunPostUpgradeFlow, setShouldRunPostUpgradeFlow] = useState(false);
const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true});
@@ -70,41 +70,52 @@ function ImportTagsOptionsPage({route}: ImportTagsOptionsPageProps) {
return Object.values(singleLevelTags).some((tag) => tag.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE);
}, [isMultiLevelTags, policyTagLists]);
- const startMultiLevelTagImportFlow = useCallback(() => {
- setImportedSpreadsheetIsImportingMultiLevelTags(true);
- if (hasVisibleTags) {
- if (isMultiLevelTags) {
- setIsOverridingMultiTag(true);
- } else {
- setIsSwitchSingleToMultipleLevelTagWarningModalVisible(true);
- }
- } else {
- Navigation.navigate(
- isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo)) : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
- );
- }
- }, [hasVisibleTags, policyID, isQuickSettingsFlow, backTo, isMultiLevelTags]);
-
- useFocusEffect(
- useCallback(() => {
- if (!shouldRunPostUpgradeFlow || !isControlPolicy(policy)) {
- return;
- }
-
- startMultiLevelTagImportFlow();
- setShouldRunPostUpgradeFlow(false);
- }, [shouldRunPostUpgradeFlow, policy, startMultiLevelTagImportFlow]),
+ const overrideMultiTagPrompt = useMemo(
+ () => (
+
+ {translate('workspace.tags.overrideMultiTagWarning.prompt1')}
+ <>
+ {translate('workspace.tags.overrideMultiTagWarning.prompt2')}
+ {
+ if (isMultiLevelTags) {
+ downloadMultiLevelTagsCSV(
+ policyID,
+ () => {
+ close(() => {
+ setIsDownloadFailureModalVisible(true);
+ });
+ },
+ hasDependentTags,
+ translate,
+ );
+ } else {
+ downloadTagsCSV(
+ policyID,
+ () => {
+ close(() => {
+ setIsDownloadFailureModalVisible(true);
+ });
+ },
+ translate,
+ );
+ }
+ }}
+ >
+ {translate('workspace.tags.overrideMultiTagWarning.prompt3')}
+
+ {translate('workspace.tags.overrideMultiTagWarning.prompt4')}
+ >
+
+ ),
+ [translate, isMultiLevelTags, policyID, hasDependentTags],
);
- if (hasAccountingConnections) {
- return ;
- }
-
- const overrideMultiTagPrompt = (
-
- {translate('workspace.tags.overrideMultiTagWarning.prompt1')}
- <>
- {translate('workspace.tags.overrideMultiTagWarning.prompt2')}
+ const switchSingleToMultiLevelTagPrompt = useMemo(
+ () => (
+
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt1')}
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt2')}
{
if (isMultiLevelTags) {
@@ -131,51 +142,79 @@ function ImportTagsOptionsPage({route}: ImportTagsOptionsPageProps) {
}
}}
>
- {translate('workspace.tags.overrideMultiTagWarning.prompt3')}
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt3')}
- {translate('workspace.tags.overrideMultiTagWarning.prompt4')}
- >
-
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt4')}
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt5')}
+ {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt6')}
+
+ ),
+ [translate, policyID, hasDependentTags, isMultiLevelTags],
);
- const switchSingleToMultiLevelTagPrompt = (
-
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt1')}
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt2')}
- {
- if (isMultiLevelTags) {
- downloadMultiLevelTagsCSV(
- policyID,
- () => {
- close(() => {
- setIsDownloadFailureModalVisible(true);
- });
- },
- hasDependentTags,
- translate,
- );
- } else {
- downloadTagsCSV(
- policyID,
- () => {
- close(() => {
- setIsDownloadFailureModalVisible(true);
- });
- },
- translate,
+ const startMultiLevelTagImportFlow = useCallback(async () => {
+ setImportedSpreadsheetIsImportingMultiLevelTags(true);
+ if (hasVisibleTags) {
+ if (isMultiLevelTags) {
+ const {action} = await showConfirmModal({
+ title: translate('workspace.tags.overrideMultiTagWarning.title'),
+ prompt: overrideMultiTagPrompt,
+ confirmText: translate('workspace.tags.overrideMultiTagWarning.title'),
+ cancelText: translate('common.cancel'),
+ danger: true,
+ });
+ if (action === ModalActions.CONFIRM) {
+ Navigation.navigate(
+ isQuickSettingsFlow
+ ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo))
+ : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
+ );
+ } else {
+ setImportedSpreadsheetIsImportingMultiLevelTags(false);
+ }
+ } else {
+ const {action} = await showConfirmModal({
+ title: translate('workspace.tags.switchSingleToMultiLevelTagWarning.title'),
+ prompt: switchSingleToMultiLevelTagPrompt,
+ confirmText: translate('workspace.tags.switchSingleToMultiLevelTagWarning.title'),
+ cancelText: translate('common.cancel'),
+ danger: true,
+ });
+ if (action === ModalActions.CONFIRM) {
+ cleanPolicyTags(policyID);
+ Navigation.setNavigationActionToMicrotaskQueue(() => {
+ Navigation.navigate(
+ isQuickSettingsFlow
+ ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo))
+ : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
);
- }
- }}
- >
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt3')}
-
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt4')}
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt5')}
- {translate('workspace.tags.switchSingleToMultiLevelTagWarning.prompt6')}
-
+ });
+ } else {
+ setImportedSpreadsheetIsImportingMultiLevelTags(false);
+ }
+ }
+ } else {
+ Navigation.navigate(
+ isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo)) : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
+ );
+ }
+ }, [hasVisibleTags, isMultiLevelTags, showConfirmModal, translate, overrideMultiTagPrompt, isQuickSettingsFlow, policyID, backTo, switchSingleToMultiLevelTagPrompt]);
+
+ useFocusEffect(
+ useCallback(() => {
+ if (!shouldRunPostUpgradeFlow || !isControlPolicy(policy)) {
+ return;
+ }
+
+ startMultiLevelTagImportFlow();
+ setShouldRunPostUpgradeFlow(false);
+ }, [shouldRunPostUpgradeFlow, policy, startMultiLevelTagImportFlow]),
);
+ if (hasAccountingConnections) {
+ return ;
+ }
+
return (
{
+ onPress={async () => {
setImportedSpreadsheetIsImportingMultiLevelTags(false);
if (hasVisibleTags && isMultiLevelTags) {
- setIsSwitchSingleToMultipleLevelTagWarningModalVisible(true);
+ const {action} = await showConfirmModal({
+ title: translate('workspace.tags.switchSingleToMultiLevelTagWarning.title'),
+ prompt: switchSingleToMultiLevelTagPrompt,
+ confirmText: translate('workspace.tags.switchSingleToMultiLevelTagWarning.title'),
+ cancelText: translate('common.cancel'),
+ danger: true,
+ });
+ if (action === ModalActions.CONFIRM) {
+ cleanPolicyTags(policyID);
+ Navigation.setNavigationActionToMicrotaskQueue(() => {
+ Navigation.navigate(
+ isQuickSettingsFlow
+ ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo))
+ : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
+ );
+ });
+ } else {
+ setImportedSpreadsheetIsImportingMultiLevelTags(false);
+ }
} else {
Navigation.navigate(
isQuickSettingsFlow
@@ -238,47 +295,6 @@ function ImportTagsOptionsPage({route}: ImportTagsOptionsPageProps) {
isVisible={isDownloadFailureModalVisible}
onClose={() => setIsDownloadFailureModalVisible(false)}
/>
- {
- cleanPolicyTags(policyID);
- setIsSwitchSingleToMultipleLevelTagWarningModalVisible(false);
- Navigation.navigate(
- isQuickSettingsFlow
- ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo))
- : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
- );
- }}
- title={translate('workspace.tags.switchSingleToMultiLevelTagWarning.title')}
- prompt={switchSingleToMultiLevelTagPrompt}
- confirmText={translate('workspace.tags.switchSingleToMultiLevelTagWarning.title')}
- danger
- cancelText={translate('common.cancel')}
- onCancel={() => {
- setIsSwitchSingleToMultipleLevelTagWarningModalVisible(false);
- setImportedSpreadsheetIsImportingMultiLevelTags(false);
- }}
- />
- {
- setIsOverridingMultiTag(false);
- Navigation.navigate(
- isQuickSettingsFlow
- ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo))
- : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID),
- );
- }}
- title={translate('workspace.tags.overrideMultiTagWarning.title')}
- prompt={overrideMultiTagPrompt}
- confirmText={translate('workspace.tags.overrideMultiTagWarning.title')}
- danger
- cancelText={translate('common.cancel')}
- onCancel={() => {
- setIsOverridingMultiTag(false);
- setImportedSpreadsheetIsImportingMultiLevelTags(false);
- }}
- />
);
}
diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx
index 693bea4618dfa..9ca9c0f9a9229 100644
--- a/src/pages/workspace/tags/TagSettingsPage.tsx
+++ b/src/pages/workspace/tags/TagSettingsPage.tsx
@@ -1,14 +1,14 @@
-import React, {useEffect, useState} from 'react';
+import React, {useEffect} from 'react';
import {View} from 'react-native';
-import ConfirmModal from '@components/ConfirmModal';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
-import * as Expensicons from '@components/Icon/Expensicons';
import MenuItem from '@components/MenuItem';
import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
+import {ModalActions} from '@components/Modal/Global/ModalContext';
import OfflineWithFeedback from '@components/OfflineWithFeedback';
import ScreenWrapper from '@components/ScreenWrapper';
import Switch from '@components/Switch';
import Text from '@components/Text';
+import useConfirmModal from '@hooks/useConfirmModal';
import useEnvironment from '@hooks/useEnvironment';
import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset';
import useLocalize from '@hooks/useLocalize';
@@ -44,15 +44,14 @@ type TagSettingsPageProps =
function TagSettingsPage({route, navigation}: TagSettingsPageProps) {
const {orderWeight, policyID, tagName, backTo, parentTagsFilter} = route.params;
const styles = useThemeStyles();
- const expensifyIcons = useMemoizedLazyExpensifyIcons(['Lock']);
const {translate} = useLocalize();
+ const {showConfirmModal} = useConfirmModal();
const policyData = usePolicyData(policyID);
const {policy, tags: policyTags} = policyData;
const policyTag = getTagListByOrderWeight(policyTags, orderWeight);
const {environmentURL} = useEnvironment();
const hasAccountingConnections = hasAccountingConnectionsPolicyUtils(policy);
- const [isDeleteTagModalOpen, setIsDeleteTagModalOpen] = React.useState(false);
- const [isCannotDeleteOrDisableLastTagModalVisible, setIsCannotDeleteOrDisableLastTagModalVisible] = useState(false);
+ const expensifyIcons = useMemoizedLazyExpensifyIcons(['Lock', 'Trashcan'] as const);
const isQuickSettingsFlow = route.name === SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS;
const tagApprover = getTagApproverRule(policy, route.params?.tagName)?.approver ?? '';
const approver = getPersonalDetailByEmail(tagApprover);
@@ -75,15 +74,14 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) {
return ;
}
- const deleteTagAndHideModal = () => {
- deletePolicyTags(policyData, [currentPolicyTag.name]);
- setIsDeleteTagModalOpen(false);
- Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined);
- };
-
const updateWorkspaceTagEnabled = (value: boolean) => {
if (shouldPreventDisableOrDelete) {
- setIsCannotDeleteOrDisableLastTagModalVisible(true);
+ showConfirmModal({
+ title: translate('workspace.tags.cannotDeleteOrDisableAllTags.title'),
+ prompt: translate('workspace.tags.cannotDeleteOrDisableAllTags.description'),
+ confirmText: translate('common.buttonConfirm'),
+ shouldShowCancelButton: false,
+ });
return;
}
setWorkspaceTagEnabled(policyData, {[currentPolicyTag.name]: {name: currentPolicyTag.name, enabled: value}}, policyTag.orderWeight);
@@ -148,26 +146,6 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) {
shouldSetModalVisibility={false}
onBackButtonPress={() => Navigation.goBack(isQuickSettingsFlow ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : undefined)}
/>
- setIsDeleteTagModalOpen(false)}
- shouldSetModalVisibility={false}
- prompt={translate('workspace.tags.deleteTagConfirmation')}
- confirmText={translate('common.delete')}
- cancelText={translate('common.cancel')}
- danger
- />
- setIsCannotDeleteOrDisableLastTagModalVisible(false)}
- onCancel={() => setIsCannotDeleteOrDisableLastTagModalVisible(false)}
- title={translate('workspace.tags.cannotDeleteOrDisableAllTags.title')}
- prompt={translate('workspace.tags.cannotDeleteOrDisableAllTags.description')}
- confirmText={translate('common.buttonConfirm')}
- shouldShowCancelButton={false}
- />
{!hasDependentTags && (
@@ -237,14 +215,32 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) {
{shouldShowDeleteMenuItem && (