import { logout } from "@api/auth"; import { activatePromocode } from "@api/promocode"; import type { Tariff } from "@frontend/kitui"; import { clearAuthToken, makeRequest, useToken } from "@frontend/kitui"; import ArrowLeft from "@icons/questionsPage/arrowLeft"; import type { GetTariffsResponse } from "@model/tariff"; import { Box, Button, Container, IconButton, Modal, Paper, Typography, useMediaQuery, useTheme, } from "@mui/material"; import { clearQuizData } from "@root/quizes/store"; import { cleanAuthTicketData } from "@root/ticket"; import { clearUserData, useUserStore } from "@root/user"; import { LogoutButton } from "@ui_kit/LogoutButton"; import { useDomainDefine } from "@utils/hooks/useDomainDefine"; import { enqueueSnackbar } from "notistack"; import { useEffect, useState } from "react"; import { withErrorBoundary } from "react-error-boundary"; import { Link, useNavigate } from "react-router-dom"; import Logotip from "../../pages/Landing/images/icons/QuizLogo"; import CollapsiblePromocodeField from "./CollapsiblePromocodeField"; import { Tabs } from "./Tabs"; import { createTariffElements } from "./tariffsUtils/createTariffElements"; import { currencyFormatter } from "./tariffsUtils/currencyFormatter"; import { useWallet, setCash } from "@root/cash"; import { handleLogoutClick } from "@utils/HandleLogoutClick"; const StepperText: Record = { day: "Тарифы на время", count: "Тарифы на объём", dop: "Доп. услуги", }; function TariffPage() { const theme = useTheme(); const token = useToken(); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const isMobile = useMediaQuery(theme.breakpoints.down(600)); const userId = useUserStore((state) => state.userId); const navigate = useNavigate(); const [tariffs, setTariffs] = useState([]); const [user, setUser] = useState(); const [discounts, setDiscounts] = useState(); const [openModal, setOpenModal] = useState({}); const { cashString, cashCop, cashRub } = useWallet(); const [selectedItem, setSelectedItem] = useState<"count" | "day" | "dop">( "day", ); const { isTestServer } = useDomainDefine(); const [promocodeField, setPromocodeField] = useState(""); const getTariffsList = async (): Promise => { const tariffsList: Tariff[] = []; const { tariffs, totalPages } = await makeRequest< never, GetTariffsResponse >({ method: "GET", url: process.env.REACT_APP_DOMAIN + "/strator/tariff?page=1&limit=100", }); tariffsList.push(...tariffs); for (let page = 2; page <= totalPages; page += 1) { const tariffsResult = await makeRequest({ method: "GET", url: process.env.REACT_APP_DOMAIN + `/strator/tariff?page=${page}&limit=100`, }); tariffsList.push(...tariffsResult.tariffs); } return tariffsList; }; useEffect(() => { const get = async () => { const user = await makeRequest({ method: "GET", url: process.env.REACT_APP_DOMAIN + "/customer/account", }); const tariffsList = await getTariffsList(); const discounts = await makeRequest({ method: "GET", url: `${process.env.REACT_APP_DOMAIN}/price/discount/user/${userId}`, }); setUser(user); setTariffs(tariffsList); setDiscounts(discounts.Discounts); let cs = currencyFormatter.format(Number(user.wallet.cash) / 100); let cc = Number(user.wallet.cash); let cr = Number(user.wallet.cash) / 100; setCash(cs, cc, cr); }; get(); }, []); if (!user || !tariffs || !discounts) return ; const openModalHC = (tariffInfo: any) => setOpenModal(tariffInfo); const tryBuy = async ({ id, price }: { id: string; price: number }) => { console.log("цена", price); // console.log("мои деньги", (user.wallet.cash / 100)) openModalHC({}); //Если в корзине что-то было - выкладываем содержимое и запоминаем чо там лежало if (user.cart.length > 0) { outCart(user.cart); } //Добавляем желаемый тариф в корзину await makeRequest({ method: "PATCH", url: process.env.REACT_APP_DOMAIN + `/customer/cart?id=${id}`, }); //Если нам хватает денежек - покупаем тариф if (price * 100 <= cashCop) { try { const data = await makeRequest({ method: "POST", url: process.env.REACT_APP_DOMAIN + "/customer/cart/pay", }); console.log(data); setCash( currencyFormatter.format(Number(data.wallet.cash) / 100), Number(data.wallet.cash), Number(data.wallet.cash) / 100, ); enqueueSnackbar("Тариф успешно приобретён"); } catch (e) { enqueueSnackbar("Произошла ошибка. Попробуйте позже"); } //Развращаем товары в корзину inCart(); } else { //Деняк не хватило // history.pushState({}, null, "https://hub.pena.digital/wallet?action=squizpay"); var link = document.createElement("a"); link.href = `https://${isTestServer ? "s" : ""}hub.pena.digital/quizpayment?action=squizpay&dif=${Math.round( price * 100 - cashCop, )}&data=${token}&userid=${userId}`; document.body.appendChild(link); link.click(); } }; const filteredTariffs = tariffs.filter((tariff) => { return ( tariff.privileges[0].serviceKey === "squiz" && !tariff.isDeleted && !tariff.isCustom && tariff.privileges[0]?.type === selectedItem ); }); const filteredBadgeTariffs = tariffs.filter((tariff) => { return ( tariff.privileges[0].serviceKey === "squiz" && !tariff.isDeleted && !tariff.isCustom && tariff.privileges[0].privilegeId === "squizHideBadge" && tariff.privileges[0]?.type === "day" ); }); const filteredBaseTariffs = filteredTariffs.filter((tariff) => { return tariff.privileges[0].privilegeId !== "squizHideBadge"; }); function handleApplyPromocode() { if (!promocodeField) return; activatePromocode(promocodeField) .then(enqueueSnackbar) .catch(enqueueSnackbar); } return ( <> navigate("/list")}> Мой баланс 9 ? "13px" : "16px") : "16px" } > {cashString} { navigate("/"); handleLogoutClick(); }} sx={{ ml: "20px", }} /> {selectedItem === "day" && createTariffElements( filteredBaseTariffs, true, user, discounts, openModalHC, )} {selectedItem === "count" && createTariffElements( filteredTariffs, true, user, discounts, openModalHC, )} {selectedItem === "dop" && ( <> Убрать логотип "PenaQuiz" {createTariffElements( filteredBadgeTariffs, false, user, discounts, openModalHC, )} )} 0} onClose={() => setOpenModal({})} > Вы подтверждаете платёж в сумму{" "} {openModal.price ? openModal.price.toFixed(2) : 0} ₽ ); } export const Tariffs = withErrorBoundary(TariffPage, { fallback: ( Ошибка загрузки тарифов ), onError: () => {}, }); const LoadingPage = () => ( {"Подождите, пожалуйста, идёт загрузка :)"} ); export const inCart = () => { let saveCart = JSON.parse(localStorage.getItem("saveCart") || "[]"); if (Array.isArray(saveCart)) { saveCart.forEach(async (id: string) => { try { await makeRequest({ method: "PATCH", url: process.env.REACT_APP_DOMAIN + `/customer/cart?id=${id}`, }); let index = saveCart.indexOf("green"); if (index !== -1) { saveCart.splice(index, 1); } localStorage.setItem("saveCart", JSON.stringify(saveCart)); } catch (e) { console.log("Я не смог добавить тариф в корзину :( " + id); } }); } else { localStorage.setItem("saveCart", "[]"); } }; const outCart = (cart: string[]) => { //Сделаем муторно и подольше, зато при прерывании сессии данные потеряются минимально cart.forEach(async (id: string) => { try { await makeRequest({ method: "DELETE", url: process.env.REACT_APP_DOMAIN + `/customer/cart?id=${id}`, }); let saveCart = JSON.parse(localStorage.getItem("saveCart") || "[]"); saveCart = saveCart.push(id); localStorage.setItem("saveCart", JSON.stringify(saveCart)); } catch (e) { console.log("Я не смог удалить из корзины тариф :("); } }); };