import React, { useState, useEffect } from 'react' import { View, Animated, StyleSheet, Platform, I18nManager, TouchableOpacity, ActivityIndicator } from 'react-native' import { useUtils, useLanguage, useOrder } from 'ordering-components/native' import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons' import MaterialIcons from 'react-native-vector-icons/MaterialIcons' import Picker from 'react-native-country-picker-modal'; import { Accordion, AccordionSection, ProductInfo, ProductQuantity, ContentInfo, ProductImage, AccordionContent, ProductOptionsList, ProductOption, ProductSubOption, ProductComment, SelectItemBtn, SelectItem } 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 [alert, setAlert] = useState({ show: false }); const [isOpen, setIsOpen] = useState(false); const [optionSelected, setOptionSelected] = useState(null); let current; const pickerStyle = StyleSheet.create({ icon: { top: 15, right: Platform.OS === 'ios' ? 5 : (I18nManager.isRTL ? 30 : 0), position: 'absolute', fontSize: 20 }, itemSelected: { backgroundColor: theme.colors.disabled, }, closeBtn: { width: 40, height: 40, } }) 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) => { setOptionSelected(value) 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() } }) const isProductUnavailable = ( (isCartProduct && !isCartPending && product?.valid_menu && !product?.valid_quantity) || (!product?.valid_menu && isCartProduct && !isCartPending) ) useEffect(() => { if (optionSelected === product.quantity.toString() && !orderState.loading) { setIsOpen(false) setOptionSelected(null) } }, [orderState]) return ( (!product?.valid_menu && isCartProduct) ? {} : setActiveState(!isActive)} activeOpacity={1} > {isCartProduct && !isCartPending && getProductMax && !isProductUnavailable ? ( setIsOpen(false)} withCountryNameButton // @ts-ignore closeButtonStyle={{ width: '100%', alignItems: 'flex-end', padding: 10, }} closeButtonImageStyle={Platform.OS === 'ios' && pickerStyle.closeBtn} renderFlagButton={() => ( <> setIsOpen(true)} disabled={productOptions.length === 0 || orderState.loading} > {product.quantity.toString()} )} flatListProps={{ keyExtractor: (item: any) => item.value, data: productOptions || [], renderItem: ({ item }: any) => ( handleChangeQuantity(item.value)} > {optionSelected === item.value && orderState.loading && ( )} {item.label} ), }} /> ) : ( {product?.quantity} )} {product?.images && ( )} {product.name} {isProductUnavailable && ( {t('NOT_AVAILABLE', 'Not available')} )} {!isProductUnavailable && ( {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 && ( setAlert({ show: true, title: t('DELETE_PRODUCT', 'Delete Product'), onAccept: () => { onDeleteProduct && onDeleteProduct(product) setAlert({ show: false }) }, content: [t('QUESTION_DELETE_PRODUCT', 'Are you sure that you want to delete the product?')] })} /> )} {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} )} setAlert({ show: false })} onCancel={() => setAlert({ show: false })} content={alert.content} /> ) } const styles = StyleSheet.create({ productImage: { borderRadius: 10, width: 75, height: 75 } })