import SectionWrapper from "@components/SectionWrapper"; import { Tariff, calcTariffPrice, getMessageFromFetchError, } from "@frontend/kitui"; import ArrowBackIcon from "@mui/icons-material/ArrowBack"; import { Box, IconButton, Typography, useMediaQuery, useTheme, } from "@mui/material"; import NumberIcon from "@root/components/NumberIcon"; import { useTariffStore } from "@root/stores/tariffs"; import { addTariffToCart, useUserStore } from "@root/stores/user"; import { currencyFormatter } from "@root/utils/currencyFormatter"; import { handleComponentError } from "@root/utils/handleComponentError"; import { usePrevLocation } from "@root/utils/hooks/handleCustomBackNavigation"; import { useCartTariffs } from "@root/utils/hooks/useCartTariffs"; import { enqueueSnackbar } from "notistack"; import { useState } from "react"; import { withErrorBoundary } from "react-error-boundary"; import { useLocation } from "react-router-dom"; import FreeTariffCard from "./FreeTariffCard"; import TariffCard from "./TariffCard"; import { useDiscounts } from "@root/api/price"; import { Select } from "@components/Select"; import { Tabs } from "@components/Tabs"; import { ModalRequestCreate } from "./ModalRequestCreate"; const subPagesTime = ["Базовый тариф PenaQuiz", 'Убрать логотип "PenaQuiz"']; const subPagesVolume = ["Заявки квиз", 'Заказать создание квиза']; const StepperText: Record = { volume: "Тарифы на объём", time: "Тарифы на время", }; function TariffPage() { const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); const isMobile = useMediaQuery(theme.breakpoints.down(600)); const isTablet = useMediaQuery(theme.breakpoints.down(1000)); const location = useLocation(); const tariffs = useTariffStore((state) => state.tariffs); const [selectedItemTime, setSelectedItemTime] = useState(0); const [selectedItemVolume, setSelectedItemVolume] = useState(0); const [isRequestCreate, setIsRequestCreate] = useState(false); const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.spent) ?? 0; const userId = useUserStore((state) => state.user?._id) ?? ""; const userPrivilegies = useUserStore(store => store); const discounts = useDiscounts(userId); const isUserNko = useUserStore((state) => state.userAccount?.status) === "nko"; const currentTariffs = useCartTariffs(); const handleCustomBackNavigation = usePrevLocation(location); const unit: string = String(location.pathname).slice(9); function handleTariffItemClick(tariffId: string) { addTariffToCart(tariffId) .then(() => { enqueueSnackbar("Тариф добавлен в корзину"); }) .catch((error) => { const message = getMessageFromFetchError(error); if (message) enqueueSnackbar(message); }); } const filteredTariffs = tariffs.filter((tariff) => { if (tariff.privileges[0] === undefined || tariff.isDeleted || tariff.isCustom) return false; if (unit === "time") { if (selectedItemTime === 0 && tariff.privileges[0].privilegeId === "quizUnlimTime") return true if (selectedItemTime === 1 && tariff.privileges[0].privilegeId === "squizHideBadge") return true } if (unit === "volume") { if (selectedItemVolume === 0 && tariff.privileges[0].privilegeId === "quizCnt") return true if (selectedItemVolume === 1 && tariff.privileges[0].privilegeId === "quizManual") return true } return false; }); const createTariffElements = ( filteredTariffs: Tariff[], addFreeTariff = false ) => { const tariffElements = filteredTariffs .filter((tariff) => tariff.privileges.length > 0) .map((tariff, index) => { const { priceBeforeDiscounts, priceAfterDiscounts } = calcTariffPrice( tariff, discounts ?? [], purchasesAmount, currentTariffs ?? [], isUserNko, userId ); return ( } buttonProps={{ text: "Выбрать", onClick: () => handleTariffItemClick(tariff._id), }} headerText={tariff.name} text={tariff.description || ""} price={ <> {priceBeforeDiscounts !== priceAfterDiscounts && ( {currencyFormatter.format( Math.trunc(priceBeforeDiscounts) / 100 )} )} {currencyFormatter.format( Math.trunc(priceAfterDiscounts) / 100 )} } /> ); }); if (addFreeTariff) { if (tariffElements.length < 6) tariffElements.push(); else tariffElements.splice(5, 0, ); } return tariffElements; }; return ( {isMobile && ( )} {StepperText[unit]} {unit === "time" && ( <> {isMobile ? ( ) : ( )} )} {createTariffElements(filteredTariffs, true)} {/*{recentlyPurchased.length > 0 && (*/} {/* <>*/} {/* */} {/* Ранее вы*/} {/* */} {/* */} {/* */} {/*)}*/} setIsRequestCreate(false)}/> ); } export default withErrorBoundary(TariffPage, { fallback: ( Ошибка загрузки тарифов ), onError: handleComponentError, });