woocommerce/plugins/woocommerce-blocks/assets/js/blocks/cart-checkout/cart/full-cart/cart-line-item-row.js

90 lines
2.5 KiB
JavaScript
Raw Normal View History

Cart block: line-items front end initial work (https://github.com/woocommerce/woocommerce-blocks/pull/1333) * render block on front end, add `Shopping cart` heading (baby steps) * fake data for editing full cart + show line count in header * add note about core/html using `is-active` class for toggle state * reinstate work-in-progress full cart component (lost in rebase) * reinstate full cart from master * component for full cart title & item count + margin tweaks: - add margin between main cart & sidebar - add margin after cart block * add cart items sample data + factor sample product image to module * use sample cart data for item count * basic table of cart line items (no styling) * prettification * show images for cart line items + initial table styling * cart quantity selector component (work in progress) * use state for cart product quantity, allow incr/decr from UI (WIP) * replace WIP custom quantity control with number edit (temporary) * correctly format cart line item total price * align cart item columns with headings + indent image on desktop * tweak css for cart line item padding on mobile so it's more explicit * show cart line item full price if discounted * add placeholder for cart remove item link * switch cart table to flex layout (was table)… This will allow us to move things around for mobile/responsive layout. * only show cart items table header on desktop * more cart items styling - row borders, appropriate padding + + move image width to variable + fix class name plurality for row (item not items) * use standard $gap instead of 1em for padding/margins * responsive (mobile) layout for cart line items: - shift line $ total to bottom right - stack quantity selector in product info column * remove extraneous cart table padding on mobile * comment about unused styles for quantity selector component * add follow up issue for todo * remove inappropriate href * render srcset & sizes for cart line item product image * remove todo comment * switch back to table markup for cart items (in progress): - table is more semantic, associates headers with columns * cart line items column widths - product column is larger (60%) * reinstate table row borders * bottom-align line item price on mobile * cart contents heading should be H2 + prettify * remove unused QuantitySelector code/styles, rename main class in line with BEM * defaults for QuantitySelector props * variable/property name tidies - match conventions/API * fix bug: line total price is only bottom-align on small screen * move QuantitySelector to root of components, intended to be generally useful * use lineItem directly for cart, specify shape in PropTypes * rename cart components to align with "line item" rather than "product" * rejig class names to better align with new component names & BEM style * show cart item image correct size: - use single column for product image and info, with flex container - specify image width (rem instead of px) * fix safari issue - cart product images displaying vertically stretched * shift product name left margin from image, to account for no-image case * experiment: bump bundlewatch size limit for cart temporarily: - our fake data inline image is heavy - when we switch to real API we will no longer need it * fix issue introduced when moving margin from image to details div: - product details needs margin on left (not right) * fix react props issues: - explicitly destructure image props for srcSet (vs srcset) - use API key field for line item key instead of id, fix duplicate test id - CartLineItemsTable takes an array of lineItems (incorrect PropTypes) * remove redundant divs + use conventional `null` (when no full price) * override editor styles to ensure cart product image is correct size * move cart items editor style override to editor.css * add an explicit readable heading for cart heading to match visual layout
2020-01-09 22:50:14 +00:00
/**
* External dependencies
*/
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import PropTypes from 'prop-types';
import QuantitySelector from '@woocommerce/base-components/quantity-selector';
import FormattedMonetaryAmount from '@woocommerce/base-components/formatted-monetary-amount';
import { getCurrency } from '@woocommerce/base-utils';
const CartLineItemRow = ( { lineItem } ) => {
const { name, images, quantity, totals } = lineItem;
const { line_total: total, line_subtotal: subtotal } = totals;
const imageProps = {};
if ( images && images.length ) {
imageProps.src = lineItem.images[ 0 ].src || '';
imageProps.alt = lineItem.images[ 0 ].alt || '';
imageProps.srcSet = lineItem.images[ 0 ].srcset || '';
imageProps.sizes = lineItem.images[ 0 ].sizes || '';
}
const [ lineQuantity, setLineQuantity ] = useState( quantity );
const currency = getCurrency();
const isDiscounted = subtotal !== total;
const fullPrice = isDiscounted ? (
<div className="wc-block-cart-item__full-price">
<FormattedMonetaryAmount currency={ currency } value={ subtotal } />
</div>
) : null;
// We use this in two places so we can stack the quantity selector under
// product info on smaller screens.
const quantitySelector = ( className ) => {
return (
<QuantitySelector
className={ className }
quantity={ lineQuantity }
onChange={ setLineQuantity }
/>
);
};
return (
<tr>
<td className="wc-block-cart-item__product">
<div className="wc-block-cart-item__product-wrapper">
<img { ...imageProps } alt={ imageProps.alt } />
<div className="wc-block-cart-item__product-details">
{ name }
{ quantitySelector(
'wc-block-cart-item__quantity-stacked'
) }
</div>
</div>
</td>
<td className="wc-block-cart-item__quantity">
<div>
{ quantitySelector() }
<div className="wc-block-cart-item__remove-link">
{ __( 'Remove item', 'woo-gutenberg-products-block' ) }
</div>
</div>
</td>
<td className="wc-block-cart-item__total">
{ fullPrice }
<FormattedMonetaryAmount
currency={ currency }
value={ total }
/>
</td>
</tr>
);
};
CartLineItemRow.propTypes = {
lineItem: PropTypes.shape( {
name: PropTypes.string.isRequired,
images: PropTypes.array.isRequired,
quantity: PropTypes.number.isRequired,
totals: PropTypes.shape( {
line_subtotal: PropTypes.string.isRequired,
line_total: PropTypes.string.isRequired,
} ).isRequired,
} ),
};
export default CartLineItemRow;