From b47e22731f13a4529178f3eaa8152e96280e2de8 Mon Sep 17 00:00:00 2001 From: VickyStash Date: Fri, 16 Aug 2024 08:40:10 +0200 Subject: [PATCH] Implement UpdateExpensifyCardLimitType api call --- .../UpdateExpensifyCardLimitTypeParams.ts | 7 ++ src/libs/API/parameters/index.ts | 1 + src/libs/API/types.ts | 2 + src/libs/actions/Card.ts | 64 ++++++++++++++++++- .../WorkspaceEditCardLimitPage.tsx | 6 +- .../WorkspaceEditCardLimitTypePage.tsx | 11 +++- src/types/onyx/Card.ts | 7 +- 7 files changed, 91 insertions(+), 7 deletions(-) create mode 100644 src/libs/API/parameters/UpdateExpensifyCardLimitTypeParams.ts diff --git a/src/libs/API/parameters/UpdateExpensifyCardLimitTypeParams.ts b/src/libs/API/parameters/UpdateExpensifyCardLimitTypeParams.ts new file mode 100644 index 000000000000..8faafab82b8e --- /dev/null +++ b/src/libs/API/parameters/UpdateExpensifyCardLimitTypeParams.ts @@ -0,0 +1,7 @@ +type UpdateExpensifyCardLimitTypeParams = { + authToken: string; + cardID: number; + limitType: string; +}; + +export default UpdateExpensifyCardLimitTypeParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 53b58d224e17..d384f96f57e7 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -276,3 +276,4 @@ export type {default as ConfigureExpensifyCardsForPolicyParams} from './Configur export type {default as CreateExpensifyCardParams} from './CreateExpensifyCardParams'; export type {default as UpdateExpensifyCardTitleParams} from './UpdateExpensifyCardTitleParams'; export type {default as OpenCardDetailsPageParams} from './OpenCardDetailsPageParams'; +export type {default as UpdateExpensifyCardLimitTypeParams} from './UpdateExpensifyCardLimitTypeParams'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index ef39e9bf005b..088d050e9d8e 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -33,6 +33,7 @@ const WRITE_COMMANDS = { ACTIVATE_PHYSICAL_EXPENSIFY_CARD: 'ActivatePhysicalExpensifyCard', UPDATE_EXPENSIFY_CARD_LIMIT: 'UpdateExpensifyCardLimit', UPDATE_EXPENSIFY_CARD_TITLE: 'UpdateExpensifyCardTitle', + UPDATE_EXPENSIFY_CARD_LIMIT_TYPE: 'UpdateExpensifyCardLimitType', CHRONOS_REMOVE_OOO_EVENT: 'Chronos_RemoveOOOEvent', MAKE_DEFAULT_PAYMENT_METHOD: 'MakeDefaultPaymentMethod', ADD_PAYMENT_CARD: 'AddPaymentCard', @@ -356,6 +357,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.ACTIVATE_PHYSICAL_EXPENSIFY_CARD]: Parameters.ActivatePhysicalExpensifyCardParams; [WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT]: Parameters.UpdateExpensifyCardLimitParams; [WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_TITLE]: Parameters.UpdateExpensifyCardTitleParams; + [WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT_TYPE]: Parameters.UpdateExpensifyCardLimitTypeParams; [WRITE_COMMANDS.MAKE_DEFAULT_PAYMENT_METHOD]: Parameters.MakeDefaultPaymentMethodParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD]: Parameters.AddPaymentCardParams; [WRITE_COMMANDS.ADD_PAYMENT_CARD_GBP]: Parameters.AddPaymentCardParams; diff --git a/src/libs/actions/Card.ts b/src/libs/actions/Card.ts index 2356f125ff67..df2263212b3e 100644 --- a/src/libs/actions/Card.ts +++ b/src/libs/actions/Card.ts @@ -10,6 +10,7 @@ import type { RevealExpensifyCardDetailsParams, StartIssueNewCardFlowParams, UpdateExpensifyCardLimitParams, + UpdateExpensifyCardLimitTypeParams, UpdateExpensifyCardTitleParams, } from '@libs/API/parameters'; import {READ_COMMANDS, SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types'; @@ -17,7 +18,7 @@ import * as ErrorUtils from '@libs/ErrorUtils'; import * as NetworkStore from '@libs/Network/NetworkStore'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; -import type {ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card'; +import type {CardLimitType, ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card'; type ReplacementReason = 'damaged' | 'stolen'; @@ -437,6 +438,66 @@ function updateExpensifyCardTitle(workspaceAccountID: number, cardID: number, ne API.write(WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_TITLE, parameters, {optimisticData, successData, failureData}); } +function updateExpensifyCardLimitType(workspaceAccountID: number, cardID: number, newLimitType: CardLimitType, oldLimitType?: CardLimitType) { + const authToken = NetworkStore.getAuthToken(); + + if (!authToken) { + return; + } + + const optimisticData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, + value: { + [cardID]: { + nameValuePairs: { + limitType: newLimitType, + }, + isLoading: true, + errors: null, + }, + }, + }, + ]; + + const successData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, + value: { + [cardID]: { + isLoading: false, + }, + }, + }, + ]; + + const failureData: OnyxUpdate[] = [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`, + value: { + [cardID]: { + nameValuePairs: { + limitType: oldLimitType, + }, + isLoading: false, + errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), + }, + }, + }, + ]; + + const parameters: UpdateExpensifyCardLimitTypeParams = { + authToken, + cardID, + limitType: newLimitType, + }; + + API.write(WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT_TYPE, parameters, {optimisticData, successData, failureData}); +} + function startIssueNewCardFlow(policyID: string) { const parameters: StartIssueNewCardFlowParams = { policyID, @@ -513,5 +574,6 @@ export { configureExpensifyCardsForPolicy, issueExpensifyCard, openCardDetailsPage, + updateExpensifyCardLimitType, }; export type {ReplacementReason}; diff --git a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx index 3b44654b754a..b42dcb406ada 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx @@ -59,6 +59,8 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) { return newLimit - currentSpend; }; + const goBack = useCallback(() => Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID)), [policyID, cardID]); + const updateCardLimit = (newLimit: number) => { const newAvailableSpend = getNewAvailableSpend(newLimit); @@ -66,7 +68,7 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) { Card.updateExpensifyCardLimit(workspaceAccountID, Number(cardID), newLimit, newAvailableSpend, card?.nameValuePairs?.unapprovedExpenseLimit, card?.availableSpend); - Navigation.goBack(); + goBack(); }; const submit = (values: FormOnyxValues) => { @@ -108,7 +110,7 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) { > Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID))} + onBackButtonPress={goBack} /> Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID)), [policyID, cardID]); + const fetchCardLimitTypeData = useCallback(() => { Policy.openPolicyEditCardLimitTypePage(policyID, Number(cardID)); }, [policyID, cardID]); @@ -55,7 +58,11 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP useFocusEffect(fetchCardLimitTypeData); const updateCardLimitType = () => { - // TODO: add API call when it's supported https://github.com/Expensify/Expensify/issues/407833 + setIsConfirmModalVisible(false); + + Card.updateExpensifyCardLimitType(workspaceAccountID, Number(cardID), typeSelected, card?.nameValuePairs?.limitType); + + goBack(); }; const submit = () => { @@ -146,7 +153,7 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP > Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID))} + onBackButtonPress={goBack} /> ; /** Issue new card flow steps */ type IssueNewCardStep = ValueOf; +/** Card spending limit type */ +type CardLimitType = ValueOf; + /** Data required to be sent to issue a new card */ type IssueNewCardData = { /** The email address of the cardholder */ @@ -104,7 +107,7 @@ type IssueNewCardData = { cardType: ValueOf; /** Card spending limit type */ - limitType: ValueOf; + limitType: CardLimitType; /** Card spending limit */ limit: number; @@ -129,4 +132,4 @@ type IssueNewCard = { type WorkspaceCardsList = Record; export default Card; -export type {ExpensifyCardDetails, CardList, IssueNewCard, IssueNewCardStep, IssueNewCardData, WorkspaceCardsList}; +export type {ExpensifyCardDetails, CardList, IssueNewCard, IssueNewCardStep, IssueNewCardData, WorkspaceCardsList, CardLimitType};