import React, { useState } from 'react' import { View, Animated, StyleSheet, Platform, I18nManager } from 'react-native' import { useUtils, useLanguage, useOrder } from 'ordering-components/native' import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons' import SimpleIcon from 'react-native-vector-icons/SimpleLineIcons' import RNPickerSelect from 'react-native-picker-select' import MaterialIcons from 'react-native-vector-icons/MaterialIcons' import { Accordion, AccordionSection, ProductInfo, ProductQuantity, ContentInfo, ProductImage, AccordionContent, ProductOptionsList, ProductOption, ProductSubOption, ProductComment } from './styles' import { OIcon, OText, OAlert } from '../shared' import { ProductItemAccordionParams } from '../../types' import { useTheme } from 'styled-components/native' export const ProductItemAccordion = (props: ProductItemAccordionParams) => { const { isCartPending, isCartProduct, product, changeQuantity, getProductMax, onDeleteProduct, onEditProduct, } = props const theme = useTheme(); const pickerStyle = StyleSheet.create({ inputAndroid: { color: theme.colors.secundaryContrast, borderWidth: 1, borderColor: 'transparent', backgroundColor: theme.colors.inputDisabled, width: 50, textAlign: I18nManager.isRTL ? 'right' : 'left' }, inputIOS: { color: theme.colors.secundaryContrast, paddingEnd: 20, height: 40, borderWidth: 1, borderColor: 'transparent', paddingHorizontal: 10, backgroundColor: theme.colors.inputDisabled, textAlign: I18nManager.isRTL ? 'right' : 'left' }, icon: { top: Platform.OS === 'ios' ? 10 : 15, right: Platform.OS === 'ios' ? 0 : (I18nManager.isRTL ? 30 : 7), position: 'absolute', fontSize: 20 }, placeholder: { color: theme.colors.secundaryContrast, } }) const [, t] = useLanguage() const [orderState] = useOrder() const [{ parsePrice }] = useUtils() const [isActive, setActiveState] = useState(false) const productInfo = () => { if (isCartProduct) { const ingredients = JSON.parse(JSON.stringify(Object.values(product.ingredients ?? {}))) let options = JSON.parse(JSON.stringify(Object.values(product.options ?? {}))) options = options.map((option: any) => { option.suboptions = Object.values(option.suboptions ?? {}) return option }) return { ...productInfo, ingredients, options } } return product } const handleChangeQuantity = (value: string) => { if(!orderState.loading){ if (parseInt(value) === 0) { onDeleteProduct && onDeleteProduct(product) } else { changeQuantity && changeQuantity(product, parseInt(value)) } } } const getFormattedSubOptionName = ({ quantity, name, position, price }: { quantity: number, name: string, position: string, price: number }) => { const pos = position ? `(${position})` : '' return `${quantity} x ${name} ${pos} +${price}` } const productOptions = getProductMax && [...Array(getProductMax(product) + 1),].map((_: any, opt: number) => { return { label: opt === 0 ? t('REMOVE', 'Remove') : opt.toString(), value: opt.toString() } }) return ( (!product?.valid_menu && isCartProduct) ? {} : setActiveState(!isActive)} activeOpacity={1} > {isCartProduct && !isCartPending && getProductMax ? ( } disabled={orderState.loading} /> ) : ( {product?.quantity} )} {product?.images && ( )} {product.name} {parsePrice(product.total || product.price)} {(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || product.comment) && ( )} {onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && ( onEditProduct(product)} /> )} {onDeleteProduct && isCartProduct && !isCartPending && ( onDeleteProduct(product)} > )} {((isCartProduct && !isCartPending && product?.valid_menu && !product?.valid_quantity) || (!product?.valid_menu && isCartProduct && !isCartPending)) && ( {t('NOT_AVAILABLE', 'Not available')} )} {productInfo().ingredients.length > 0 && productInfo().ingredients.some((ingredient: any) => !ingredient.selected) && ( {t('INGREDIENTS', 'Ingredients')} {productInfo().ingredients.map((ingredient: any) => !ingredient.selected && ( {t('NO', 'No')} {ingredient.name} ))} )} {productInfo().options.length > 0 && ( {productInfo().options.map((option: any, i: number) => ( {option.name} {option.suboptions.map((suboption: any) => ( {getFormattedSubOptionName({ quantity: suboption.quantity, name: suboption.name, position: (suboption.position !== 'whole') ? t(suboption.position.toUpperCase(), suboption.position) : '', price: parsePrice(suboption.price) })} ))} ))} )} {product.comment && ( {t('SPECIAL_COMMENT', 'Special Comment')} {product.comment} )} ) } const styles = StyleSheet.create({ productImage: { width: 60, height: 60, marginHorizontal: 5 } })