import { useThrottle } from "@frontend/kitui"; import { Box, SliderProps, Typography, useMediaQuery, useTheme } from "@mui/material"; import CustomSlider from "@root/components/CustomSlider"; import NumberInputWithUnitAdornment from "@root/components/NumberInputWithUnitAdornment"; import CalendarIcon from "@root/components/icons/CalendarIcon"; import PieChartIcon from "@root/components/icons/PieChartIcon"; import { Privilege, PrivilegeValueType } from "@root/model/privilege"; import { useCartStore } from "@root/stores/cart"; import { setCustomTariffsUserValue, useCustomTariffsStore } from "@root/stores/customTariffs"; import { useDiscountStore } from "@root/stores/discounts"; import { useUserStore } from "@root/stores/user"; import { getDeclension } from "@root/utils/declension"; import { useEffect, useState } from "react"; const sliderSettingsByType: Record> = { "день": { max: 365, step: 1, }, "шаблон": { max: 1000000, step: 1000, }, "МБ": { max: 1000000, step: 1000, }, }; interface Props { privilege: Privilege; } export default function TariffPrivilegeSlider({ privilege }: Props) { const theme = useTheme(); const upMd = useMediaQuery(theme.breakpoints.up("md")); const userValue = useCustomTariffsStore(state => state.userValuesMap[privilege.serviceKey]?.[privilege._id]) ?? 0; const discounts = useDiscountStore(state => state.discounts); const currentCartTotal = useCartStore(state => state.cart.priceAfterDiscounts); const purchasesAmount = useUserStore(state => state.userAccount?.wallet.purchasesAmount) ?? 0; const [value, setValue] = useState(userValue); const throttledValue = useThrottle(value, 200); useEffect(function setStoreValue() { setCustomTariffsUserValue( privilege.serviceKey, privilege._id, throttledValue, discounts, currentCartTotal, purchasesAmount ); }, [currentCartTotal, discounts, purchasesAmount, privilege._id, privilege.serviceKey, throttledValue]); function handleSliderChange(event: Event, value: number | number[]) { if (Array.isArray(value)) throw new Error("Slider uses multiple values instead of one"); setValue(value); } const quantityText = `${value} ${getDeclension(value, privilege.value)}`; const quantityElement = ( {quantityText} или setValue(value)} /> ); const icon = privilege.type === "day" ? : ; return ( {privilege.description} {icon} {privilege.name} {upMd && quantityElement} {!upMd && quantityElement} ); }