From 5d5d78d6ed5c4949a61d7ba0d2122c6d35a0d69c Mon Sep 17 00:00:00 2001 From: Marie Gauthier Date: Mon, 10 Feb 2025 17:47:37 +0100 Subject: [PATCH] fix: APP-571 disable credit card option when available fiat credits are below $0.5 (#2592) --- .../ChooseCreditsForm.schema.tsx | 9 +++- .../projects/normalizeProjectsWithMetadata.ts | 46 +++++++++++++------ .../src/pages/BuyCredits/BuyCredits.utils.tsx | 2 +- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/web-marketplace/src/components/organisms/ChooseCreditsForm/ChooseCreditsForm.schema.tsx b/web-marketplace/src/components/organisms/ChooseCreditsForm/ChooseCreditsForm.schema.tsx index 6e5d0b9cb5..2911325eba 100644 --- a/web-marketplace/src/components/organisms/ChooseCreditsForm/ChooseCreditsForm.schema.tsx +++ b/web-marketplace/src/components/organisms/ChooseCreditsForm/ChooseCreditsForm.schema.tsx @@ -4,6 +4,7 @@ import { CREDITS_AMOUNT, CURRENCY, CURRENCY_AMOUNT, + MIN_USD_CURRENCY_AMOUNT, SELL_ORDERS, } from 'web-marketplace/src/components/molecules/CreditsAmount/CreditsAmount.constants'; import { z } from 'zod'; @@ -49,9 +50,13 @@ export const createChooseCreditsFormSchema = ({ }, ) .refine( - value => paymentOption === PAYMENT_OPTIONS.CRYPTO || value >= 0.5, + value => + paymentOption === PAYMENT_OPTIONS.CRYPTO || + value >= MIN_USD_CURRENCY_AMOUNT, { - message: `${i18n._(MIN_USD_AMOUNT)} 0.5`, + message: `${i18n._( + MIN_USD_AMOUNT, + )} ${MIN_USD_CURRENCY_AMOUNT.toLocaleString()}`, }, ), [CREDITS_AMOUNT]: z.coerce diff --git a/web-marketplace/src/lib/normalizers/projects/normalizeProjectsWithMetadata.ts b/web-marketplace/src/lib/normalizers/projects/normalizeProjectsWithMetadata.ts index c6dd1fc204..dbf18fb5a1 100644 --- a/web-marketplace/src/lib/normalizers/projects/normalizeProjectsWithMetadata.ts +++ b/web-marketplace/src/lib/normalizers/projects/normalizeProjectsWithMetadata.ts @@ -31,6 +31,7 @@ import { UISellOrderInfo, } from 'pages/Projects/AllProjects/AllProjects.types'; import { getPriceToDisplay } from 'pages/Projects/hooks/useProjectsSellOrders.utils'; +import { MIN_USD_CURRENCY_AMOUNT } from 'components/molecules/CreditsAmount/CreditsAmount.constants'; import { CardSellOrder } from 'components/organisms/ChooseCreditsForm/ChooseCreditsForm.types'; import { getDisplayAccount } from 'components/templates/ProjectDetails/ProjectDetails.utils'; @@ -242,18 +243,33 @@ export const normalizeProjectWithMetadata = ({ export const getCardSellOrders = ( sanityFiatSellOrders: SanityProject['fiatSellOrders'], sellOrders: UISellOrderInfo[], -) => - (sanityFiatSellOrders - ?.map(fiatOrder => { - const sellOrder = sellOrders.find( - cryptoOrder => cryptoOrder.id.toString() === fiatOrder?.sellOrderId, - ); - if (sellOrder) { - return { - ...fiatOrder, - ...sellOrder, - }; - } - return null; - }) - .filter(Boolean) || []) as CardSellOrder[]; +) => { + const cardSellOrders = ( + sanityFiatSellOrders + ? sanityFiatSellOrders.reduce((acc: CardSellOrder[], fiatOrder) => { + const sellOrder = sellOrders.find( + cryptoOrder => cryptoOrder.id.toString() === fiatOrder?.sellOrderId, + ); + if (sellOrder) { + acc.push({ ...fiatOrder, ...sellOrder } as CardSellOrder); + } + return acc; + }, []) + : [] + ).sort((a, b) => a.usdPrice - b.usdPrice); + + let hasMinUsdAmount = false; + let currentSum = 0; + + for (const order of cardSellOrders) { + currentSum = Number( + (currentSum + order.usdPrice * Number(order.quantity)).toFixed(2), + ); + if (currentSum >= MIN_USD_CURRENCY_AMOUNT) { + hasMinUsdAmount = true; + break; + } + } + + return hasMinUsdAmount ? cardSellOrders : []; +}; diff --git a/web-marketplace/src/pages/BuyCredits/BuyCredits.utils.tsx b/web-marketplace/src/pages/BuyCredits/BuyCredits.utils.tsx index ebe2656572..c38a24af25 100644 --- a/web-marketplace/src/pages/BuyCredits/BuyCredits.utils.tsx +++ b/web-marketplace/src/pages/BuyCredits/BuyCredits.utils.tsx @@ -62,7 +62,7 @@ export const getOrderedSellOrders = ( filteredCryptoSellOrders: UISellOrderInfo[], ): UISellOrderInfo[] => { return isCard - ? cardSellOrders.sort((a, b) => a.usdPrice - b.usdPrice) + ? cardSellOrders // already sorted in getCardSellOrders : filteredCryptoSellOrders?.sort( (a, b) => Number(a.askAmount) - Number(b.askAmount), ) || [];