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 b2bLogo from "@root/assets/bank-logo/b2b.png"; import tinkoffLogo from "@root/assets/bank-logo/logo-tinkoff.png"; import rsPayLogo from "@root/assets/bank-logo/rs-pay.png"; import sberpayLogo from "@root/assets/bank-logo/sberpay.png"; import spbLogo from "@root/assets/bank-logo/spb.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, useLayoutEffect, useState } from "react"; import { useLocation, 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 { useCartStore } from "@root/stores/cart"; import { useDiffMoney } from "@root/stores/diffMoney"; 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 [promocodeField, setPromocodeField] = useState(""); const [selectedPaymentMethod, setSelectedPaymentMethod] = useState(""); const [warnModalOpen, setWarnModalOpen] = useState(false); const [sorryModalOpen, setSorryModalOpen] = useState(false); const [paymentValueField, setPaymentValueField] = useState("0"); const [paymentLink, setPaymentLink] = useState(""); const location = useLocation(); const verificationStatus = useUserStore((state) => state.verificationStatus); const userId = useUserStore((state) => state.userId); const navigate = useNavigate(); const handleCustomBackNavigation = useHistoryTracker(); const [fromSquiz, setIsFromSquiz] = useState(false); const [waybackToSomeSite, setWaybackToSomeSite] = useState(""); const { diffMoney, setNewDiff } = useDiffMoney() const notEnoughMoneyAmount = (location.state?.notEnoughMoneyAmount as number) ?? 0; const paymentValue = parseFloat( bigDecimal.multiply(parseFloat(paymentValueField), 100) ); useEffect(() => { if (diffMoney > 0) { setNewDiff(0); setPaymentValueField((diffMoney / 100).toString()); } }, [diffMoney]) useLayoutEffect(() => { setPaymentValueField((notEnoughMoneyAmount / 100).toString()); const params = new URLSearchParams(window.location.search); const fromSquiz = params.get("action"); if (fromSquiz === "squizpay") { setIsFromSquiz(true); setPaymentValueField((Number(params.get("dif") || "0") / 100).toString()); } const wayback = params.get("wayback"); if (wayback) setWaybackToSomeSite(wayback); console.log(" я получил wayback = " + wayback) navigate(`/payment`, { replace: true, }); }, []); async function handleChoosePaymentClick() { if (!selectedPaymentMethod) { enqueueSnackbar("Введите метод оплаты"); return; } if (Number(paymentValueField) === 0) { enqueueSnackbar("Введите сумму"); return; } if (selectedPaymentMethod !== "rspay") { const [sendPaymentResponse, sendPaymentError] = await sendPayment({ userId: userId ?? "", fromSquiz, wayback: waybackToSomeSite, body: { type: selectedPaymentMethod, amount: Number( bigDecimal.floor( bigDecimal.multiply(Number(paymentValueField), 100) ) ), }, paymentPurpose: notEnoughMoneyAmount ? "paycart" : "replenishwallet", }); if (sendPaymentError) { return enqueueSnackbar(sendPaymentError); } if (sendPaymentResponse) { setPaymentLink(sendPaymentResponse.link); } return; } else { if (verificationStatus !== VerificationStatus.VERIFICATED) { setWarnModalOpen(true); return; } if (Number(paymentValueField) < 900) { enqueueSnackbar("Минимальная сумма 900р"); return; } const [sendRSPaymentResponse] = await sendRSPayment( Number(paymentValueField) ); if (sendRSPaymentResponse) { return enqueueSnackbar(sendRSPaymentResponse); } enqueueSnackbar( "Cпасибо за заявку, в течении 24 часов вам будет выставлен счёт для оплаты услуг." ); navigate("/settings"); } } 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); setPaymentLink(""); }} unpopular={false} /> ))} { setSelectedPaymentMethod("rspay"); setPaymentLink(""); }} unpopular={false} /> {upMd && Выберите способ оплаты} К оплате {paymentLink ? ( {currencyFormatter.format( Number(bigDecimal.divide(bigDecimal.floor(paymentValue), 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" }} /> )} {paymentLink ? ( ) : ( )} ); } //https://shub.pena.digital/quizpayment?action=squizpay&dif=50000&data=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY4NDcxNjAxYzE0OWU0ZDI0ZWJmNTExNyIsImF1ZCI6InBlbmEiLCJpc3MiOiJwZW5hLWF1dGgtc2VydmljZSIsImlhdCI6MTc0OTQ4OTE1MywiZXhwIjoxNzU0NjczMTUzfQ.SqEXFSPzP3ugIscqLywGkjFJmFqx13zOtxGAjZQ6SzUw8w9ZXjE9uFn8VbLBMGPqeJbvcT2jRV2bB5qtqMy1T3aNuSZ9AZW0jY1hGvFB-bSrYguMV1yErLkR45SvdK2jGI6dg3p6LRqCHb2JMl8vur_KKaus3GiJlsTNNR0fhgI&userid=68471601c149e4d24ebf5117&from=AI&wayback=ai_27969