diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 9ebcd6c11f05..a5130083dc0f 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -978,6 +978,7 @@ const READ_COMMANDS = { OPEN_POLICY_REPORT_FIELDS_PAGE: 'OpenPolicyReportFieldsPage', OPEN_POLICY_EXPENSIFY_CARDS_PAGE: 'OpenPolicyExpensifyCardsPage', OPEN_POLICY_COMPANY_CARDS_FEED: 'OpenPolicyCompanyCardsFeed', + OPEN_ASSIGN_FEED_CARD_PAGE: 'OpenAssignFeedCardPage', OPEN_POLICY_COMPANY_CARDS_PAGE: 'OpenPolicyCompanyCardsPage', OPEN_POLICY_EDIT_CARD_LIMIT_TYPE_PAGE: 'OpenPolicyEditCardLimitTypePage', OPEN_SEARCH_FILTERS_CARD_PAGE: 'OpenSearchFiltersCardPage', @@ -1054,6 +1055,7 @@ type ReadCommandParameters = { [READ_COMMANDS.OPEN_POLICY_EXPENSIFY_CARDS_PAGE]: Parameters.OpenPolicyExpensifyCardsPageParams; [READ_COMMANDS.OPEN_POLICY_COMPANY_CARDS_PAGE]: Parameters.OpenPolicyExpensifyCardsPageParams; [READ_COMMANDS.OPEN_POLICY_COMPANY_CARDS_FEED]: Parameters.OpenPolicyCompanyCardsFeedParams; + [READ_COMMANDS.OPEN_ASSIGN_FEED_CARD_PAGE]: Parameters.OpenPolicyCompanyCardsFeedParams; [READ_COMMANDS.OPEN_POLICY_EDIT_CARD_LIMIT_TYPE_PAGE]: Parameters.OpenPolicyEditCardLimitTypePageParams; [READ_COMMANDS.OPEN_SEARCH_FILTERS_CARD_PAGE]: null; [READ_COMMANDS.OPEN_POLICY_PROFILE_PAGE]: Parameters.OpenPolicyProfilePageParams; diff --git a/src/libs/CardUtils.ts b/src/libs/CardUtils.ts index 7a48cf6bcf90..730dca6acdf3 100644 --- a/src/libs/CardUtils.ts +++ b/src/libs/CardUtils.ts @@ -512,6 +512,11 @@ function checkIfFeedConnectionIsBroken(feedCards: Record | undefin return Object.values(feedCards).some((card) => card.bank !== feedToExclude && card.lastScrapeResult !== 200); } +function hasCardListObject(workspaceAccountID: number, feedName: CompanyCardFeed): boolean { + const workspaceCards = allWorkspaceCards?.[`cards_${workspaceAccountID}_${feedName}`] ?? {}; + return !!workspaceCards.cardList; +} + export { isExpensifyCard, isCorporateCard, @@ -549,4 +554,5 @@ export { getFeedType, flatAllCardsList, checkIfFeedConnectionIsBroken, + hasCardListObject, }; diff --git a/src/libs/actions/CompanyCards.ts b/src/libs/actions/CompanyCards.ts index c548d7014322..ef8a54d61071 100644 --- a/src/libs/actions/CompanyCards.ts +++ b/src/libs/actions/CompanyCards.ts @@ -724,6 +724,45 @@ function openPolicyCompanyCardsFeed(policyID: string, feed: CompanyCardFeed) { API.read(READ_COMMANDS.OPEN_POLICY_COMPANY_CARDS_FEED, parameters); } +function openAssignFeedCardPage(policyID: string, feed: CompanyCardFeed, workspaceAccountID: number) { + const parameters: OpenPolicyCompanyCardsFeedParams = { + policyID, + feed, + }; + + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + value: { + isLoading: true, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + value: { + isLoading: false, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_DOMAIN_MEMBER}${workspaceAccountID}`, + value: { + isLoading: false, + }, + }, + ]; + + API.read(READ_COMMANDS.OPEN_ASSIGN_FEED_CARD_PAGE, parameters, {optimisticData, successData, failureData}); +} + export { setWorkspaceCompanyCardFeedName, deleteWorkspaceCompanyCardFeed, @@ -741,4 +780,5 @@ export { clearAddNewCardFlow, setAssignCardStepAndData, clearAssignCardStepAndData, + openAssignFeedCardPage, }; diff --git a/src/pages/workspace/members/WorkspaceMemberNewCardPage.tsx b/src/pages/workspace/members/WorkspaceMemberNewCardPage.tsx index dbe4bf9f3b86..968c22283c7b 100644 --- a/src/pages/workspace/members/WorkspaceMemberNewCardPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberNewCardPage.tsx @@ -10,7 +10,16 @@ import RadioListItem from '@components/SelectionList/RadioListItem'; import type {ListItem} from '@components/SelectionList/types'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import {getCardFeedIcon, getCompanyFeeds, getCustomOrFormattedFeedName, getFilteredCardList, hasOnlyOneCardToAssign, isSelectedFeedExpired} from '@libs/CardUtils'; +import { + getCardFeedIcon, + getCompanyFeeds, + getCustomOrFormattedFeedName, + getFilteredCardList, + hasCardListObject, + hasOnlyOneCardToAssign, + isCustomFeed, + isSelectedFeedExpired, +} from '@libs/CardUtils'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {SettingsNavigatorParamList} from '@libs/Navigation/types'; import {getPolicy, getWorkspaceAccountID} from '@libs/PolicyUtils'; @@ -20,7 +29,7 @@ import type {WithPolicyAndFullscreenLoadingProps} from '@pages/workspace/withPol import withPolicyAndFullscreenLoading from '@pages/workspace/withPolicyAndFullscreenLoading'; import variables from '@styles/variables'; import {setIssueNewCardStepAndData} from '@userActions/Card'; -import {setAssignCardStepAndData} from '@userActions/CompanyCards'; +import {openAssignFeedCardPage, setAssignCardStepAndData} from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; @@ -99,6 +108,10 @@ function WorkspaceMemberNewCardPage({route, personalDetails}: WorkspaceMemberNew const handleSelectFeed = (feed: CardFeedListItem) => { setSelectedFeed(feed.value); + const hasAllCardsData = hasCardListObject(workspaceAccountID, feed.value as CompanyCardFeed); + if (isCustomFeed(feed.value as CompanyCardFeed) && !hasAllCardsData) { + openAssignFeedCardPage(policyID, feed.value as CompanyCardFeed, workspaceAccountID); + } setShouldShowError(false); }; @@ -169,6 +182,7 @@ function WorkspaceMemberNewCardPage({route, personalDetails}: WorkspaceMemberNew onSubmit={handleSubmit} message={translate('common.error.pleaseSelectOne')} buttonText={translate('common.next')} + isLoading={!!cardFeeds?.isLoading} />