2023-06-30 15:35:31 +00:00
|
|
|
|
import { useState } from "react";
|
2023-03-23 12:03:08 +00:00
|
|
|
|
import { useLocation } from "react-router-dom";
|
2023-07-25 22:31:04 +00:00
|
|
|
|
import { Box, Typography, useMediaQuery, useTheme } from "@mui/material";
|
2023-03-23 12:03:08 +00:00
|
|
|
|
import SectionWrapper from "@components/SectionWrapper";
|
2023-06-16 20:09:56 +00:00
|
|
|
|
import ComplexNavText from "@root/components/ComplexNavText";
|
|
|
|
|
import { useTariffs } from "@root/utils/hooks/useTariffs";
|
2023-06-30 15:35:31 +00:00
|
|
|
|
import { updateTariffs, useTariffStore } from "@root/stores/tariffs";
|
2023-06-16 20:09:56 +00:00
|
|
|
|
import { enqueueSnackbar } from "notistack";
|
2023-07-25 22:31:04 +00:00
|
|
|
|
import { Select } from "@root/components/Select";
|
|
|
|
|
import { Tabs } from "@root/components/Tabs";
|
2023-06-16 20:09:56 +00:00
|
|
|
|
import TariffCard from "./TariffCard";
|
|
|
|
|
import NumberIcon from "@root/components/NumberIcon";
|
|
|
|
|
import { currencyFormatter } from "@root/utils/currencyFormatter";
|
2023-07-13 18:59:23 +00:00
|
|
|
|
import { calcIndividualTariffPrices } from "@root/utils/calcTariffPrices";
|
2023-06-17 16:01:02 +00:00
|
|
|
|
import { getMessageFromFetchError } from "@frontend/kitui";
|
2023-06-26 16:13:29 +00:00
|
|
|
|
import FreeTariffCard from "./FreeTariffCard";
|
2023-07-14 13:41:31 +00:00
|
|
|
|
import { addTariffToCart, useUserStore } from "@root/stores/user";
|
2023-07-10 20:22:06 +00:00
|
|
|
|
import { useDiscountStore } from "@root/stores/discounts";
|
2023-07-11 01:33:36 +00:00
|
|
|
|
import { useCustomTariffsStore } from "@root/stores/customTariffs";
|
2023-07-25 22:31:04 +00:00
|
|
|
|
import { Slider } from "./slider";
|
2023-07-14 13:41:31 +00:00
|
|
|
|
import { useCartStore } from "@root/stores/cart";
|
2023-06-16 20:09:56 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const subPages = ["Шаблонизатор", "Опросник", "Сокращатель ссылок"];
|
2023-03-23 12:03:08 +00:00
|
|
|
|
|
2023-06-16 20:09:56 +00:00
|
|
|
|
export default function TariffPage() {
|
|
|
|
|
const theme = useTheme();
|
|
|
|
|
const upMd = useMediaQuery(theme.breakpoints.up("md"));
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const isMobile = useMediaQuery(theme.breakpoints.down(600));
|
2023-06-16 20:09:56 +00:00
|
|
|
|
const location = useLocation();
|
|
|
|
|
const tariffs = useTariffStore(state => state.tariffs);
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const [selectedItem, setSelectedItem] = useState<number>(0);
|
2023-07-10 20:22:06 +00:00
|
|
|
|
const discounts = useDiscountStore(state => state.discounts);
|
2023-07-13 18:59:23 +00:00
|
|
|
|
const customTariffs = useCustomTariffsStore(state => state.customTariffsMap);
|
2023-07-14 13:41:31 +00:00
|
|
|
|
const purchasesAmount = useUserStore(state => state.userAccount?.wallet.purchasesAmount) ?? 0;
|
|
|
|
|
const cart = useCartStore(state => state.cart);
|
2023-06-16 20:09:56 +00:00
|
|
|
|
const unit: string = String(location.pathname).slice(9);
|
2023-03-23 12:03:08 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const StepperText: Record<string, string> = {
|
|
|
|
|
volume: "Тарифы на объём",
|
|
|
|
|
time: "Тарифы на время",
|
|
|
|
|
};
|
2023-06-30 15:35:31 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
useTariffs({
|
|
|
|
|
apiPage: 0,
|
|
|
|
|
tariffsPerPage: 100,
|
|
|
|
|
onNewTariffs: updateTariffs,
|
|
|
|
|
onError: (error) => {
|
|
|
|
|
const errorMessage = getMessageFromFetchError(error);
|
|
|
|
|
if (errorMessage) enqueueSnackbar(errorMessage);
|
|
|
|
|
},
|
|
|
|
|
});
|
2023-03-23 12:03:08 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
function handleTariffItemClick(tariffId: string) {
|
|
|
|
|
addTariffToCart(tariffId)
|
|
|
|
|
.then(() => {
|
|
|
|
|
enqueueSnackbar("Тариф добавлен в корзину");
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
const message = getMessageFromFetchError(error);
|
|
|
|
|
if (message) enqueueSnackbar(message);
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-06-26 16:13:29 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const filteredTariffs = tariffs.filter((tariff) => {
|
|
|
|
|
return (
|
|
|
|
|
tariff.privilegies.map((p) => p.type).includes("day") ===
|
|
|
|
|
(unit === "time") && !tariff.isDeleted
|
|
|
|
|
);
|
|
|
|
|
});
|
2023-06-26 16:13:29 +00:00
|
|
|
|
|
2023-07-25 22:31:04 +00:00
|
|
|
|
const tariffElements = filteredTariffs.map((tariff, index) => {
|
|
|
|
|
const { price, tariffPriceAfterDiscounts } = calcIndividualTariffPrices(
|
|
|
|
|
tariff,
|
|
|
|
|
discounts,
|
|
|
|
|
customTariffs,
|
|
|
|
|
purchasesAmount,
|
|
|
|
|
cart
|
|
|
|
|
);
|
2023-06-26 16:13:29 +00:00
|
|
|
|
|
2023-06-16 20:09:56 +00:00
|
|
|
|
return (
|
2023-07-25 22:31:04 +00:00
|
|
|
|
<TariffCard
|
|
|
|
|
key={tariff._id}
|
|
|
|
|
icon={
|
|
|
|
|
<NumberIcon
|
|
|
|
|
number={index + 1}
|
|
|
|
|
color={unit === "time" ? "#7E2AEA" : "#FB5607"}
|
|
|
|
|
backgroundColor={unit === "time" ? "#EEE4FC" : "#FEDFD0"}
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
buttonProps={{
|
|
|
|
|
text: "Выбрать",
|
|
|
|
|
onClick: () => handleTariffItemClick(tariff._id),
|
|
|
|
|
}}
|
|
|
|
|
headerText={tariff.name}
|
|
|
|
|
text={tariff.privilegies.map((p) => `${p.name} - ${p.amount}`)}
|
|
|
|
|
price={
|
|
|
|
|
<>
|
|
|
|
|
{price !== undefined && price !== tariffPriceAfterDiscounts && (
|
|
|
|
|
<Typography variant="oldPrice">
|
|
|
|
|
{currencyFormatter.format(price / 100)}
|
|
|
|
|
</Typography>
|
|
|
|
|
)}
|
|
|
|
|
{tariffPriceAfterDiscounts !== undefined && (
|
|
|
|
|
<Typography variant="price">
|
|
|
|
|
{currencyFormatter.format(tariffPriceAfterDiscounts / 100)}
|
|
|
|
|
</Typography>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
}
|
|
|
|
|
/>
|
2023-06-16 20:09:56 +00:00
|
|
|
|
);
|
2023-07-25 22:31:04 +00:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (tariffElements.length < 6)
|
|
|
|
|
tariffElements.push(<FreeTariffCard key="free_tariff_card" />);
|
|
|
|
|
else tariffElements.splice(5, 0, <FreeTariffCard key="free_tariff_card" />);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<SectionWrapper
|
|
|
|
|
maxWidth="lg"
|
|
|
|
|
sx={{
|
|
|
|
|
mt: "20px",
|
|
|
|
|
mb: upMd ? "90px" : "63px",
|
|
|
|
|
display: "flex",
|
|
|
|
|
flexDirection: "column",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{upMd && (
|
|
|
|
|
<ComplexNavText text1="Все тарифы — " text2={StepperText[unit]} />
|
|
|
|
|
)}
|
|
|
|
|
<Typography variant="h4" sx={{ marginBottom: "23px", mt: "20px" }}>
|
|
|
|
|
{StepperText[unit]}
|
|
|
|
|
</Typography>
|
|
|
|
|
{isMobile ? (
|
|
|
|
|
<Select
|
|
|
|
|
items={subPages}
|
|
|
|
|
selectedItem={selectedItem}
|
|
|
|
|
setSelectedItem={setSelectedItem}
|
|
|
|
|
/>
|
|
|
|
|
) : (
|
|
|
|
|
<Tabs
|
|
|
|
|
items={subPages}
|
|
|
|
|
selectedItem={selectedItem}
|
|
|
|
|
setSelectedItem={setSelectedItem}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
<Box
|
|
|
|
|
sx={{
|
|
|
|
|
mt: "40px",
|
|
|
|
|
mb: "30px",
|
|
|
|
|
display: "grid",
|
|
|
|
|
gap: "40px",
|
|
|
|
|
gridTemplateColumns: "repeat(auto-fit, minmax(300px, 360px))",
|
|
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
{tariffElements}
|
|
|
|
|
</Box>
|
|
|
|
|
<Typography variant="h4" sx={{ mt: "50px", mb: "40px" }}>
|
|
|
|
|
Ранее вы покупали
|
|
|
|
|
</Typography>
|
|
|
|
|
<Slider items={tariffElements} />
|
|
|
|
|
</SectionWrapper>
|
|
|
|
|
);
|
2023-06-01 13:42:38 +00:00
|
|
|
|
}
|