Skip to content

Commit

Permalink
Update availableSpend value optimistically
Browse files Browse the repository at this point in the history
  • Loading branch information
VickyStash committed Aug 14, 2024
1 parent 684cfeb commit d692b67
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 11 deletions.
4 changes: 3 additions & 1 deletion src/libs/actions/Card.ts
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ function clearIssueNewCardFlow() {
});
}

function updateExpensifyCardLimit(workspaceAccountID: number, cardID: number, newLimit: number, oldLimit?: number) {
function updateExpensifyCardLimit(workspaceAccountID: number, cardID: number, newLimit: number, newAvailableSpend: number, oldLimit?: number, oldAvailableSpend?: number) {
const authToken = NetworkStore.getAuthToken();

if (!authToken) {
Expand All @@ -328,6 +328,7 @@ function updateExpensifyCardLimit(workspaceAccountID: number, cardID: number, ne
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`,
value: {
[cardID]: {
availableSpend: newAvailableSpend,
nameValuePairs: {
unapprovedExpenseLimit: newLimit,
},
Expand Down Expand Up @@ -356,6 +357,7 @@ function updateExpensifyCardLimit(workspaceAccountID: number, cardID: number, ne
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`,
value: {
[cardID]: {
availableSpend: oldAvailableSpend,
nameValuePairs: {
unapprovedExpenseLimit: oldLimit,
},
Expand Down
21 changes: 14 additions & 7 deletions src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,26 +52,33 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
}
}, [card?.nameValuePairs?.limitType]);

const updateCardLimit = (newLimit: string) => {
const getNewAvailableSpend = (newLimit: number) => {
const currentLimit = card?.nameValuePairs?.unapprovedExpenseLimit ?? 0;
const currentSpend = currentLimit - (card?.availableSpend ?? 0);

return newLimit - currentSpend;
};

const updateCardLimit = (newLimit: number) => {
const newAvailableSpend = getNewAvailableSpend(newLimit);

setIsConfirmModalVisible(false);

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

Navigation.goBack();
};

const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM>) => {
const currentLimit = card?.nameValuePairs?.unapprovedExpenseLimit ?? 0;
const currentSpend = currentLimit - (card?.availableSpend ?? 0);
const newLimit = Number(values[INPUT_IDS.LIMIT]) * 100;
const newAvailableSpend = newLimit - currentSpend;
const newAvailableSpend = getNewAvailableSpend(newLimit);

if (newAvailableSpend <= 0) {
setIsConfirmModalVisible(true);
return;
}

updateCardLimit(values[INPUT_IDS.LIMIT]);
updateCardLimit(newLimit);
};

const validate = useCallback(
Expand Down Expand Up @@ -126,7 +133,7 @@ function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
<ConfirmModal
title={translate('workspace.expensifyCard.changeCardLimit')}
isVisible={isConfirmModalVisible}
onConfirm={() => updateCardLimit(inputValues[INPUT_IDS.LIMIT])}
onConfirm={() => updateCardLimit(Number(inputValues[INPUT_IDS.LIMIT]) * 100)}
onCancel={() => setIsConfirmModalVisible(false)}
prompt={translate(getPromptTextKey, CurrencyUtils.convertToDisplayString(Number(inputValues[INPUT_IDS.LIMIT]) * 100, CONST.CURRENCY.USD))}
confirmText={translate('workspace.expensifyCard.changeLimit')}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type {StackScreenProps} from '@react-navigation/stack';
import React, {useEffect, useState} from 'react';
import React, {useCallback, useEffect, useState} from 'react';
import {View} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import ExpensifyCardImage from '@assets/images/expensify-card.svg';
Expand All @@ -14,6 +14,7 @@ import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription';
import ScreenWrapper from '@components/ScreenWrapper';
import ScrollView from '@components/ScrollView';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import * as CardUtils from '@libs/CardUtils';
Expand Down Expand Up @@ -44,7 +45,6 @@ function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetail
const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST);
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${workspaceAccountID}_${CONST.EXPENSIFY_CARD.BANK}`);

// TODO: add an API call to load the card details data: https://github.com/Expensify/App/issues/47231
const card = cardsList?.[cardID];
const cardholder = personalDetails?.[card?.accountID ?? -1];
const isVirtual = !!card?.nameValuePairs?.isVirtual;
Expand All @@ -53,10 +53,14 @@ function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetail
const displayName = PersonalDetailsUtils.getDisplayNameOrDefault(cardholder);
const translationForLimitType = CardUtils.getTranslationKeyForLimitType(card?.nameValuePairs?.limitType);

useEffect(() => {
const fetchCardDetails = useCallback(() => {
Card.openCardDetailsPage(Number(cardID));
}, [cardID]);

const {isOffline} = useNetwork({onReconnect: fetchCardDetails});

useEffect(() => fetchCardDetails(), [fetchCardDetails]);

const deactivateCard = () => {
setIsDeactivateModalVisible(false);

Expand Down Expand Up @@ -116,6 +120,7 @@ function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetail
title={formattedAvailableSpendAmount}
interactive={false}
titleStyle={styles.newKansasLarge}
containerStyle={isOffline ? styles.buttonOpacityDisabled : null}
/>
<MenuItemWithTopDescription
description={translate('workspace.expensifyCard.cardLimit')}
Expand Down

0 comments on commit d692b67

Please sign in to comment.