import bigDecimal from "js-big-decimal"; import SectionWrapper from "@components/SectionWrapper"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { Box, Button, IconButton, Typography, useMediaQuery, useTheme, } from "@mui/material"; import { activatePromocode } from "@root/api/promocode"; import { sendPayment, sendRSPayment } from "@root/api/wallet"; import rsPayLogo from "@root/assets/bank-logo/rs-pay.png"; import sberpayLogo from "@root/assets/bank-logo/sberpay.png"; import umoneyLogo from "@root/assets/bank-logo/umaney.png"; import bankCardLogo from "@root/assets/bank-logo/bankcard.png"; import InputTextfield from "@root/components/InputTextfield"; import { VerificationStatus } from "@root/model/account"; import { useUserStore } from "@root/stores/user"; import { currencyFormatter } from "@root/utils/currencyFormatter"; import { useHistoryTracker } from "@root/utils/hooks/useHistoryTracker"; import { cardShadow } from "@root/utils/theme"; import { enqueueSnackbar } from "notistack"; import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import CollapsiblePromocodeField from "./CollapsiblePromocodeField"; import PaymentMethodCard from "./PaymentMethodCard"; import { SorryModal } from "./SorryModal"; import { WarnModal } from "./WarnModal"; import { mutate } from "swr"; import { allTypesOfPurchases, cancelPayCartProcess } from "@root/stores/allTypesOfPurchases"; import { useAutoPay } from "./useAutoPay"; type PaymentMethod = { label: string; name: string; image: string; unpopular?: boolean; }; const paymentMethods: PaymentMethod[] = [ { label: "Банковская карта", name: "bankCard", image: bankCardLogo }, // { label: "Тинькофф", name: "tinkoffBank", image: tinkoffLogo }, // { label: "СБП", name: "sbp", image: spbLogo }, { label: "SberPay", name: "sberbank", image: sberpayLogo }, // { label: "B2B Сбербанк", name: "b2bSberbank", image: b2bLogo }, { label: "ЮMoney", name: "yoomoney", image: umoneyLogo }, ]; type PaymentMethodType = (typeof paymentMethods)[number]["name"]; export default function Payment() { const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); const upSm = useMediaQuery(theme.breakpoints.up("sm")); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const navigate = useNavigate(); const handleCustomBackNavigation = useHistoryTracker(); const userId = useUserStore((state) => state.userId) || ""; const notEnoughMoneyAmount = allTypesOfPurchases(state => state.notEnoughMoneyAmount); const siteReadyPayCart = allTypesOfPurchases(state => state.siteReadyPayCart) const verificationStatus = useUserStore((state) => state.verificationStatus); const action = allTypesOfPurchases(state => state.action); const fromDomain = allTypesOfPurchases(state => state.fromDomain); const backWay = allTypesOfPurchases(state => state.backWay); const additionalinformation = allTypesOfPurchases(state => state.additionalinformation); console.log("Payment - значения из Zustand store:"); console.log("action:", action); console.log("fromDomain:", fromDomain); console.log("backWay:", backWay); console.log("additionalinformation:", additionalinformation); console.log("notEnoughMoneyAmount:", notEnoughMoneyAmount); const [promocodeField, setPromocodeField] = useState(""); const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(""); const [paymentValueField, setPaymentValueField] = useAutoPay(); const [warnModalOpen, setWarnModalOpen] = useState(false); const [sorryModalOpen, setSorryModalOpen] = useState(false); // paymentValue в копейках для API const paymentValue = Number( bigDecimal.multiply(parseFloat(paymentValueField || "0"), 100) ); useEffect(() => { return () => { cancelPayCartProcess(); } }, []) //https://shub.pena.digital/quizpayment?action=squizpay&dif=9800&data=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY2ODVhNTc4OTgzZWU3N2Y4ZTFlNjNkYyIsImF1ZCI6InBlbmEiLCJpc3MiOiJwZW5hLWF1dGgtc2VydmljZSIsImlhdCI6MTcyMjIyMjgzMywiZXhwIjoxNzI3NDA2ODMzfQ.My1KJWFk034MiMdImQSlzf5p4Sn5Dhboj2VvPQteh59tD_CwXyPtePEyev3thV_58IbOOgJ5cgeBm0JKn7atgMgRMpNQVdeYKtf6HYvVoAqkrMcT1LHgAlEQ0TcaXssFKCQGuiCVltHY3UE-kQv5TeydBpO3U9BDKvMqRqv5-Xo&userid=6685a578983ee77f8e1e63dc const handlePaymentClick = () => { // Проверяем оба источника данных const hasPaymentValue = Number(paymentValueField) > 0; const hasNotEnoughMoney = notEnoughMoneyAmount > 0; console.log("handlePaymentClick - проверка:"); console.log("paymentValueField:", paymentValueField); console.log("Number(paymentValueField):", Number(paymentValueField)); console.log("notEnoughMoneyAmount:", notEnoughMoneyAmount); console.log("hasPaymentValue:", hasPaymentValue); console.log("hasNotEnoughMoney:", hasNotEnoughMoney); if (!hasPaymentValue && !hasNotEnoughMoney) { enqueueSnackbar("Введите сумму"); return; } if (selectedPaymentMethod === "rspay") { const amountToCheck = hasPaymentValue ? Number(paymentValueField) : Number(bigDecimal.divide(notEnoughMoneyAmount, 100)); if (amountToCheck < 900) { enqueueSnackbar("Минимальная сумма 900р"); return; } if (verificationStatus !== VerificationStatus.VERIFICATED) { setWarnModalOpen(true); return; } startPayRS() } else { startPayCard() } } const startPayRS = async () => { // Определяем сумму для оплаты const hasPaymentValue = Number(paymentValueField) > 0; const amountInRubles = hasPaymentValue ? Number(paymentValueField) : Number(bigDecimal.divide(notEnoughMoneyAmount, 100)); const [sendRSPaymentResponse] = await sendRSPayment(amountInRubles); if (sendRSPaymentResponse) { return enqueueSnackbar(sendRSPaymentResponse); } enqueueSnackbar( "Cпасибо за заявку, в течении 24 часов вам будет выставлен счёт для оплаты услуг." ); navigate("/settings"); } const startPayCard = async () => { if (!selectedPaymentMethod) { enqueueSnackbar("Введите метод оплаты"); return } // Определяем сумму для оплаты const hasPaymentValue = Number(paymentValueField) > 0; const amountInRubles = hasPaymentValue ? Number(paymentValueField) : Number(bigDecimal.divide(notEnoughMoneyAmount, 100)); const amountInKopecks = Number(bigDecimal.floor(bigDecimal.multiply(amountInRubles, 100))); console.log("startPayCard - параметры:"); console.log("action:", action); console.log("fromDomain:", fromDomain); console.log("backWay:", backWay); console.log("amountInRubles:", amountInRubles); console.log("amountInKopecks:", amountInKopecks); const [sendPaymentResponse, sendPaymentError] = await sendPayment({ userId, body: { type: selectedPaymentMethod, amount: amountInKopecks, }, action: action || undefined, fromDomain: fromDomain || undefined, backWay: backWay || undefined, additionalinformation: additionalinformation || undefined, }); if (sendPaymentError) { return enqueueSnackbar(sendPaymentError); } //Произошёл запрос на пополнение счёта. Нам вернули ссылку для перехода на страницу пополнения. if (sendPaymentResponse) { document.location.href = sendPaymentResponse.link; } } async function handleApplyPromocode() { if (!promocodeField) return; const [greeting, activateError] = await activatePromocode(promocodeField); if (activateError) { return enqueueSnackbar(activateError); } enqueueSnackbar(greeting); mutate("discounts"); } return ( {window.history.length > 1 && ( )} Способ оплаты {!upMd && ( Выберите способ оплаты )} {paymentMethods.map(({ name, label, image, unpopular = false }) => ( { setSelectedPaymentMethod(name); }} unpopular={false} /> ))} { setSelectedPaymentMethod("rspay"); }} unpopular={false} /> {upMd && Выберите способ оплаты} К оплате { siteReadyPayCart?.[userId] && notEnoughMoneyAmount > 0 ? {currencyFormatter.format( Number(bigDecimal.divide(notEnoughMoneyAmount, 100)) )} : { const value = parseFloat( e.target.value.replace(/^0+(?=\d\.)/, "") ); setPaymentValueField(isNaN(value) ? "" : value.toString()); }} id="payment-amount" gap={upMd ? "16px" : "10px"} color={"#F2F3F7"} FormInputSx={{ mb: "28px" }} /> } ); } //https://shub.pena.digital/quizpayment?action=squizpay&dif=50000&data=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY4NDcxNjAxYzE0OWU0ZDI0ZWJmNTExNyIsImF1ZCI6InBlbmEiLCJpc3MiOiJwZW5hLWF1dGgtc2VydmljZSIsImlhdCI6MTc0OTQ4OTE1MywiZXhwIjoxNzU0NjczMTUzfQ.SqEXFSPzP3ugIscqLywGkjFJmFqx13zOtxGAjZQ6SzUw8w9ZXjE9uFn8VbLBMGPqeJbvcT2jRV2bB5qtqMy1T3aNuSZ9AZW0jY1hGvFB-bSrYguMV1yErLkR45SvdK2jGI6dg3p6LRqCHb2JMl8vur_KKaus3GiJlsTNNR0fhgI&userid=68471601c149e4d24ebf5117&from=AI&wayback=ai_27969