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')}}
);
};
const Tax: React.FC<{
showPriceIncludingTax: boolean;
amount: string;
loading?: boolean;
}> = ({ showPriceIncludingTax, amount, loading = false }) => {
if (showPriceIncludingTax) {
return null;
}
return (
);
};
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) => (
<>
{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
};