import { Box, Button, IconButton, Typography, useMediaQuery, useTheme, } from "@mui/material"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import SectionWrapper from "@components/SectionWrapper"; import PaymentMethodCard from "./PaymentMethodCard"; import mastercardLogo from "@root/assets/bank-logo/logo-mastercard.png"; import visaLogo from "@root/assets/bank-logo/logo-visa.png"; import qiwiLogo from "@root/assets/bank-logo/logo-qiwi.png"; import mirLogo from "@root/assets/bank-logo/logo-mir.png"; import tinkoffLogo from "@root/assets/bank-logo/logo-tinkoff.png"; import rsPayLogo from "@root/assets/bank-logo/rs-pay.png"; import { cardShadow } from "@root/utils/theme"; import { useEffect, useLayoutEffect, useState } from "react"; import InputTextfield from "@root/components/InputTextfield"; import { sendPayment, sendRSPayment } from "@root/api/wallet"; import { getMessageFromFetchError } from "@frontend/kitui"; import { enqueueSnackbar } from "notistack"; import { currencyFormatter } from "@root/utils/currencyFormatter"; import { useLocation, useNavigate } from "react-router-dom"; import { useHistoryTracker } from "@root/utils/hooks/useHistoryTracker"; import { useUserStore } from "@root/stores/user"; import { VerificationStatus } from "@root/model/account"; import { WarnModal } from "./WarnModal"; import { SorryModal } from "./SorryModal"; type PaymentMethod = { label: string; name: string; image: string; unpopular?: boolean; }; const paymentMethods: PaymentMethod[] = [ { label: "Mastercard", name: "mastercard", image: mastercardLogo }, { label: "Visa", name: "visa", image: visaLogo }, { label: "QIWI Кошелек", name: "qiwi", image: qiwiLogo }, { label: "Мир", name: "mir", image: mirLogo }, { label: "Тинькофф", name: "tinkoff", image: tinkoffLogo }, ]; 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 [selectedPaymentMethod, setSelectedPaymentMethod] = useState(null); const [warnModalOpen, setWarnModalOpen] = useState(false); const [sorryModalOpen, setSorryModalOpen] = useState(false); const [paymentValueField, setPaymentValueField] = useState("0"); const [paymentLink, setPaymentLink] = useState(""); const [fromSquiz, setIsFromSquiz] = useState(false); const location = useLocation(); const verificationStatus = useUserStore((state) => state.verificationStatus); const navigate = useNavigate(); const notEnoughMoneyAmount = (location.state?.notEnoughMoneyAmount as number) ?? 0; const paymentValue = parseFloat(paymentValueField) * 100; 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()); } history.pushState(null, document.title, "/payment"); console.log(fromSquiz); }, []); useEffect(() => { setPaymentLink(""); }, [selectedPaymentMethod]); async function handleChoosePaymentClick() { if (Number(paymentValueField) === 0) { return; } if (selectedPaymentMethod !== "rspay") { const [sendPaymentResponse, sendPaymentError] = await sendPayment({ fromSquiz, }); if (sendPaymentError) { return enqueueSnackbar(sendPaymentError); } if (sendPaymentResponse) { setPaymentLink(sendPaymentResponse.link); } return; } } const handleCustomBackNavigation = useHistoryTracker(); return ( {!upMd && ( )} Способ оплаты {!upMd && ( Выберите способ оплаты )} {paymentMethods.map(({ name, label, image, unpopular = false }) => ( { setSorryModalOpen(true) // setSelectedPaymentMethod(name) }} unpopular={true} /> ))} { if (verificationStatus !== VerificationStatus.VERIFICATED) { setWarnModalOpen(true); return; } console.log(paymentValueField) if (Number(paymentValueField) < 900){ enqueueSnackbar("Минимальная сумма 900р") return; } const sendRSPaymentError = await sendRSPayment(Number(paymentValueField)); if (sendRSPaymentError) { return enqueueSnackbar(sendRSPaymentError); } enqueueSnackbar( "Cпасибо за заявку, в течении 24 часов вам будет выставлен счёт для оплаты услуг." ); navigate("/settings"); }} unpopular={false} /> {upMd && Выберите способ оплаты} К оплате {paymentLink ? ( {currencyFormatter.format(paymentValue / 100)} ) : ( setPaymentValueField(e.target.value)} id="payment-amount" gap={upMd ? "16px" : "10px"} color={"#F2F3F7"} FormInputSx={{ mb: "28px" }} /> )} {paymentLink ? ( ) : ( )} ); }