Skip to content

Commit 80e41a0

Browse files
committed
filter out $0 limit cards
1 parent 1c4b3e5 commit 80e41a0

3 files changed

Lines changed: 60 additions & 2 deletions

File tree

src/libs/CardUtils.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,7 +1511,8 @@ function hasDisplayableAssignedCards(cardList: CardList | undefined): boolean {
15111511
CONST.EXPENSIFY_CARD.ACTIVE_STATES.includes(card.state ?? 0) &&
15121512
(isExpensifyCard(card) || !!card.domainName || isPersonalCard(card)) &&
15131513
card.cardName !== CONST.COMPANY_CARDS.CARD_NAME.CASH &&
1514-
(!isExpensifyCard(card) || !isExpiredCard(card)),
1514+
(!isExpensifyCard(card) || !isExpiredCard(card)) &&
1515+
(!isExpensifyCard(card) || !(card.nameValuePairs?.hasCustomUnapprovedExpenseLimit && card.nameValuePairs?.unapprovedExpenseLimit === 0)),
15151516
);
15161517
}
15171518

@@ -1560,7 +1561,12 @@ function getDisplayableExpensifyCards(cardList: CardList | undefined): Card[] {
15601561

15611562
const activeCards = filterAllInactiveCards(cardList);
15621563
const activeExpensifyCards = Object.values(activeCards).filter(
1563-
(card) => isExpensifyCard(card) && !isExpiredCard(card) && card.cardName !== CONST.COMPANY_CARDS.CARD_NAME.CASH && !isTravelCard(card),
1564+
(card) =>
1565+
isExpensifyCard(card) &&
1566+
!isExpiredCard(card) &&
1567+
card.cardName !== CONST.COMPANY_CARDS.CARD_NAME.CASH &&
1568+
!isTravelCard(card) &&
1569+
!(card.nameValuePairs?.hasCustomUnapprovedExpenseLimit && card.nameValuePairs?.unapprovedExpenseLimit === 0),
15641570
);
15651571

15661572
const sortedCards = lodashSortBy(activeExpensifyCards, getAssignedCardSortKey);

src/pages/home/TimeSensitiveSection/hooks/useTimeSensitiveCards.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ function useTimeSensitiveCards() {
1919
continue;
2020
}
2121

22+
if (card.nameValuePairs?.hasCustomUnapprovedExpenseLimit && card.nameValuePairs?.unapprovedExpenseLimit === 0) {
23+
continue;
24+
}
25+
2226
if (isCardWithPotentialFraud(card) && card.nameValuePairs?.possibleFraud?.fraudAlertReportID) {
2327
cardsWithFraud.push(card);
2428
}

tests/unit/hooks/useTimeSensitiveCards.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,4 +220,52 @@ describe('useTimeSensitiveCards', () => {
220220
expect(result.current.cardsWithFraud.at(0)?.cardID).toBe(1);
221221
expect(result.current.shouldShowReviewCardFraud).toBe(true);
222222
});
223+
224+
it('should exclude cards with custom $0 limit from shipping address to-dos', async () => {
225+
const zeroLimitCard: Card = {
226+
...createRandomExpensifyCard(1, {state: CONST.EXPENSIFY_CARD.STATE.STATE_NOT_ISSUED}),
227+
nameValuePairs: {hasCustomUnapprovedExpenseLimit: true, unapprovedExpenseLimit: 0} as Card['nameValuePairs'],
228+
};
229+
const cardList: CardList = {'1': zeroLimitCard};
230+
231+
await Onyx.merge(ONYXKEYS.CARD_LIST, cardList);
232+
await waitForBatchedUpdates();
233+
234+
const {result} = renderHook(() => useTimeSensitiveCards());
235+
236+
expect(result.current.cardsNeedingShippingAddress).toHaveLength(0);
237+
expect(result.current.shouldShowAddShippingAddress).toBe(false);
238+
});
239+
240+
it('should exclude cards with custom $0 limit from activation to-dos', async () => {
241+
const zeroLimitCard: Card = {
242+
...createRandomExpensifyCard(1, {state: CONST.EXPENSIFY_CARD.STATE.NOT_ACTIVATED}),
243+
nameValuePairs: {hasCustomUnapprovedExpenseLimit: true, unapprovedExpenseLimit: 0} as Card['nameValuePairs'],
244+
};
245+
const cardList: CardList = {'1': zeroLimitCard};
246+
247+
await Onyx.merge(ONYXKEYS.CARD_LIST, cardList);
248+
await waitForBatchedUpdates();
249+
250+
const {result} = renderHook(() => useTimeSensitiveCards());
251+
252+
expect(result.current.cardsNeedingActivation).toHaveLength(0);
253+
expect(result.current.shouldShowActivateCard).toBe(false);
254+
});
255+
256+
it('should not exclude cards without custom limit even if unapprovedExpenseLimit is 0', async () => {
257+
const groupLimitCard: Card = {
258+
...createRandomExpensifyCard(1, {state: CONST.EXPENSIFY_CARD.STATE.NOT_ACTIVATED}),
259+
nameValuePairs: {hasCustomUnapprovedExpenseLimit: false, unapprovedExpenseLimit: 0} as Card['nameValuePairs'],
260+
};
261+
const cardList: CardList = {'1': groupLimitCard};
262+
263+
await Onyx.merge(ONYXKEYS.CARD_LIST, cardList);
264+
await waitForBatchedUpdates();
265+
266+
const {result} = renderHook(() => useTimeSensitiveCards());
267+
268+
expect(result.current.cardsNeedingActivation).toHaveLength(1);
269+
expect(result.current.shouldShowActivateCard).toBe(true);
270+
});
223271
});

0 commit comments

Comments
 (0)