import React, { useCallback } from 'react' import { StyleProp, Text, TextStyle, View, ViewStyle } from 'react-native' import { IDropdownMaterialStyles } from '../../../components/dropdownMaterial/types' import { AddonItem } from '../types' import { getFieldType, priceWithCurrency } from '../utils' import { CheckoutFormProps, CheckoutFormValues } from '../form/types' import { FormikField, FormikFieldComponentStyles } from '../../form' import { DropdownMaterial } from '../../../components' export interface AddonsContainerStyles { container?: StyleProp title?: StyleProp addonRow?: StyleProp addonList?: StyleProp addonItem?: StyleProp addonInfo?: StyleProp addonName?: StyleProp addonPrice?: StyleProp addonPriceWithFees?: StyleProp addonDescription?: StyleProp addonSelectContainer?: StyleProp dropdownMaterial?: IDropdownMaterialStyles fieldComponentStyles?: FormikFieldComponentStyles } interface AddonsContainerProps { addons: CheckoutFormValues['addons'] availableAddons: AddonItem[] onAddonChange: (addonId: string, quantity: number) => void currency?: string styles?: AddonsContainerStyles texts?: { title?: string quantityLabel?: string priceWithFeesSuffix?: string } addonCustomFields?: CheckoutFormProps['addonCustomFields'] } const AddonsContainer: React.FC = ({ addons = {}, availableAddons = [], onAddonChange, currency, styles: customStyles, texts, addonCustomFields, }) => { // Generate quantity options for the dropdown const generateAddonQuantityOptions = useCallback((addon: AddonItem['attributes']) => { const options = [] // Check different possible locations for max quantity const maxQty = addon.maxQuantity || '1' const maxQtyNum = parseInt(maxQty, 10) for (let i = 0; i <= maxQtyNum; i++) { options.push({ value: i.toString(), label: i.toString(), }) } return options }, []) // Don't render if no addons available if (!availableAddons || availableAddons.length === 0) { return null } return ( {texts?.title || 'Available Add-ons'} {availableAddons.map((addon) => { // Extract addon data from the API structure const addonData = addon.attributes const addonId = addon.id || addonData.id // Get price (could be in different locations based on API structure) const priceWithFees = addonData.price || 0 const addonCurrency = addonData.currency || currency const isAddonFree = Number(priceWithFees) === 0 const basePriceFormatted = isAddonFree ? 'FREE' : priceWithCurrency((priceWithFees / 100).toString(), addonCurrency) return ( {addonData.name || 'Add-on'} {basePriceFormatted} {!isAddonFree && ( {texts?.priceWithFeesSuffix || ' (with fees)'} )} {addonData.description && ( {addonData.description} )} { onAddonChange( addonId.toString(), parseInt(item.value.toString(), 10) ) }} selectedOption={{ value: (addons[addonId]?.quantity || 0).toString(), label: (addons[addonId]?.quantity || 0).toString(), }} materialInputProps={{ label: texts?.quantityLabel || 'Qty', }} styles={customStyles?.fieldComponentStyles?.select} /> {(addons[addonId]?.quantity ?? 0) > 0 && addonCustomFields.map((field) => ( ({ value: o.value, label: o.name, })), }} styles={customStyles?.fieldComponentStyles} /> ))} ) })} ) } export default AddonsContainer