import React, { useState, memo } from 'react' import classnames from 'classnames' import { Product } from '@dollarshaveclub/types' import { PriceAddButton } from '../Buttons/PriceAddButton' import { Tray } from '../Tray' import { TileOverlay } from '../ProductTileOverlay' import Imgix from 'react-imgix' type Props = Readonly<{ product: Product priceData?: PriceData onClickAdd?: (product: Product) => void handleShouldUpdateToRestock?: ( product: Product, shouldRestock: boolean ) => Promise onClickRemove?: (sku: string) => void onImgClick?: (product: Product) => void recommended?: string showAddAnimation?: boolean isAdded?: boolean isLoading?: boolean isSoldOut?: boolean isShowingOverlay?: boolean isLoadingOverlay?: boolean isAutoRestock?: boolean showSize?: boolean showPriceComparison?: boolean showBaseNameOnly: boolean dataTestId?: string childrenMiddle?: JSX.Element childrenBottom?: JSX.Element additionalButtonClasses?: string disabled?: boolean }> type PriceData = { formattedRetailPrice: string formattedPrice: string } const noop = () => {} const ProductTileBase: React.FunctionComponent = ({ product, priceData, onClickAdd, handleShouldUpdateToRestock, onClickRemove, onImgClick, recommended, showAddAnimation = false, isAdded = false, isLoading = false, isSoldOut = false, isShowingOverlay = false, isLoadingOverlay = false, isAutoRestock = false, showSize, showPriceComparison = false, showBaseNameOnly = false, dataTestId, childrenMiddle, childrenBottom, additionalButtonClasses, disabled = false, }) => { const productImage = product.assets.productTile.file.url const price = priceData?.formattedPrice const retailPrice = priceData?.formattedRetailPrice const buttonClasses = classnames('ui-price-btn--mb', additionalButtonClasses) const { newBadge } = product const [shouldRefocusButton, setShouldRefocusButton] = useState(false) const renderFrequencyText = () => { if (isAutoRestock) { return (
Auto-restock
) } else { return (
Get this once
) } } const handleShouldUpdateToRestockSubmit = (shouldRestock: boolean) => { if (!handleShouldUpdateToRestock) return setShouldRefocusButton(true) handleShouldUpdateToRestock(product, shouldRestock) } return (
{recommended && (
{recommended}
)} {newBadge ? ( New ) : (
)} onImgClick(product) : noop, }} />
{showBaseNameOnly ? ( {product.basename} ) : ( {[product.modifier, product.basename].join(' ')} )} {product.scent && (
{product.scent}
)} {showSize && (
{product.sizeNumber} {product.abbrSizeUnit}
)}
{childrenBottom}
{childrenMiddle || (price && onClickAdd && ( ))} {(!isAdded || isLoading || showAddAnimation) && showPriceComparison && (
Regular: {retailPrice}
)} {product.planEligible && handleShouldUpdateToRestock && isAdded && !showAddAnimation && !isLoading && renderFrequencyText()}
) } export const ProductTile = memo(ProductTileBase)