import React, { useState } from 'react' import { View, Animated, StyleSheet, Platform, I18nManager, TouchableOpacity } from 'react-native' import { useUtils, useLanguage, useOrder } from 'ordering-components/native' import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons' 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, isExpanded } = props const theme = useTheme(); const pickerStyle = StyleSheet.create({ inputAndroid: { color: theme.colors.textPrimary, borderWidth: 1, borderColor: theme.colors.border, borderRadius: 3, backgroundColor: theme.colors.white, height: 30, fontSize: 10, padding: 4, textAlign: 'center', }, inputIOS: { color: theme.colors.textPrimary, height: 30, borderWidth: 1, borderColor: theme.colors.border, borderRadius: 3, paddingHorizontal: 4, backgroundColor: theme.colors.white, fontSize: 10, textAlign: 'center' }, // viewContainer: { // color: theme.colors.textPrimary, // borderWidth: 1, // borderColor: theme.colors.border, // borderRadius: 3, // backgroundColor: theme.colors.white, // height: 30, // fontSize: 10, // padding: 4, // textAlign: 'center' // }, placeholder: { color: theme.colors.secundaryContrast, } }) const [, t] = useLanguage() const [orderState] = useOrder() const [{ parsePrice }] = useUtils() const [isActive, setActiveState] = useState(isExpanded) 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 toggleAccordion = () => { if ((!product?.valid_menu && isCartProduct)) return if (isActive) { Animated.timing(setHeight.height, { toValue: 100, duration: 500, easing: Easing.linear, useNativeDriver: false, }).start() } else { setHeightState({height: new Animated.Value(0)}) } }*/ 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}` } /*useEffect(() => { toggleAccordion() }, [isActive])*/ 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) || isExpanded ? {} : setActiveState(!isActive)} activeOpacity={1} > {product?.images && ( )} {product.name} {isCartProduct && !isCartPending && getProductMax ? ( null} /> ) : ( {product?.quantity + ' x'} )} {parsePrice(product.total || product.price)} {(productInfo().ingredients.length > 0 || productInfo().options.length > 0 || product.comment) && ( <> {!isExpanded && } )} {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} )} {onEditProduct && isCartProduct && !isCartPending && product?.valid_menu && ( onEditProduct(product)} style={{flexDirection: 'row', alignItems: 'center'}}> {t('EDIT', 'Edit')} )} {onDeleteProduct && isCartProduct && !isCartPending && ( onDeleteProduct(product)} > {t('REMOVE', 'Remove')} )} {((isCartProduct && !isCartPending && product?.valid_menu && !product?.valid_quantity) || (!product?.valid_menu && isCartProduct && !isCartPending)) && ( {t('NOT_AVAILABLE', 'Not available')} )} ) } const styles = StyleSheet.create({ productImage: { borderRadius: 3, width: 42, height: 42 } })