import Area from '@components/common/Area.js'; import { useAppState } from '@components/common/context/app.js'; import { Skeleton } from '@components/common/ui/Skeleton.js'; import { useCartState } from '@components/frontStore/cart/CartContext.js'; import { Coupon, CouponState, CouponActions } from '@components/frontStore/Coupon.js'; import { CouponForm } from '@components/frontStore/CouponForm.js'; import { _ } from '@evershop/evershop/lib/locale/translate/_'; import { CircleX } from 'lucide-react'; import React from 'react'; const SkeletonValue: React.FC<{ children: React.ReactNode; loading?: boolean; className?: string; }> = ({ children, loading = false, className = '' }) => { if (!loading) { return <>{children}; } return ( {children} ); }; const Total: React.FC<{ total: string; totalTaxAmount: string; priceIncludingTax: boolean; loading?: boolean; }> = ({ total, totalTaxAmount, priceIncludingTax, loading = false }) => { return (
{(priceIncludingTax && (
{_('Total')}
({_('Inclusive of tax ${totalTaxAmount}', { totalTaxAmount })})
)) || {_('Total')}}
{total}
); }; const Tax: React.FC<{ showPriceIncludingTax: boolean; amount: string; loading?: boolean; }> = ({ showPriceIncludingTax, amount, loading = false }) => { if (showPriceIncludingTax) { return null; } return (
{_('Tax')}
{amount}
); }; const Subtotal: React.FC<{ subTotal: string; loading?: boolean }> = ({ subTotal, loading = false }) => { return (
{_('Sub total')}
{subTotal}
); }; const Discount: React.FC<{ discountAmount: string; coupon: string | undefined; loading?: boolean; }> = ({ discountAmount, coupon, loading = false }) => { if (!coupon) { return (
); } return (
{(state: CouponState, actions: CouponActions) => ( <>
{_('Discount(${coupon})', { coupon })} {!state.isLoading && ( { e.preventDefault(); await actions.removeCoupon(); }} > )}
{discountAmount} )}
); }; const Shipping: React.FC<{ method: string | undefined; cost: string | undefined; noShippingRequired: boolean; loading?: boolean; }> = ({ method, cost, noShippingRequired, loading = false }) => { return (
{noShippingRequired && ( <> {_('Shipping')} {_('No shipping required')} )} {method && !noShippingRequired && ( <> {_('Shipping (${method})', { method })}
{cost}
)} {!method && !noShippingRequired && ( <> {_('Shipping')} {_('Select shipping method')} )}
); }; const DefaultCartSummary: React.FC<{ loading: boolean; showPriceIncludingTax: boolean; noShippingRequired: boolean; subTotal: string; discountAmount: string; coupon: string | undefined; shippingMethod: string | undefined; shippingCost: string | undefined; taxAmount: string; total: string; }> = ({ loading, showPriceIncludingTax, noShippingRequired, subTotal, discountAmount, coupon, shippingMethod, shippingCost, taxAmount, total }) => (
); interface CartTotalSummaryProps { children?: (props: { loading: boolean; showPriceIncludingTax: boolean; noShippingRequired: boolean; subTotal: string; discountAmount: string; coupon: string | undefined; shippingMethod: string | undefined; shippingCost: string | undefined; taxAmount: string; total: string; }) => React.ReactNode; } function CartTotalSummary({ children }: CartTotalSummaryProps) { const { data: cart, loadingStates } = useCartState(); const { config: { tax: { priceIncludingTax } } } = useAppState(); const subTotal = priceIncludingTax ? cart?.subTotalInclTax?.text || '' : cart?.subTotal?.text || ''; const discountAmount = cart?.discountAmount?.text || ''; const coupon = cart?.coupon; const shippingMethod = cart?.shippingMethodName; const shippingCost = priceIncludingTax ? cart?.shippingFeeInclTax?.text || '' : cart?.shippingFeeExclTax?.text || ''; const taxAmount = cart?.totalTaxAmount?.text || ''; const total = cart?.grandTotal?.text || ''; return (
{children ? ( children({ loading: Object.values(loadingStates).some( (state) => state === true || (typeof state === 'string' && state !== null) ), showPriceIncludingTax: priceIncludingTax, noShippingRequired: cart?.noShippingRequired || false, subTotal, discountAmount, coupon, shippingMethod, shippingCost, taxAmount, total }) ) : ( state === true || (typeof state === 'string' && state !== null) )} showPriceIncludingTax={priceIncludingTax} noShippingRequired={cart?.noShippingRequired || false} subTotal={subTotal} discountAmount={discountAmount} coupon={coupon} shippingMethod={shippingMethod} shippingCost={shippingCost} taxAmount={taxAmount} total={total} /> )}
); } export { CartTotalSummary, DefaultCartSummary, Subtotal, Discount, Shipping, Tax, Total };