import React from 'react'
import {
ProductForm as ProductOptions,
useSession,
useLanguage,
useOrder,
useUtils
} from 'ordering-components/native'
import { ProductIngredient } from '../ProductIngredient'
import { ProductOption } from '../ProductOption'
import MaterialCommunityIcon from 'react-native-vector-icons/MaterialCommunityIcons'
import { View, TouchableOpacity, StyleSheet, Dimensions, ScrollView, I18nManager } from 'react-native'
import Icon from 'react-native-vector-icons/Feather';
import {
ProductHeader,
WrapHeader,
TopHeader,
WrapContent,
ProductTitle,
ProductDescription,
ProductEditions,
SectionTitle,
WrapperIngredients,
WrapperSubOption,
ProductComment,
ProductActions
} from './styles'
import { OButton, OIcon, OInput, OText } from '../shared'
import { ProductOptionSubOption } from '../ProductOptionSubOption'
import { NotFoundSource } from '../NotFoundSource'
import { Placeholder,PlaceholderLine,Fade } from 'rn-placeholder'
import { useTheme } from 'styled-components/native'
const windowHeight = Dimensions.get('window').height;
const windowWidth = Dimensions.get('window').width
export const ProductOptionsUI = (props: any) => {
const {
navigation,
editMode,
isSoldOut,
productCart,
increment,
decrement,
showOption,
maxProductQuantity,
errors,
handleSave,
handleChangeIngredientState,
handleChangeSuboptionState,
handleChangeCommentState,
productObject,
businessSlug
} = props
const theme = useTheme();
const [{ optimizeImage, parsePrice }] = useUtils()
const [, t] = useLanguage()
const [orderState] = useOrder()
const [{ auth }] = useSession()
const { product, loading, error } = productObject
const isError = (id: number) => {
let bgColor = theme.colors.white
if (errors[`id:${id}`]) {
bgColor = 'rgba(255, 0, 0, 0.05)'
}
if (isSoldOut || maxProductQuantity <= 0) {
bgColor = 'hsl(0, 0%, 72%)'
}
return bgColor
}
const handleSaveProduct = () => {
const isErrors = Object.values(errors).length > 0
if (!isErrors) {
handleSave && handleSave()
return
}
}
const handleRedirectLogin = (product : any) => {
navigation.navigate('Login', {product: {businessId: product?.businessId, id: product?.id, categoryId: product?.categoryId, slug: businessSlug} })
}
const saveErrors = orderState.loading || maxProductQuantity === 0 || Object.keys(errors).length > 0
return (
<>
{!error && (
{loading && !product ? (
) : (
<>
>
)}
{loading && !product ? (
) : (
<>
{product?.name || productCart.name}{' '}
{!!product?.calories && (
{product?.calories} cal
)}
{productCart.price ? parsePrice(productCart.price) : ''}
{product?.offer_price !== null && product?.in_offer && (
{parsePrice(product?.offer_price)}
)}
{(!!product?.estimated_person || (!!product?.sku && product?.sku !== '-1' && product?.sku !== '1')) && (
{
((product?.sku && product?.sku !== '-1' && product?.sku !== '1') || (productCart?.sku && productCart?.sku !== '-1' && productCart?.sku !== '1'))
&& <>{t('SKU', 'Sku')}{' '}{product?.sku || productCart?.sku}>
}
{!!product?.sku && product?.sku !== '-1' && product?.sku !== '1' && !!product?.estimated_person && (
<> · >
)}
{!!product?.estimated_person
&& <>{product?.estimated_person}{' '}{t('ESTIMATED_PERSONS', 'persons')}>
}
)}
>
)}
{product?.description || productCart?.description}
{product?.tags?.map((tag: any) => (
{tag?.image ? (
) : (
)}
{tag.name}
))}
{loading && !product ? (
<>
{[...Array(2)].map((item, i) => (
{[...Array(3)].map((item, i) => (
))}
))}
>
) : (
{product?.ingredients?.length > 0 && (
{t('INGREDIENTS', 'Ingredients')}
{product?.ingredients.map((ingredient: any) => (
))}
)}
{product?.extras?.map((extra: any) => extra.options.map((option: any) => {
const currentState = productCart.options[`id:${option.id}`] || {}
return (
{
showOption(option) && (
{
option.suboptions.map((suboption: any) => {
const currentState = productCart.options[`id:${option.id}`]?.suboptions[`id:${suboption.id}`] || {}
const balance = productCart.options[`id:${option.id}`]?.balance || 0
return suboption?.enabled ? (
) : null
})
}
)
}
)
}))}
{!product?.hide_special_instructions && (
{t('SPECIAL_COMMENT', 'Special comment')}
handleChangeCommentState({ target: { value: val } })}
isDisabled={!(productCart && !isSoldOut && maxProductQuantity)}
style={styles.comment}
/>
)}
)}
)}
{error && error.length > 0 && (
)}
{!loading && !error && product && (
{productCart && !isSoldOut && maxProductQuantity > 0 && (
{productCart.quantity}
= maxProductQuantity || isSoldOut}
>
= maxProductQuantity || isSoldOut ? theme.colors.backgroundGray : theme.colors.backgroundDark}
/>
)}
{productCart && !isSoldOut && maxProductQuantity > 0 && auth && orderState.options?.address_id && (
handleSaveProduct()}
imgRightSrc=''
text={`${orderState.loading ? t('LOADING', 'Loading') : editMode ? t('UPDATE', 'Update') : t('ADD_TO_CART', 'Add to Cart')} ${productCart.total ? parsePrice(productCart?.total) : ''}`}
textStyle={{ color: saveErrors ? theme.colors.primary : theme.colors.white }}
style={{
backgroundColor: saveErrors ? theme.colors.white : theme.colors.primary,
opacity: saveErrors ? 0.3 : 1
}}
/>
)}
{auth && !orderState.options?.address_id && (
orderState.loading ? (
) : (
navigation.navigate('AddressList')}
/>
)
)}
{(!auth || isSoldOut || maxProductQuantity <= 0) && (
handleRedirectLogin(productCart)}
text={isSoldOut || maxProductQuantity <= 0 ? t('SOLD_OUT', 'Sold out') : t('LOGIN_SIGNUP', 'Login / Sign Up')}
imgRightSrc=''
textStyle={{ color: theme.colors.primary }}
style={{ borderColor: theme.colors.primary, backgroundColor: theme.colors.white }}
/>
)}
)}
>
)
}
const styles = StyleSheet.create({
mainContainer: {
flex: 1,
height: windowHeight
},
headerItem: {
overflow: 'hidden',
borderRadius: 50,
backgroundColor: '#CCCCCC80',
width: 35,
margin: 15
},
optionContainer: {
marginBottom: 20
},
comment: {
borderWidth: 1,
borderRadius: 0,
borderBottomLeftRadius: 10,
borderBottomRightRadius: 10,
borderColor: '#DBDCDB',
height: 160,
alignItems: 'flex-start',
},
quantityControl: {
flexDirection: 'row',
width: '30%',
justifyContent: 'space-between',
alignItems: 'center',
flex: 1,
marginRight: 10
},
btnBackArrow: {
borderWidth: 0,
color: '#FFF',
backgroundColor: 'rgba(0,0,0,0.3)',
borderRadius: 24,
marginRight: 15,
},
productHeaderSkeleton: {
flexDirection: 'row',
width: '100%',
position: 'relative',
maxHeight: 260,
height: 260,
resizeMode: 'cover',
minHeight: 200,
zIndex: 0
},
regularPriceStyle: {
fontSize: 14,
color: '#808080',
textDecorationLine: 'line-through',
marginLeft: 7,
marginRight: 7
},
caloriesStyle: {
color: '#808080'
},
productTagWrapper: {
flexDirection: 'row',
alignItems: 'center'
},
productTagImageStyle: {
width: 32,
height: 32,
borderRadius: 8,
resizeMode: 'cover'
},
productTagNameStyle: {
paddingHorizontal: 6,
marginRight: 5
}
})
export const ProductForm = (props: any) => {
const productOptionsProps = {
...props,
UIComponent: ProductOptionsUI
}
return
}