import theme from "@theme"; import { Button, Paper, Box, Typography, TableHead, TableRow, TableCell, TableBody, Table, Tooltip, Alert, Checkbox, FormControlLabel } from "@mui/material"; import Input from "@kitUI/input"; import { useCartStore } from "@root/stores/cart"; import { useState } from "react"; import { GridSelectionModel } from "@mui/x-data-grid"; import { testUser } from "@root/stores/mocks/user"; import { useDiscountStore } from "@root/stores/discounts"; import { calcCartData, createCartItem, findDiscountFactor, formatDiscountFactor } from "./calc"; import { useTariffStore } from "@root/stores/tariffs"; import { AnyDiscount, CartItemTotal } from "@root/model/cart"; import { findPrivilegeById } from "@root/stores/privileges"; interface Props { selectedTariffs: GridSelectionModel; } export default function Cart({ selectedTariffs }: Props) { const tariffs = useTariffStore(store => store.tariffs); const discounts = useDiscountStore(store => store.discounts); const cartTotal = useCartStore(state => state.cartTotal); const setCartTotal = useCartStore(store => store.setCartTotal); const [couponField, setCouponField] = useState(""); const [loyaltyField, setLoyaltyField] = useState(""); const [errorMessage, setErrorMessage] = useState(null); const [isNonCommercial, setIsNonCommercial] = useState(false); const cartRows = cartTotal?.items.map(cartItemTotal => { const privilege = findPrivilegeById(cartItemTotal.tariff.privilegeId); const service = privilege?.serviceKey; const serviceDiscount = service ? cartTotal.discountsByService[service] : null; const envolvedDiscountsElement = ( {cartItemTotal.envolvedDiscounts.map((discount, index, arr) => ( {index < arr.length - (serviceDiscount ? 0 : 1) && } ))} {serviceDiscount && } ); const totalIncludingServiceDiscount = cartItemTotal.totalPrice * (serviceDiscount?.target.factor || 1); return { id: cartItemTotal.tariff.id, tariffName: cartItemTotal.tariff.name, privilegeDesc: privilege?.description ?? "Привилегия не найдена", envolvedDiscounts: envolvedDiscountsElement, price: totalIncludingServiceDiscount, }; }); const cartDiscounts = cartTotal?.envolvedCartDiscounts; const cartDiscountsResultFactor = cartDiscounts && cartDiscounts?.length > 1 && cartDiscounts.reduce((acc, discount) => acc * findDiscountFactor(discount), 1); const envolvedCartDiscountsElement = cartDiscounts && ( {cartDiscounts?.map((discount, index, arr) => ( {index < arr.length - 1 && } ))}   {cartDiscountsResultFactor && `= ${formatDiscountFactor(cartDiscountsResultFactor)}`} ); function handleCalcCartClick() { const cartTariffs = tariffs.filter(tariff => selectedTariffs.includes(tariff.id)); const cartItems = cartTariffs.map(tariff => createCartItem(tariff)); let loyaltyValue = parseInt(loyaltyField); if (!isFinite(loyaltyValue)) loyaltyValue = 0; const activeDiscounts = discounts.filter(discount => !discount.disabled); const cartData = calcCartData({ user: testUser, purchasesAmount: loyaltyValue, cartItems, discounts: activeDiscounts, isNonCommercial, coupon: couponField, }); if (cartData instanceof Error) { setErrorMessage(cartData.message); return setCartTotal(null); } setErrorMessage(null); setCartTotal(cartData); } return ( корзина setIsNonCommercial(checked)} control={} label="НКО" sx={{ color: theme.palette.secondary.main, }} /> setCouponField(e.target.value)} InputProps={{ style: { backgroundColor: theme.palette.content.main, color: theme.palette.secondary.main, } }} InputLabelProps={{ style: { color: theme.palette.secondary.main } }} /> {cartTotal?.couponState && ( cartTotal.couponState === "applied" ? Купон применен! : Подходящий купон не найден! )} setLoyaltyField(e.target.value)} InputProps={{ style: { backgroundColor: theme.palette.content.main, color: theme.palette.secondary.main, } }} InputLabelProps={{ style: { color: theme.palette.secondary.main } }} /> {cartTotal?.items && cartTotal.items.length > 0 && <> Имя Описание Скидки стоимость {cartRows?.map(row => ( {row.tariffName} {row.privilegeDesc} {row.envolvedDiscounts} {row.price.toFixed(2)} ₽ ))}
Скидки корзины: {envolvedCartDiscountsElement} ИТОГО: {cartTotal?.totalPrice.toFixed(2)} ₽ } {errorMessage !== null && {errorMessage} }
); } function DiscountTooltip({ discount, cartItemTotal }: { discount: AnyDiscount; cartItemTotal?: CartItemTotal; }) { const discountText = formatDiscountFactor(findDiscountFactor(discount)); return ( Скидка: {discount?.name} {discount?.description} }> {discountText} ); }