Skip to content

Commit 54fdb24

Browse files
authored
Merge pull request Expensify#45397 from VickyStash/feature/44326-edit-card-limit
[No QA] Create new Edit Card Limit page
2 parents 529c301 + ea606f2 commit 54fdb24

File tree

17 files changed

+277
-2
lines changed

17 files changed

+277
-2
lines changed

src/ONYXKEYS.ts

+3
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,8 @@ const ONYXKEYS = {
574574
ISSUE_NEW_EXPENSIFY_CARD_FORM_DRAFT: 'issueNewExpensifyCardDraft',
575575
EDIT_EXPENSIFY_CARD_NAME_FORM: 'editExpensifyCardName',
576576
EDIT_EXPENSIFY_CARD_NAME_DRAFT_FORM: 'editExpensifyCardNameDraft',
577+
EDIT_EXPENSIFY_CARD_LIMIT_FORM: 'editExpensifyCardLimit',
578+
EDIT_EXPENSIFY_CARD_LIMIT_DRAFT_FORM: 'editExpensifyCardLimitDraft',
577579
SAGE_INTACCT_CREDENTIALS_FORM: 'sageIntacctCredentialsForm',
578580
SAGE_INTACCT_CREDENTIALS_FORM_DRAFT: 'sageIntacctCredentialsFormDraft',
579581
NETSUITE_CUSTOM_FIELD_FORM: 'netSuiteCustomFieldForm',
@@ -652,6 +654,7 @@ type OnyxFormValuesMapping = {
652654
[ONYXKEYS.FORMS.SUBSCRIPTION_SIZE_FORM]: FormTypes.SubscriptionSizeForm;
653655
[ONYXKEYS.FORMS.ISSUE_NEW_EXPENSIFY_CARD_FORM]: FormTypes.IssueNewExpensifyCardForm;
654656
[ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_NAME_FORM]: FormTypes.EditExpensifyCardNameForm;
657+
[ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM]: FormTypes.EditExpensifyCardLimitForm;
655658
[ONYXKEYS.FORMS.SAGE_INTACCT_CREDENTIALS_FORM]: FormTypes.SageIntactCredentialsForm;
656659
[ONYXKEYS.FORMS.NETSUITE_CUSTOM_FIELD_FORM]: FormTypes.NetSuiteCustomFieldForm;
657660
[ONYXKEYS.FORMS.NETSUITE_CUSTOM_LIST_ADD_FORM]: FormTypes.NetSuiteCustomFieldForm;

src/ROUTES.ts

+4
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,10 @@ const ROUTES = {
870870
route: 'settings/workspaces/:policyID/expensify-card/:cardID/edit/name',
871871
getRoute: (policyID: string, cardID: string) => `settings/workspaces/${policyID}/expensify-card/${cardID}/edit/name` as const,
872872
},
873+
WORKSPACE_EXPENSIFY_CARD_LIMIT: {
874+
route: 'settings/workspaces/:policyID/expensify-card/:cardID/edit/limit',
875+
getRoute: (policyID: string, cardID: string) => `settings/workspaces/${policyID}/expensify-card/${cardID}/edit/limit` as const,
876+
},
873877
WORKSPACE_EXPENSIFY_CARD_ISSUE_NEW: {
874878
route: 'settings/workspaces/:policyID/expensify-card/issue-new',
875879
getRoute: (policyID: string) => `settings/workspaces/${policyID}/expensify-card/issue-new` as const,

src/SCREENS.ts

+1
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ const SCREENS = {
350350
RATE_AND_UNIT_UNIT: 'Workspace_RateAndUnit_Unit',
351351
EXPENSIFY_CARD: 'Workspace_ExpensifyCard',
352352
EXPENSIFY_CARD_DETAILS: 'Workspace_ExpensifyCard_Details',
353+
EXPENSIFY_CARD_LIMIT: 'Workspace_ExpensifyCard_Limit',
353354
EXPENSIFY_CARD_ISSUE_NEW: 'Workspace_ExpensifyCard_New',
354355
EXPENSIFY_CARD_NAME: 'Workspace_ExpensifyCard_Name',
355356
EXPENSIFY_CARD_BANK_ACCOUNT: 'Workspace_ExpensifyCard_BankAccount',

src/languages/en.ts

+5
Original file line numberDiff line numberDiff line change
@@ -2662,6 +2662,11 @@ export default {
26622662
virtual: 'Virtual',
26632663
physical: 'Physical',
26642664
deactivate: 'Deactivate card',
2665+
changeCardLimit: 'Change card limit',
2666+
changeLimit: 'Change limit',
2667+
smartLimitWarning: (limit: string) => `If you change this card’s limit to ${limit}, new transactions will be declined until you approve more expenses on the card.`,
2668+
monthlyLimitWarning: (limit: string) => `If you change this card’s limit to ${limit}, new transactions will be declined until next month.`,
2669+
fixedLimitWarning: (limit: string) => `If you change this card’s limit to ${limit}, new transactions will be declined.`,
26652670
},
26662671
categories: {
26672672
deleteCategories: 'Delete categories',

src/languages/es.ts

+6
Original file line numberDiff line numberDiff line change
@@ -2711,6 +2711,12 @@ export default {
27112711
virtual: 'Virtual',
27122712
physical: 'Física',
27132713
deactivate: 'Desactivar tarjeta',
2714+
changeCardLimit: 'Modificar el límite de la tarjeta',
2715+
changeLimit: 'Modificar límite',
2716+
smartLimitWarning: (limit: string) =>
2717+
`Si cambias el límite de esta tarjeta a ${limit}, las nuevas transacciones serán rechazadas hasta que apruebes antiguos gastos de la tarjeta.`,
2718+
monthlyLimitWarning: (limit: string) => `Si cambias el límite de esta tarjeta a ${limit}, las nuevas transacciones serán rechazadas hasta el próximo mes.`,
2719+
fixedLimitWarning: (limit: string) => `Si cambias el límite de esta tarjeta a ${limit}, se rechazarán las nuevas transacciones.`,
27142720
},
27152721
categories: {
27162722
deleteCategories: 'Eliminar categorías',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type UpdateExpensifyCardLimitParams = {
2+
authToken: string;
3+
cardID: number;
4+
limit: number;
5+
};
6+
7+
export default UpdateExpensifyCardLimitParams;

src/libs/API/parameters/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -263,3 +263,4 @@ export type {default as UpdateSageIntacctGenericTypeParams} from './UpdateSageIn
263263
export type {default as UpdateNetSuiteCustomersJobsParams} from './UpdateNetSuiteCustomersJobsParams';
264264
export type {default as CopyExistingPolicyConnectionParams} from './CopyExistingPolicyConnectionParams';
265265
export type {default as ExportSearchItemsToCSVParams} from './ExportSearchItemsToCSVParams';
266+
export type {default as UpdateExpensifyCardLimitParams} from './UpdateExpensifyCardLimitParams';

src/libs/API/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const WRITE_COMMANDS = {
3131
REPORT_VIRTUAL_EXPENSIFY_CARD_FRAUD: 'ReportVirtualExpensifyCardFraud',
3232
REQUEST_REPLACEMENT_EXPENSIFY_CARD: 'RequestReplacementExpensifyCard',
3333
ACTIVATE_PHYSICAL_EXPENSIFY_CARD: 'ActivatePhysicalExpensifyCard',
34+
UPDATE_EXPENSIFY_CARD_LIMIT: 'UpdateExpensifyCardLimit',
3435
CHRONOS_REMOVE_OOO_EVENT: 'Chronos_RemoveOOOEvent',
3536
MAKE_DEFAULT_PAYMENT_METHOD: 'MakeDefaultPaymentMethod',
3637
ADD_PAYMENT_CARD: 'AddPaymentCard',
@@ -337,6 +338,7 @@ type WriteCommandParameters = {
337338
[WRITE_COMMANDS.REPORT_VIRTUAL_EXPENSIFY_CARD_FRAUD]: Parameters.ReportVirtualExpensifyCardFraudParams;
338339
[WRITE_COMMANDS.REQUEST_REPLACEMENT_EXPENSIFY_CARD]: Parameters.RequestReplacementExpensifyCardParams;
339340
[WRITE_COMMANDS.ACTIVATE_PHYSICAL_EXPENSIFY_CARD]: Parameters.ActivatePhysicalExpensifyCardParams;
341+
[WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT]: Parameters.UpdateExpensifyCardLimitParams;
340342
[WRITE_COMMANDS.MAKE_DEFAULT_PAYMENT_METHOD]: Parameters.MakeDefaultPaymentMethodParams;
341343
[WRITE_COMMANDS.ADD_PAYMENT_CARD]: Parameters.AddPaymentCardParams;
342344
[WRITE_COMMANDS.DELETE_PAYMENT_CARD]: Parameters.DeletePaymentCardParams;

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,7 @@ const SettingsModalStackNavigator = createModalStackNavigator<SettingsNavigatorP
417417
[SCREENS.WORKSPACE.EXPENSIFY_CARD_BANK_ACCOUNT]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceExpensifyCardBankAccounts').default,
418418
[SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceExpensifyCardDetailsPage').default,
419419
[SCREENS.WORKSPACE.EXPENSIFY_CARD_NAME]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceEditCardNamePage').default,
420+
[SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT]: () => require<ReactComponentModule>('../../../../pages/workspace/expensifyCard/WorkspaceEditCardLimitPage').default,
420421
[SCREENS.SETTINGS.SAVE_THE_WORLD]: () => require<ReactComponentModule>('../../../../pages/TeachersUnite/SaveTheWorldPage').default,
421422
[SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_PAYMENT_CURRENCY]: () => require<ReactComponentModule>('../../../../pages/settings/PaymentCard/ChangeCurrency').default,
422423
[SCREENS.SETTINGS.SUBSCRIPTION.CHANGE_BILLING_CURRENCY]: () => require<ReactComponentModule>('../../../../pages/settings/Subscription/PaymentCard/ChangeBillingCurrency').default,

src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts

+1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial<Record<FullScreenName, string[]>> = {
161161
SCREENS.WORKSPACE.EXPENSIFY_CARD_BANK_ACCOUNT,
162162
SCREENS.WORKSPACE.EXPENSIFY_CARD_DETAILS,
163163
SCREENS.WORKSPACE.EXPENSIFY_CARD_NAME,
164+
SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT,
164165
],
165166
};
166167

src/libs/Navigation/linkingConfig/config.ts

+3
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,9 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
463463
[SCREENS.WORKSPACE.SHARE]: {
464464
path: ROUTES.WORKSPACE_PROFILE_SHARE.route,
465465
},
466+
[SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT]: {
467+
path: ROUTES.WORKSPACE_EXPENSIFY_CARD_LIMIT.route,
468+
},
466469
[SCREENS.WORKSPACE.EXPENSIFY_CARD_ISSUE_NEW]: {
467470
path: ROUTES.WORKSPACE_EXPENSIFY_CARD_ISSUE_NEW.route,
468471
},

src/libs/Navigation/types.ts

+4
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,10 @@ type SettingsNavigatorParamList = {
672672
policyID: string;
673673
cardID: string;
674674
};
675+
[SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT]: {
676+
policyID: string;
677+
cardID: string;
678+
};
675679
} & ReimbursementAccountNavigatorParamList;
676680

677681
type NewChatNavigatorParamList = {

src/libs/actions/Card.ts

+70-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
import Onyx from 'react-native-onyx';
22
import type {OnyxUpdate} from 'react-native-onyx';
33
import * as API from '@libs/API';
4-
import type {ActivatePhysicalExpensifyCardParams, ReportVirtualExpensifyCardFraudParams, RequestReplacementExpensifyCardParams, RevealExpensifyCardDetailsParams} from '@libs/API/parameters';
4+
import type {
5+
ActivatePhysicalExpensifyCardParams,
6+
ReportVirtualExpensifyCardFraudParams,
7+
RequestReplacementExpensifyCardParams,
8+
RevealExpensifyCardDetailsParams,
9+
UpdateExpensifyCardLimitParams,
10+
} from '@libs/API/parameters';
511
import {SIDE_EFFECT_REQUEST_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
12+
import * as ErrorUtils from '@libs/ErrorUtils';
13+
import * as NetworkStore from '@libs/Network/NetworkStore';
614
import CONST from '@src/CONST';
715
import ONYXKEYS from '@src/ONYXKEYS';
816
import type {ExpensifyCardDetails, IssueNewCardData, IssueNewCardStep} from '@src/types/onyx/Card';
@@ -207,6 +215,66 @@ function clearIssueNewCardFlow() {
207215
});
208216
}
209217

218+
function updateExpensifyCardLimit(policyID: string, cardID: number, newLimit: number, oldLimit?: number) {
219+
const authToken = NetworkStore.getAuthToken();
220+
221+
if (!authToken) {
222+
return;
223+
}
224+
225+
const optimisticData: OnyxUpdate[] = [
226+
{
227+
onyxMethod: Onyx.METHOD.MERGE,
228+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${policyID}_${CONST.EXPENSIFY_CARD.BANK}`,
229+
value: {
230+
[cardID]: {
231+
nameValuePairs: {
232+
limit: newLimit,
233+
},
234+
isLoading: true,
235+
errors: null,
236+
},
237+
},
238+
},
239+
];
240+
241+
const successData: OnyxUpdate[] = [
242+
{
243+
onyxMethod: Onyx.METHOD.MERGE,
244+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${policyID}_${CONST.EXPENSIFY_CARD.BANK}`,
245+
value: {
246+
[cardID]: {
247+
isLoading: false,
248+
},
249+
},
250+
},
251+
];
252+
253+
const failureData: OnyxUpdate[] = [
254+
{
255+
onyxMethod: Onyx.METHOD.MERGE,
256+
key: `${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${policyID}_${CONST.EXPENSIFY_CARD.BANK}`,
257+
value: {
258+
[cardID]: {
259+
nameValuePairs: {
260+
limit: oldLimit,
261+
},
262+
isLoading: false,
263+
errors: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'),
264+
},
265+
},
266+
},
267+
];
268+
269+
const parameters: UpdateExpensifyCardLimitParams = {
270+
authToken,
271+
cardID,
272+
limit: newLimit,
273+
};
274+
275+
API.write(WRITE_COMMANDS.UPDATE_EXPENSIFY_CARD_LIMIT, parameters, {optimisticData, successData, failureData});
276+
}
277+
210278
export {
211279
requestReplacementExpensifyCard,
212280
activatePhysicalExpensifyCard,
@@ -215,5 +283,6 @@ export {
215283
revealVirtualCardDetails,
216284
setIssueNewCardStepAndData,
217285
clearIssueNewCardFlow,
286+
updateExpensifyCardLimit,
218287
};
219288
export type {ReplacementReason};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import type {StackScreenProps} from '@react-navigation/stack';
2+
import React, {useCallback, useMemo, useState} from 'react';
3+
import {useOnyx} from 'react-native-onyx';
4+
import AmountForm from '@components/AmountForm';
5+
import ConfirmModal from '@components/ConfirmModal';
6+
import FormProvider from '@components/Form/FormProvider';
7+
import InputWrapper from '@components/Form/InputWrapper';
8+
import type {FormInputErrors, FormOnyxValues} from '@components/Form/types';
9+
import HeaderWithBackButton from '@components/HeaderWithBackButton';
10+
import ScreenWrapper from '@components/ScreenWrapper';
11+
import useAutoFocusInput from '@hooks/useAutoFocusInput';
12+
import useLocalize from '@hooks/useLocalize';
13+
import useThemeStyles from '@hooks/useThemeStyles';
14+
import * as CurrencyUtils from '@libs/CurrencyUtils';
15+
import * as ValidationUtils from '@libs/ValidationUtils';
16+
import Navigation from '@navigation/Navigation';
17+
import type {SettingsNavigatorParamList} from '@navigation/types';
18+
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
19+
import * as Card from '@userActions/Card';
20+
import CONST from '@src/CONST';
21+
import ONYXKEYS from '@src/ONYXKEYS';
22+
import type SCREENS from '@src/SCREENS';
23+
import INPUT_IDS from '@src/types/form/EditExpensifyCardLimitForm';
24+
25+
type ConfirmationWarningTranslationPaths = 'workspace.expensifyCard.smartLimitWarning' | 'workspace.expensifyCard.monthlyLimitWarning' | 'workspace.expensifyCard.fixedLimitWarning';
26+
27+
// TODO: remove when Onyx data is available
28+
const mockedCard = {
29+
accountID: 885646,
30+
availableSpend: 1000,
31+
nameValuePairs: {
32+
cardTitle: 'Test 1',
33+
isVirtual: true,
34+
limit: 2000,
35+
limitType: CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART,
36+
},
37+
lastFourPAN: '1234',
38+
};
39+
40+
type WorkspaceEditCardLimitPageProps = StackScreenProps<SettingsNavigatorParamList, typeof SCREENS.WORKSPACE.EXPENSIFY_CARD_LIMIT>;
41+
42+
function WorkspaceEditCardLimitPage({route}: WorkspaceEditCardLimitPageProps) {
43+
const {policyID, cardID} = route.params;
44+
const {translate} = useLocalize();
45+
const {inputCallbackRef} = useAutoFocusInput();
46+
const styles = useThemeStyles();
47+
const [isConfirmModalVisible, setIsConfirmModalVisible] = useState(false);
48+
49+
const [cardsList] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_CARDS_LIST}${policyID}_${CONST.EXPENSIFY_CARD.BANK}`);
50+
const card = cardsList?.[cardID] ?? mockedCard;
51+
52+
const getPromptTextKey = useMemo((): ConfirmationWarningTranslationPaths => {
53+
switch (card.nameValuePairs?.limitType) {
54+
case CONST.EXPENSIFY_CARD.LIMIT_TYPES.SMART:
55+
return 'workspace.expensifyCard.smartLimitWarning';
56+
case CONST.EXPENSIFY_CARD.LIMIT_TYPES.FIXED:
57+
return 'workspace.expensifyCard.fixedLimitWarning';
58+
case CONST.EXPENSIFY_CARD.LIMIT_TYPES.MONTHLY:
59+
return 'workspace.expensifyCard.monthlyLimitWarning';
60+
default:
61+
return 'workspace.expensifyCard.fixedLimitWarning';
62+
}
63+
}, [card.nameValuePairs?.limitType]);
64+
65+
const updateCardLimit = (newLimit: string) => {
66+
setIsConfirmModalVisible(false);
67+
68+
Card.updateExpensifyCardLimit(policyID, Number(cardID), Number(newLimit) * 100, card.nameValuePairs?.limit);
69+
70+
Navigation.goBack();
71+
};
72+
73+
const submit = (values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM>) => {
74+
const currentLimit = card.nameValuePairs?.limit ?? 0;
75+
const currentSpend = currentLimit - card.availableSpend;
76+
const newLimit = Number(values[INPUT_IDS.LIMIT]) * 100;
77+
const newAvailableSpend = newLimit - currentSpend;
78+
79+
if (newAvailableSpend <= 0) {
80+
setIsConfirmModalVisible(true);
81+
return;
82+
}
83+
84+
updateCardLimit(values[INPUT_IDS.LIMIT]);
85+
};
86+
87+
const validate = useCallback(
88+
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM> => {
89+
const errors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.LIMIT]);
90+
91+
// We only want integers to be sent as the limit
92+
if (!Number(values.limit) || !Number.isInteger(Number(values.limit))) {
93+
errors.limit = translate('iou.error.invalidAmount');
94+
}
95+
96+
return errors;
97+
},
98+
[translate],
99+
);
100+
101+
return (
102+
<AccessOrNotFoundWrapper
103+
accessVariants={[CONST.POLICY.ACCESS_VARIANTS.ADMIN, CONST.POLICY.ACCESS_VARIANTS.PAID]}
104+
policyID={policyID}
105+
featureName={CONST.POLICY.MORE_FEATURES.ARE_EXPENSIFY_CARDS_ENABLED}
106+
>
107+
<ScreenWrapper
108+
testID={WorkspaceEditCardLimitPage.displayName}
109+
shouldEnablePickerAvoiding={false}
110+
shouldEnableMaxHeight
111+
>
112+
<HeaderWithBackButton title={translate('workspace.expensifyCard.cardLimit')} />
113+
<FormProvider
114+
formID={ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM}
115+
submitButtonText={translate('common.save')}
116+
shouldHideFixErrorsAlert
117+
onSubmit={submit}
118+
style={styles.flex1}
119+
submitButtonStyles={[styles.mh5, styles.mt0]}
120+
submitFlexEnabled={false}
121+
enabledWhenOffline
122+
validate={validate}
123+
>
124+
{({inputValues}) => (
125+
<>
126+
<InputWrapper
127+
InputComponent={AmountForm}
128+
defaultValue={CurrencyUtils.convertToFrontendAmountAsString(card.nameValuePairs?.limit, CONST.CURRENCY.USD, false)}
129+
isCurrencyPressable={false}
130+
inputID={INPUT_IDS.LIMIT}
131+
ref={inputCallbackRef}
132+
/>
133+
<ConfirmModal
134+
title={translate('workspace.expensifyCard.changeCardLimit')}
135+
isVisible={isConfirmModalVisible}
136+
onConfirm={() => updateCardLimit(inputValues[INPUT_IDS.LIMIT])}
137+
onCancel={() => setIsConfirmModalVisible(false)}
138+
prompt={translate(getPromptTextKey, CurrencyUtils.convertToDisplayString(Number(inputValues[INPUT_IDS.LIMIT]) * 100, CONST.CURRENCY.USD))}
139+
confirmText={translate('workspace.expensifyCard.changeLimit')}
140+
cancelText={translate('common.cancel')}
141+
danger
142+
shouldEnableNewFocusManagement
143+
/>
144+
</>
145+
)}
146+
</FormProvider>
147+
</ScreenWrapper>
148+
</AccessOrNotFoundWrapper>
149+
);
150+
}
151+
152+
WorkspaceEditCardLimitPage.displayName = 'WorkspaceEditCardLimitPage';
153+
154+
export default WorkspaceEditCardLimitPage;

src/pages/workspace/expensifyCard/WorkspaceExpensifyCardDetailsPage.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ function WorkspaceExpensifyCardDetailsPage({route}: WorkspaceExpensifyCardDetail
116116
description={translate('workspace.expensifyCard.cardLimit')}
117117
title={formattedLimit}
118118
shouldShowRightIcon
119-
onPress={() => {}} // TODO: navigate to Edit card limit page https://github.com/Expensify/App/issues/44326
119+
onPress={() => Navigation.navigate(ROUTES.WORKSPACE_EXPENSIFY_CARD_LIMIT.getRoute(policyID, cardID))}
120120
/>
121121
<MenuItemWithTopDescription
122122
description={translate('workspace.card.issueNewCard.limitType')}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import type {ValueOf} from 'type-fest';
2+
import type Form from './Form';
3+
4+
const INPUT_IDS = {
5+
LIMIT: 'limit',
6+
} as const;
7+
8+
type InputID = ValueOf<typeof INPUT_IDS>;
9+
10+
type EditExpensifyCardLimitForm = Form<InputID, {[INPUT_IDS.LIMIT]: string}>;
11+
12+
export type {EditExpensifyCardLimitForm};
13+
export default INPUT_IDS;

0 commit comments

Comments
 (0)