UNPKG

@open-tender/ui

Version:

A component library for use with the Open Tender web app

79 lines (78 loc) 4.92 kB
import { makeModifierNamesForGroups } from '@open-tender/utils'; import { Minus, Plus, PlusCircle } from 'iconoir-react'; import React from 'react'; import { makeImageProps, makeProps } from '../utils'; import Button from './Button'; import Text from './Text'; import View from './View'; const ItemOption = ({ config, handlers, group, option, apiUrl, placeholder }) => { const { name, // description, isSoldOut, price, cals, // tags, // allergens, // optionGroups, // showImage, // showDescription, // allergenAlert, isRadio, // showGroups, toggle, increment, decrement, // decrementDisabled, // updatedLevels, groupAtMax, // oneOnly, imageUrl, quantity, optionAtMax } = option; const imageProps = makeImageProps(config, 'itemOption__image', imageUrl, apiUrl, placeholder); const disabled = isSoldOut || (group.max !== 1 && groupAtMax && quantity === 0); const selected = quantity > 0; const nestedGroups = selected && option.groups.length ? option.groups : null; const nestedRequired = option.groups.filter(i => i.quantity < i.min).length > 0; const nestedText = nestedRequired ? 'Selections Required' : 'Adjust Selections'; const nestedOptions = nestedGroups ? makeModifierNamesForGroups(nestedGroups) : null; const onClick = () => { if (isRadio || (group.max === 1 && quantity === 0)) { toggle(); } else if ((group.max === 1 || option.max === 1) && quantity === 1) { decrement(); } else { increment(); } }; return (React.createElement(View, Object.assign({}, makeProps(config, 'itemOption')), React.createElement(View, Object.assign({}, makeProps(config, nestedRequired && !selected ? 'itemOption__containerRequired' : selected ? 'itemOption__containerSelected' : 'itemOption__container')), selected && (React.createElement(React.Fragment, null, React.createElement(Button, Object.assign({}, makeProps(config, 'itemOption__decrease'), { onClick: decrement, disabled: quantity <= 0 }), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__decreaseIcon')), React.createElement(Minus, { width: 24, height: 24, strokeWidth: 2 }))), React.createElement(Button, Object.assign({}, makeProps(config, 'itemOption__increase'), { onClick: increment, disabled: groupAtMax || optionAtMax }), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__increaseIcon')), React.createElement(Plus, { width: 24, height: 24, strokeWidth: 2 }))))), React.createElement(Button, Object.assign({}, makeProps(config, 'itemOption__button'), { onClick: onClick, disabled: disabled }), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__quantityContainer')), selected && (React.createElement(Text, Object.assign({}, makeProps(config, 'itemOption__quantity'), { text: `${quantity}` })))), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__imageContainer')), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__imageWrapper')), React.createElement(View, Object.assign({}, imageProps)))), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__nameContainer')), React.createElement(Text, Object.assign({}, makeProps(config, 'itemOption__name'), { text: name })), React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__priceContainer')), React.createElement(Text, Object.assign({}, makeProps(config, 'itemOption__price'), { text: price || ' ' })), cals && (React.createElement(Text, Object.assign({}, makeProps(config, 'itemOption__cals'), { text: `${cals} cals` })))))), nestedGroups && (React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__groups')), nestedOptions && (React.createElement(View, Object.assign({}, makeProps(config, 'itemOption__groupsOptions')), React.createElement(Text, Object.assign({}, makeProps(config, 'itemOption__groupsOptionNames'), { text: nestedOptions })))), React.createElement(Button, Object.assign({}, makeProps(config, nestedRequired ? 'itemOption__groupsButtonRequired' : 'itemOption__groupsButton'), { onClick: handlers.showNested, disabled: !selected, text: nestedText, iconDisplay: "before", icon: React.createElement(PlusCircle, { width: 18, height: 18, strokeWidth: 1.5 }) }))))))); }; export default ItemOption;