import React, { type FunctionComponent } from 'react' import Icon from '../../atoms/Icon' import IconButton from '../../molecules/IconButton' import QuantitySelector from '../../molecules/QuantitySelector' import { Table, TableBody, TableCell, TableHead, TableRow, } from '../../molecules/Table' import Badge from '../../atoms/Badge' import type { PriceFormatter } from '../../atoms/Price' import Price from '../../atoms/Price' import Skeleton from '../../atoms/Skeleton' import { useUI } from '../../hooks' import Alert from '../../molecules/Alert' import Tooltip from '../../molecules/Tooltip' import { useQuickOrderDrawer, type VariationProductColumn, } from './provider/QuickOrderDrawerProvider' type ImageComponentType = FunctionComponent<{ src: string alt: string width?: number height?: number loading?: 'eager' | 'lazy' }> // TODO: Replace with faststore Image component in final implementation // This is a temporary reference component for storybook preview const DefaultImageComponent: ImageComponentType = ({ src, alt, width, height, ...otherProps }) => {alt} export type QuickOrderDrawerProductsProps = { columns: VariationProductColumn formatter?: PriceFormatter ImageComponent?: ImageComponentType /** * Messages for CMS configuration */ messages?: { alertAriaLabel?: string tableAriaLabel?: string quantityUpdatedTooltip?: string quantityUpdatedAriaLabel?: string outOfStockLabel?: string availableLabel?: string selectQuantityAriaLabel?: string removeProductAriaLabel?: string invalidQuantityTitle?: string invalidQuantityMessage?: ( min: number, max: number, quantity: number ) => string emptyStateTitle?: string emptyStateMessage?: string } } const QuickOrderDrawerProducts = ({ columns, formatter, ImageComponent = DefaultImageComponent, messages, }: QuickOrderDrawerProductsProps) => { const { pushToast } = useUI() const { products, onChangeQuantityItem, onDelete, isLoading, alertMessage, setAlertMessage, formatter: contextFormatter, } = useQuickOrderDrawer() const priceFormatter = formatter || contextFormatter const showSkeleton = isLoading return (
<> {!isLoading && alertMessage && ( } dismissible onClick={() => setAlertMessage('')} aria-label={messages?.alertAriaLabel} > {alertMessage} )} {columns.name} {columns.availability.label} {columns.price} {columns.quantity} {showSkeleton ? ( <> {Array.from({ length: 5 }).map((_, index) => { return ( {Array.from({ length: 5, }).map((_, cellIndex) => { return ( ) })} ) })} ) : products.length > 0 ? ( <> {products.map((variantProduct) => (
{variantProduct.name}
{variantProduct.id}
{variantProduct.availability === 'available' && variantProduct.quantityUpdated && ( } /> )}
{columns.availability.stockDisplaySettings === 'showAvailability' && ( {variantProduct.availability === 'outOfStock' ? messages?.outOfStockLabel : messages?.availableLabel} )} {columns.availability.stockDisplaySettings === 'showStockQuantity' && variantProduct.inventory}
onChangeQuantityItem(variantProduct.id, value) } aria-label={messages?.selectQuantityAriaLabel?.replace( '{productName}', variantProduct.name )} onValidateBlur={( min: number, maxValue: number, quantity: number ) => { const title = messages?.invalidQuantityTitle const message = messages?.invalidQuantityMessage ? messages.invalidQuantityMessage( min, maxValue, quantity ) : '' pushToast({ title, message, status: 'INFO', icon: ( ), }) }} />
onDelete(variantProduct.id)} icon={} aria-label={messages?.removeProductAriaLabel?.replace( '{productName}', variantProduct.name )} />
))} ) : ( )} >

{messages?.emptyStateTitle}

{messages?.emptyStateMessage}

)}
) } export default QuickOrderDrawerProducts