import { CreateListingRequest, SellingMethodEnum, ShippingAddress } from '@bit-ui-libs/common'; import { yupResolver } from '@hookform/resolvers/yup'; import { format } from 'date-fns'; import { t } from 'i18next'; import { useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { TouchableOpacity, View } from 'react-native'; import { boolean, mixed, object, string, number } from 'yup'; import { Button, FormTextField, Icon, Text } from '../../../components'; import { tw } from '../../../core'; import { FormDateField } from '../../../native-components/controlled-form/FormDateField'; import { flattenFieldErrors } from '../../../utils'; import { SellTokenShippingForm, shippingDetailSchema } from '../schemas'; import { optionToDate } from '../utils'; import { CalculateCostModal } from './CalculateCostModal'; import { TokenDetailsModal } from './TokenDetailsModal'; const SELLING_METHODS = Object.values(SellingMethodEnum); const schema = object().shape({ id: string().required('Could not find Asset'), sellingMethod: mixed().oneOf(SELLING_METHODS).required(), price: number() .transform((i) => (typeof i !== 'number' ? parseFloat(i) : i)) .typeError('Price must be a number') .moreThan(0, 'Price must be greater than 0') .required(), startAt: string().optional(), endAt: mixed().transform(optionToDate).optional(), isFreeShipping: boolean().required(), shippingDetail: shippingDetailSchema, }); type FixedPriceFormValues = Omit & { price: number | string }; interface SellFixedPriceFormProps { assetId: string; /** Used to update submit button to prevent bouncing */ loading?: boolean; onAddNewAddress?: () => void; onSubmit?: (form: FixedPriceFormValues) => void; } export function SellFixedPriceForm(props: SellFixedPriceFormProps) { const { assetId, loading, onAddNewAddress, onSubmit } = props; const form = useForm({ // @ts-ignore TODO: fix types resolver: yupResolver(schema), defaultValues: { id: assetId, sellingMethod: SellingMethodEnum.Fixed, price: '0', isFreeShipping: false, startAt: format(new Date(), 'yyyy-MM-dd'), }, }); const errors = flattenFieldErrors(form.formState.errors); // Price's form value is always a string const price = form.watch('price') as string; const [showCalculateModal, setShowCalculateModal] = useState(false); const [showDetailsModal, setShowDetailsModal] = useState(false); const onCalculateCostSubmit = (data: ShippingAddress) => { form.setValue('shippingDetail.shipFrom', { ...data, phone: data.phoneNumber }); setShowCalculateModal(false); setShowDetailsModal(true); }; const onAddTokenDetails = (data: SellTokenShippingForm) => { form.setValue('isFreeShipping', data.isFreeShipping); if (data.shippingDetail) { form.setValue('shippingDetail.weight', data.shippingDetail.weight); form.setValue('shippingDetail.length', data.shippingDetail.length); form.setValue('shippingDetail.width', data.shippingDetail.width); form.setValue('shippingDetail.height', data.shippingDetail.height); form.setValue('shippingDetail.handlingFee', data.shippingDetail.handlingFee); form.setValue('shippingDetail.packagingType', data.shippingDetail.packagingType); form.setValue('shippingDetail.unitOfMeasurement', data.shippingDetail.unitOfMeasurement); } setShowDetailsModal(false); }; return ( {t`marketplace.sellingPrice`} $ } keyboardType="decimal-pad" textFieldStyle={tw`text-white`} /> {t`marketplace.listingDate`} } /> {t`marketplace.deliveryOption`} setShowCalculateModal((v) => !v)} style={tw`bg-red-500 rounded-full w-6 h-6 justify-center items-center`} > {/* setShowCalculateModal(v => !v)} /> */} {errors.map((err, i) => ( {err} ))} { setShowCalculateModal(false); onAddNewAddress?.(); }} onDismiss={() => setShowCalculateModal(false)} /> setShowDetailsModal(false)} /> ); }