Skip to content

Commit e903ec9

Browse files
authored
Merge pull request #47545 from VickyStash/feature/UpdateExpensifyCardLimitType-api-call
[No QA] Implement UpdateExpensifyCardLimitType api call
2 parents 74f095d + 2a45c56 commit e903ec9

File tree

7 files changed

+91
-7
lines changed

7 files changed

+91
-7
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type UpdateExpensifyCardLimitTypeParams = {
2+
authToken: string;
3+
cardID: number;
4+
limitType: string;
5+
};
6+
7+
export default UpdateExpensifyCardLimitTypeParams;

src/libs/API/parameters/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,3 +277,4 @@ export type {default as CreateExpensifyCardParams} from './CreateExpensifyCardPa
277277
export type {default as UpdateExpensifyCardTitleParams} from './UpdateExpensifyCardTitleParams';
278278
export type {default as OpenCardDetailsPageParams} from './OpenCardDetailsPageParams';
279279
export type {default as ToggleCardContinuousReconciliationParams} from './ToggleCardContinuousReconciliationParams';
280+
export type {default as UpdateExpensifyCardLimitTypeParams} from './UpdateExpensifyCardLimitTypeParams';

src/libs/API/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const WRITE_COMMANDS = {
3333
ACTIVATE_PHYSICAL_EXPENSIFY_CARD: 'ActivatePhysicalExpensifyCard',
3434
UPDATE_EXPENSIFY_CARD_LIMIT: 'UpdateExpensifyCardLimit',
3535
UPDATE_EXPENSIFY_CARD_TITLE: 'UpdateExpensifyCardTitle',
36+
UPDATE_EXPENSIFY_CARD_LIMIT_TYPE: 'UpdateExpensifyCardLimitType',
3637
CHRONOS_REMOVE_OOO_EVENT: 'Chronos_RemoveOOOEvent',
3738
MAKE_DEFAULT_PAYMENT_METHOD: 'MakeDefaultPaymentMethod',
3839
ADD_PAYMENT_CARD: 'AddPaymentCard',
@@ -357,6 +358,7 @@ type WriteCommandParameters = {
357358
[WRITE_COMMANDS.ACTIVATE_PHYSICAL_EXPENSIFY_CARD]: Parameters.ActivatePhysicalExpensifyCardParams;
358359
[WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT]: Parameters.UpdateExpensifyCardLimitParams;
359360
[WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_TITLE]: Parameters.UpdateExpensifyCardTitleParams;
361+
[WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT_TYPE]: Parameters.UpdateExpensifyCardLimitTypeParams;
360362
[WRITE_COMMANDS.MAKE_DEFAULT_PAYMENT_METHOD]: Parameters.MakeDefaultPaymentMethodParams;
361363
[WRITE_COMMANDS.ADD_PAYMENT_CARD]: Parameters.AddPaymentCardParams;
362364
[WRITE_COMMANDS.ADD_PAYMENT_CARD_GBP]: Parameters.AddPaymentCardParams;

src/libs/actions/Card.ts

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import type {
1010
RevealExpensifyCardDetailsParams,
1111
StartIssueNewCardFlowParams,
1212
UpdateExpensifyCardLimitParams,
13+
UpdateExpensifyCardLimitTypeParams,
1314
UpdateExpensifyCardTitleParams,
1415
} from '@libs/API/parameters';
1516
import {READ_COMMANDS, SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
1617
import * as ErrorUtils from '@libs/ErrorUtils';
1718
import * as NetworkStore from '@libs/Network/NetworkStore';
1819
import CONST from '@src/CONST';
1920
import ONYXKEYS from '@src/ONYXKEYS';
20-
import type {ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card';
21+
import type {CardLimitType, ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card';
2122
import type {ConnectionName} from '@src/types/onyx/Policy';
2223

2324
type ReplacementReason = 'damaged' | 'stolen';
@@ -438,6 +439,66 @@ function updateExpensifyCardTitle(workspaceAccountID: number, cardID: number, ne
438439
API.write(WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_TITLE, parameters, {optimisticData, successData, failureData});
439440
}
440441

442+
function updateExpensifyCardLimitType(workspaceAccountID: number, cardID: number, newLimitType: CardLimitType, oldLimitType?: CardLimitType) {
443+
const authToken = NetworkStore.getAuthToken();
444+
445+
if (!authToken) {
446+
return;
447+
}
448+
449+
const optimisticData: OnyxUpdate[] = [
450+
{
451+
onyxMethod: Onyx.METHOD.MERGE,
452+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`,
453+
value: {
454+
[cardID]: {
455+
nameValuePairs: {
456+
limitType: newLimitType,
457+
},
458+
isLoading: true,
459+
errors: null,
460+
},
461+
},
462+
},
463+
];
464+
465+
const successData: OnyxUpdate[] = [
466+
{
467+
onyxMethod: Onyx.METHOD.MERGE,
468+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`,
469+
value: {
470+
[cardID]: {
471+
isLoading: false,
472+
},
473+
},
474+
},
475+
];
476+
477+
const failureData: OnyxUpdate[] = [
478+
{
479+
onyxMethod: Onyx.METHOD.MERGE,
480+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`,
481+
value: {
482+
[cardID]: {
483+
nameValuePairs: {
484+
limitType: oldLimitType,
485+
},
486+
isLoading: false,
487+
errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
488+
},
489+
},
490+
},
491+
];
492+
493+
const parameters: UpdateExpensifyCardLimitTypeParams = {
494+
authToken,
495+
cardID,
496+
limitType: newLimitType,
497+
};
498+
499+
API.write(WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT_TYPE, parameters, {optimisticData, successData, failureData});
500+
}
501+
441502
function startIssueNewCardFlow(policyID: string) {
442503
const parameters: StartIssueNewCardFlowParams = {
443504
policyID,
@@ -573,5 +634,6 @@ export {
573634
issueExpensifyCard,
574635
openCardDetailsPage,
575636
toggleContinuousReconciliation,
637+
updateExpensifyCardLimitType,
576638
};
577639
export type {ReplacementReason};

src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,16 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
5959
return newLimit - currentSpend;
6060
};
6161

62+
const goBack = useCallback(() => Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID)), [policyID, cardID]);
63+
6264
const updateCardLimit = (newLimit: number) => {
6365
const newAvailableSpend = getNewAvailableSpend(newLimit);
6466

6567
setIsConfirmModalVisible(false);
6668

6769
Card.updateExpensifyCardLimit(workspaceAccountID, Number(cardID), newLimit, newAvailableSpend, card?.nameValuePairs?.unapprovedExpenseLimit, card?.availableSpend);
6870

69-
Navigation.goBack();
71+
goBack();
7072
};
7173

7274
const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM>) => {
@@ -108,7 +110,7 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
108110
>
109111
<HeaderWithBackButton
110112
title={translate('workspace.expensifyCard.cardLimit')}
111-
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID))}
113+
onBackButtonPress={goBack}
112114
/>
113115
<FormProvider
114116
formID={ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM}

src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import * as PolicyUtils from '@libs/PolicyUtils';
1717
import Navigation from '@navigation/Navigation';
1818
import type {SettingsNavigatorParamList} from '@navigation/types';
1919
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
20+
import * as Card from '@userActions/Card';
2021
import * as Policy from '@userActions/Policy/Policy';
2122
import CONST from '@src/CONST';
2223
import ONYXKEYS from '@src/ONYXKEYS';
@@ -48,14 +49,20 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
4849
const [typeSelected, setTypeSelected] = useState(initialLimitType);
4950
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
5051

52+
const goBack = useCallback(() => Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID)), [policyID, cardID]);
53+
5154
const fetchCardLimitTypeData = useCallback(() => {
5255
Policy.openPolicyEditCardLimitTypePage(policyID, Number(cardID));
5356
}, [policyID, cardID]);
5457

5558
useFocusEffect(fetchCardLimitTypeData);
5659

5760
const updateCardLimitType = () => {
58-
// TODO: add API call when it's supported https://github.com/Expensify/Expensify/issues/407833
61+
setIsConfirmModalVisible(false);
62+
63+
Card.updateExpensifyCardLimitType(workspaceAccountID, Number(cardID), typeSelected, card?.nameValuePairs?.limitType);
64+
65+
goBack();
5966
};
6067

6168
const submit = () => {
@@ -146,7 +153,7 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP
146153
>
147154
<HeaderWithBackButton
148155
title={translate('workspace.card.issueNewCard.limitType')}
149-
onBackButtonPress={() => Navigation.goBack(ROUTES.WORKSPACE_EXPENSIFY_CARD_DETAILS.getRoute(policyID, cardID))}
156+
onBackButtonPress={goBack}
150157
/>
151158
<FullPageOfflineBlockingView>
152159
<SelectionList

src/types/onyx/Card.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ type CardList = Record<string, Card>;
9595
/** Issue new card flow steps */
9696
type IssueNewCardStep = ValueOf<typeof CONST.EXPENSIFY_CARD.STEP>;
9797

98+
/** Card spending limit type */
99+
type CardLimitType = ValueOf<typeof CONST.EXPENSIFY_CARD.LIMIT_TYPES>;
100+
98101
/** Data required to be sent to issue a new card */
99102
type IssueNewCardData = {
100103
/** The email address of the cardholder */
@@ -104,7 +107,7 @@ type IssueNewCardData = {
104107
cardType: ValueOf<typeof CONST.EXPENSIFY_CARD.CARD_TYPE>;
105108

106109
/** Card spending limit type */
107-
limitType: ValueOf<typeof CONST.EXPENSIFY_CARD.LIMIT_TYPES>;
110+
limitType: CardLimitType;
108111

109112
/** Card spending limit */
110113
limit: number;
@@ -129,4 +132,4 @@ type IssueNewCard = {
129132
type WorkspaceCardsList = Record<string, Card>;
130133

131134
export default Card;
132-
export type {ExpensifyCardDetails, CardList, IssueNewCard, IssueNewCardStep, IssueNewCardData, WorkspaceCardsList};
135+
export type {ExpensifyCardDetails, CardList, IssueNewCard, IssueNewCardStep, IssueNewCardData, WorkspaceCardsList, CardLimitType};

0 commit comments

Comments
 (0)