From 142f98ebcc3d2fe96d8c69972d4607de29967683 Mon Sep 17 00:00:00 2001 From: Nicolay Arefyeu Date: Thu, 30 Jan 2025 18:18:43 +0200 Subject: [PATCH] Allow NewDot collect customers to add one third-party card feed --- src/ROUTES.ts | 2 +- src/languages/en.ts | 4 ++-- src/languages/es.ts | 4 ++-- src/libs/Navigation/types.ts | 1 + src/libs/actions/Policy/Policy.ts | 4 ++++ .../workspace/WorkspaceMoreFeaturesPage.tsx | 4 ---- .../WorkspaceCompanyCardFeedSelectorPage.tsx | 21 ++++++++++++++----- .../companyCards/addNew/SelectBankStep.tsx | 9 ++++++++ .../upgrade/WorkspaceUpgradePage.tsx | 4 +++- 9 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index d08669c2693d6..901e199c05b77 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -1362,7 +1362,7 @@ const ROUTES = { }, WORKSPACE_COMPANY_CARDS_ADD_NEW: { route: 'settings/workspaces/:policyID/company-cards/add-card-feed', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/company-cards/add-card-feed` as const, + getRoute: (policyID: string, backTo?: string) => getUrlWithBackToParam(`settings/workspaces/${policyID}/company-cards/add-card-feed`, backTo), }, WORKSPACE_COMPANY_CARDS_SELECT_FEED: { route: 'settings/workspaces/:policyID/company-cards/select-feed', diff --git a/src/languages/en.ts b/src/languages/en.ts index f2e4428bb6ae8..0dd83d8c03337 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4413,8 +4413,8 @@ const translations = { onlyAvailableOnPlan: 'Tax codes are only available on the Control plan, starting at ', }, companyCards: { - title: 'Company cards', - description: `Connect your existing corporate cards to Expensify, assign them to employees, and automatically import transactions.`, + title: 'Additional Company cards', + description: `Upgrading lets you import company cards from additional card issuers. You can assign cards to employees, and automatically import transactions across all major card issuers.`, onlyAvailableOnPlan: 'Company cards are only available on the Control plan, starting at ', }, rules: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 9e44e060487da..16200237de53d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4479,8 +4479,8 @@ const translations = { onlyAvailableOnPlan: 'Los código de impuesto mayor solo están disponibles en el plan Controlar, a partir de ', }, companyCards: { - title: 'Tarjetas de empresa', - description: `Conecta tus tarjetas corporativas existentes a Expensify, asígnalas a empleados e importa transacciones automáticamente.`, + title: 'Tarjetas de empresa adicionales', + description: `La actualización le permite importar tarjetas de empresa de emisores de tarjetas adicionales. Puede asignar tarjetas a empleados e importar automáticamente transacciones de todos los principales emisores de tarjetas.`, onlyAvailableOnPlan: 'Las tarjetas de empresa solo están disponibles en el plan Controlar, a partir de ', }, rules: { diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 2e75b1e36280a..03ef64b0d68a5 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1532,6 +1532,7 @@ type FullScreenNavigatorParamList = { }; [SCREENS.WORKSPACE.COMPANY_CARDS_ADD_NEW]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.PER_DIEM]: { policyID: string; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index c4752be4c974a..599789b414e9e 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -1668,6 +1668,7 @@ function createDraftInitialWorkspace(policyOwnerEmail = '', policyName = '', pol ownerAccountID: sessionAccountID, isPolicyExpenseChatEnabled: true, areCategoriesEnabled: true, + areCompanyCardsEnabled: true, outputCurrency, pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.ADD, customUnits, @@ -1762,6 +1763,7 @@ function buildPolicyData( }, customUnits, areCategoriesEnabled: true, + areCompanyCardsEnabled: true, areTagsEnabled: false, areDistanceRatesEnabled: false, areWorkflowsEnabled: false, @@ -2065,6 +2067,7 @@ function createDraftWorkspace(policyOwnerEmail = '', makeMeAdmin = false, policy }, customUnits, areCategoriesEnabled: true, + areCompanyCardsEnabled: true, areTagsEnabled: false, areDistanceRatesEnabled: false, areWorkflowsEnabled: false, @@ -2378,6 +2381,7 @@ function createWorkspaceFromIOUPayment(iouReport: OnyxEntry): WorkspaceF }, customUnits, areCategoriesEnabled: true, + areCompanyCardsEnabled: true, areTagsEnabled: false, areDistanceRatesEnabled: false, areWorkflowsEnabled: false, diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 6cdf4ad676c36..b8bdc4a4ed12e 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -149,10 +149,6 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro if (!policyID) { return; } - if (isEnabled && !isControlPolicy(policy)) { - Navigation.navigate(ROUTES.WORKSPACE_UPGRADE.getRoute(policyID, CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards.alias, ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID))); - return; - } enableCompanyCards(policyID, isEnabled, true); }, disabledAction: () => { diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx index ae677ca5dbaf8..093fe25b74fdf 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx @@ -9,11 +9,12 @@ import SelectionList from '@components/SelectionList'; import RadioListItem from '@components/SelectionList/RadioListItem'; import type {ListItem} from '@components/SelectionList/types'; import useLocalize from '@hooks/useLocalize'; +import usePolicy from '@hooks/usePolicy'; import useThemeStyles from '@hooks/useThemeStyles'; import {checkIfFeedConnectionIsBroken, getCardFeedIcon, getCompanyFeeds, getCustomOrFormattedFeedName, getSelectedFeed} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; -import {getWorkspaceAccountID} from '@libs/PolicyUtils'; +import {getWorkspaceAccountID, isCollectPolicy} from '@libs/PolicyUtils'; import Navigation from '@navigation/Navigation'; import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import variables from '@styles/variables'; @@ -43,6 +44,8 @@ function WorkspaceCompanyCardFeedSelectorPage({route}: WorkspaceCompanyCardFeedS const [lastSelectedFeed] = useOnyx(`${ONYXKEYS.COLLECTION.LAST_SELECTED_FEED}${policyID}`); const selectedFeed = getSelectedFeed(lastSelectedFeed, cardFeeds); const companyFeeds = getCompanyFeeds(cardFeeds); + const policy = usePolicy(policyID); + const isCollect = isCollectPolicy(policy); const feeds: CardFeedListItem[] = (Object.keys(companyFeeds) as CompanyCardFeed[]).map((feed) => { const isFeedConnectionBroken = checkIfFeedConnectionIsBroken(allFeedsCards?.[`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${feed}`]); @@ -66,6 +69,17 @@ function WorkspaceCompanyCardFeedSelectorPage({route}: WorkspaceCompanyCardFeedS }; }); + const onAddCardsPress = () => { + clearAddNewCardFlow(); + if (isCollect && feeds.length === 1) { + Navigation.navigate( + ROUTES.WORKSPACE_UPGRADE.getRoute(policyID, CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards.alias, ROUTES.WORKSPACE_COMPANY_CARDS_SELECT_FEED.getRoute(policyID)), + ); + return; + } + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.getRoute(policyID)); + }; + const goBack = () => Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); const selectFeed = (feed: CardFeedListItem) => { @@ -98,10 +112,7 @@ function WorkspaceCompanyCardFeedSelectorPage({route}: WorkspaceCompanyCardFeedS { - clearAddNewCardFlow(); - Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.getRoute(policyID)); - }} + onPress={onAddCardsPress} /> } /> diff --git a/src/pages/workspace/companyCards/addNew/SelectBankStep.tsx b/src/pages/workspace/companyCards/addNew/SelectBankStep.tsx index 15ead5b9a3238..c9af2e4a46ab6 100644 --- a/src/pages/workspace/companyCards/addNew/SelectBankStep.tsx +++ b/src/pages/workspace/companyCards/addNew/SelectBankStep.tsx @@ -1,3 +1,4 @@ +import {useRoute} from '@react-navigation/native'; import React, {useEffect, useState} from 'react'; import {View} from 'react-native'; import {useOnyx} from 'react-native-onyx'; @@ -13,13 +14,17 @@ import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import * as CardUtils from '@libs/CardUtils'; import Navigation from '@navigation/Navigation'; +import type {PlatformStackRouteProp} from '@navigation/PlatformStackNavigation/types'; +import type {FullScreenNavigatorParamList} from '@navigation/types'; import variables from '@styles/variables'; import * as CompanyCards from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; +import type SCREENS from '@src/SCREENS'; function SelectBankStep() { const {translate} = useLocalize(); + const route = useRoute>(); const styles = useThemeStyles(); const [addNewCard] = useOnyx(ONYXKEYS.ADD_NEW_COMPANY_CARD); const [bankSelected, setBankSelected] = useState>(); @@ -50,6 +55,10 @@ function SelectBankStep() { }, [addNewCard?.data.selectedBank]); const handleBackButtonPress = () => { + if (route?.params?.backTo) { + Navigation.navigate(route.params.backTo); + return; + } Navigation.goBack(); }; diff --git a/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx b/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx index 1d9063a9cebac..245b3f460bf90 100644 --- a/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx +++ b/src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx @@ -80,8 +80,10 @@ function WorkspaceUpgradePage({route}: WorkspaceUpgradePageProps) { return; } } - case CONST.UPGRADE_FEATURE_INTRO_MAPPING.rules.id: case CONST.UPGRADE_FEATURE_INTRO_MAPPING.companyCards.id: + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.getRoute(policyID, ROUTES.WORKSPACE_COMPANY_CARDS_SELECT_FEED.getRoute(policyID))); + return; + case CONST.UPGRADE_FEATURE_INTRO_MAPPING.rules.id: case CONST.UPGRADE_FEATURE_INTRO_MAPPING.perDiem.id: Navigation.dismissModal(); return Navigation.navigate(ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID));