From 3c29a51699e734df9138a4cb047836ded52bf6f7 Mon Sep 17 00:00:00 2001 From: jsapro <77.3.77@mail.ru> Date: Tue, 16 Jan 2024 13:32:56 +0300 Subject: [PATCH] feat: add promocode to checkout page --- src/pages/checkout/checkout.module.scss | 14 ++++ src/pages/checkout/index.tsx | 84 ++++++++++++++++++-- src/services/api.ts | 12 +++ src/services/generated-api/data-contracts.ts | 4 + 4 files changed, 109 insertions(+), 5 deletions(-) diff --git a/src/pages/checkout/checkout.module.scss b/src/pages/checkout/checkout.module.scss index da31378d..f6f21909 100644 --- a/src/pages/checkout/checkout.module.scss +++ b/src/pages/checkout/checkout.module.scss @@ -150,6 +150,20 @@ } } +.summary__promoError { + min-height: 20px; + text-align: center; + color: $error-color; + font-size: 13px; + font-weight: 300; + line-height: 140%; + + @media screen and (width <= 768px) { + font-size: 12px; + min-height: 17px; + } +} + .summary__sale { max-height: 56px; display: flex; diff --git a/src/pages/checkout/index.tsx b/src/pages/checkout/index.tsx index 4de63605..46b604a9 100644 --- a/src/pages/checkout/index.tsx +++ b/src/pages/checkout/index.tsx @@ -30,6 +30,23 @@ enum paymentMethodEnum { online = 'Online', } +type Promo = { + code: string; + conditions: string; + discount: number; + discount_amount: number; + end_time: null; + id: number; + image: null; + is_active: boolean; + is_constant: boolean; + name: string; + new_total_price: number; + promotion_type: string; + slug: string; + start_time: string; +}; + const Checkout: React.FC = () => { const { isLoggedIn, user } = useAuth(); const { loadCartData, cartData } = useCart(); @@ -46,6 +63,25 @@ const Checkout: React.FC = () => { const [comment, setComment] = React.useState(''); const [popupText, setPopupText] = useState(''); const [isAgreed, setIsAgreed] = useState(false); + const [promocodeError, setPromocodeError] = useState(''); + const [inputPromoValue, setInputPromoValue] = useState(''); + const discountInitial = { + code: '', + conditions: '', + discount: 0, + discount_amount: 0, + end_time: null, + id: 0, + image: null, + is_active: false, + is_constant: false, + name: '', + new_total_price: 0, + promotion_type: '', + slug: '', + start_time: '', + }; + const [discount, setDiscount] = useState(discountInitial); const openInfoPopup = (text: string) => { setPopupText(text); @@ -141,6 +177,25 @@ const Checkout: React.FC = () => { } }); }; + + const handleDiscount = (e: React.MouseEvent) => { + api + .usersShoppingCartCouponApply({ code: inputPromoValue }) + .then((data) => { + setDiscount(data); + setPromocodeError(''); + }) + .catch((error) => { + setDiscount(discountInitial); + setPromocodeError(error.errors[0].detail); + }); + e.preventDefault(); + }; + + const handleInputPromoChange = (e: React.ChangeEvent) => { + setInputPromoValue(e.target.value); + }; + const handlePaymentChange = (event: React.ChangeEvent) => { setSelectedPayment(event.target.value); }; @@ -446,9 +501,11 @@ const Checkout: React.FC = () => {

Товары

-

{`${cartData.total_price} руб.`}

+

{`${ + discount && discount.discount !== 0 + ? discount.new_total_price + : cartData.total_price + } руб.`}

Упаковка

@@ -460,15 +517,32 @@ const Checkout: React.FC = () => {

0 руб.

+
+

Скидка

+

+ {discount ? discount.discount_amount : 0} руб. +

+

Промокод

- - + +
+ {promocodeError}