import { CustomPrivilege, Privilege, useThrottle } from "@frontend/kitui"; import { Box, 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 { setCustomTariffsUserValue, useCustomTariffsStore } from "@root/stores/customTariffs"; import { useUserStore } from "@root/stores/user"; import { getDeclension } from "@root/utils/declension"; import { useCartTariffs } from "@root/utils/hooks/useCartTariffs"; import { useEffect, useState } from "react"; import { useDebouncedCallback } from "use-debounce"; const sliderSettingsByType = { день: { max: 365, min: 0 }, шаблон: { max: 5000, min: 0 }, МБ: { max: 5000, min: 0 }, заявка: { max: 5000, min: 0 } }; type PrivilegeName = "день" | "шаблон" | "МБ" | "заявка"; interface Props { privilege: CustomPrivilege; } 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]) ?? sliderSettingsByType[privilege.value]?.min; const purchasesAmount = useUserStore((state) => state.userAccount?.wallet.spent) ?? sliderSettingsByType[privilege.value]?.min; const cartTariffs = useCartTariffs(); const [value, setValue] = useState(userValue); const throttledValue = useThrottle(value, 200); useEffect( function setStoreValue() { setCustomTariffsUserValue( cartTariffs ?? [], privilege.serviceKey, privilege._id, throttledValue, purchasesAmount, ); }, [cartTariffs, purchasesAmount, privilege._id, privilege.serviceKey, throttledValue] ); function handleSliderChange(measurement: PrivilegeName) { return (value: number | number[]) => { if (Number(value) < Number(sliderSettingsByType[measurement]?.min)) { setValue(0); return; } if (Array.isArray(value)) throw new Error("Slider uses multiple values instead of one"); setValue(value); }; } const quantityText = `${value} ${getDeclension(value, privilege.value)}`; const setNotSmallNumber = useDebouncedCallback(() => { if (value === sliderSettingsByType[privilege.value]?.min) return; if (Number(value) < Number(sliderSettingsByType[privilege.value]?.min)) { setValue(sliderSettingsByType[privilege.value]?.min); } if (privilege.value === "день" && Number(value) < 30 && Number(value) !== 0) { setValue(30); } if (privilege.value !== "день" && Number(value) < 100 && Number(value) !== 0) { setValue(100); } }, 600); const quantityElement = ( {quantityText} или { setValue(value); setNotSmallNumber(); }} /> ); const icon = privilege.type === "day" ? ( ) : ( ); return ( {privilege.description} {icon} {privilege.name} {upMd && quantityElement} {!upMd && quantityElement} ); }