@open-tender/ui
Version:
A component library for use with the Open Tender web app
79 lines (78 loc) • 4.92 kB
JavaScript
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;