import { basketApi, useUpdateQuantityMutation } from '@akinon/next/data/client/basket'; import { useAppDispatch } from '@akinon/next/redux/hooks'; import { BasketItem as BasketItemType } from '@akinon/next/types'; import { Price, Button, Icon, Modal, Select, Link } from '@theme/components'; import { useState } from 'react'; import { useAddFavoriteMutation } from '@akinon/next/data/client/wishlist'; import { useCommonProductAttributes, useLocalization, useToast } from '@akinon/next/hooks'; import PluginModule, { Component } from '@akinon/next/components/plugin-module'; import { Image } from '@akinon/next/components/image'; import clsx from 'clsx'; import { pushRemoveFromCart } from '@theme/utils/gtm'; interface Props { basketItem?: BasketItemType; namespace?: string; } export const BasketItem = (props: Props) => { const { t } = useLocalization(); const { success, error: showError } = useToast(); const { basketItem, namespace } = props; const [updateQuantityMutation] = useUpdateQuantityMutation(); const dispatch = useAppDispatch(); const [isRemoveBasketModalOpen, setRemoveBasketModalOpen] = useState(false); const [addFavorite, { isLoading: addFavoriteLoading }] = useAddFavoriteMutation(); const [updateQuantityLoading, setUpdateQuantityLoading] = useState(false); const commonProductAttributes = useCommonProductAttributes({ attributes: basketItem.product.attributes_kwargs }); const updateQuantity = async ( productPk: number, quantity: number, attributes: object = {} ) => { const requestParams: { product: number; quantity: number; attributes: object; namespace?: string; } = { product: productPk, quantity, attributes }; if (namespace) { requestParams.namespace = namespace; } await updateQuantityMutation(requestParams) .unwrap() .then((data) => dispatch( basketApi.util.updateQueryData( 'getBasket', undefined, (draftBasket) => { Object.assign(draftBasket, data.basket); } ) ) ); }; const deleteProduct = async (productPk?: number) => { setUpdateQuantityLoading(true); try { await updateQuantity(basketItem.product.pk, 0, basketItem.attributes); pushRemoveFromCart(basketItem?.product); if (productPk) { await addFavorite(productPk); success(t('basket.card.modal.moved_to_favorites')); } else { success(t('basket.card.modal.removed')); } } catch (err) { showError(t('basket.card.modal.error')); } finally { setUpdateQuantityLoading(false); setRemoveBasketModalOpen(false); } }; return ( <>
  • {basketItem.product.name} {basketItem.product.name}
    {basketItem.product.name}
    {commonProductAttributes.map((attribute, index) => ( {attribute.name}:{' '} {attribute.value} ))}
    {parseFloat(basketItem.product.retail_price) > parseFloat(basketItem.product.price) && ( )} parseFloat(basketItem.product.price) ? 'text-secondary-500' : 'text-primary' )} value={basketItem.product.price} data-testid="basket-product-price" />
    setRemoveBasketModalOpen(true)} data-testid="basket-product-remove" />
  • {t('basket.card.modal.question')}

    ); };