user Addresses
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { useEffect, useMemo } from 'react'
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react'
|
||||
import { useFormik } from 'formik'
|
||||
import * as Yup from 'yup'
|
||||
import { toast } from 'react-toastify'
|
||||
@@ -18,6 +18,8 @@ import type {
|
||||
import type { Food } from '@/pages/food/types/Types'
|
||||
import type { RestaurantShipmentMethod } from '@/pages/shipmentMethod/types/Types'
|
||||
import type { RestaurantPaymentMethod } from '@/pages/paymentMethods/types/Types'
|
||||
import type { UserSavedAddress, UserWithAddresses } from '@/pages/customers/types/Types'
|
||||
import { mapSavedAddressToOrderAddress } from '../utils/mapSavedAddress'
|
||||
import { Pages } from '@/config/Pages'
|
||||
import type { ErrorType } from '@/helpers/types'
|
||||
import { extractErrorMessage } from '@/config/func'
|
||||
@@ -62,6 +64,8 @@ export const getFoodUnitPrice = (food: Food) => {
|
||||
export const useCreateOrderForm = () => {
|
||||
const navigate = useNavigate()
|
||||
const { mutate: createOrder, isPending: isCreating } = useCreateOrder()
|
||||
const [customerAddresses, setCustomerAddresses] = useState<UserSavedAddress[]>([])
|
||||
const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null)
|
||||
|
||||
const { data: foodsData } = useGetFoods({ limit: 500 })
|
||||
const { data: deliveryMethodsData } = useGetRestaurantShipmentMethods({ limit: 100 })
|
||||
@@ -194,6 +198,72 @@ export const useCreateOrderForm = () => {
|
||||
},
|
||||
})
|
||||
|
||||
const getCustomerFullName = useCallback(
|
||||
(firstName?: string, lastName?: string) =>
|
||||
[firstName ?? formik.values.firstName, lastName ?? formik.values.lastName]
|
||||
.filter(Boolean)
|
||||
.join(' '),
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
[formik.values.firstName, formik.values.lastName]
|
||||
)
|
||||
|
||||
const applySavedAddress = useCallback(
|
||||
(address: UserSavedAddress, fullName?: string) => {
|
||||
formik.setFieldValue(
|
||||
'userAddress',
|
||||
mapSavedAddressToOrderAddress(address, fullName ?? getCustomerFullName())
|
||||
)
|
||||
setSelectedAddressId(address.id)
|
||||
},
|
||||
[formik, getCustomerFullName]
|
||||
)
|
||||
|
||||
const selectManualAddress = useCallback(() => {
|
||||
setSelectedAddressId(null)
|
||||
formik.setFieldValue('userAddress', {
|
||||
...emptyUserAddress(),
|
||||
fullName: getCustomerFullName(),
|
||||
phone: formik.values.userPhone,
|
||||
})
|
||||
}, [formik, getCustomerFullName])
|
||||
|
||||
const handleUserFound = useCallback(
|
||||
(user: UserWithAddresses) => {
|
||||
const addresses = user.addresses ?? []
|
||||
setCustomerAddresses(addresses)
|
||||
|
||||
if (addresses.length === 0) {
|
||||
setSelectedAddressId(null)
|
||||
formik.setFieldValue('userAddress', {
|
||||
...emptyUserAddress(),
|
||||
fullName: getCustomerFullName(user.firstName, user.lastName),
|
||||
phone: user.phone || formik.values.userPhone,
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
const defaultAddress =
|
||||
addresses.find((address) => address.isDefault) ?? addresses[0]
|
||||
applySavedAddress(
|
||||
defaultAddress,
|
||||
[user.firstName, user.lastName].filter(Boolean).join(' ')
|
||||
)
|
||||
},
|
||||
[applySavedAddress, formik, getCustomerFullName]
|
||||
)
|
||||
|
||||
const clearCustomerData = useCallback(() => {
|
||||
setCustomerAddresses([])
|
||||
setSelectedAddressId(null)
|
||||
formik.setFieldValue('userAddress', emptyUserAddress())
|
||||
}, [formik])
|
||||
|
||||
const handleUserNotFound = useCallback(() => {
|
||||
clearCustomerData()
|
||||
formik.setFieldValue('firstName', '')
|
||||
formik.setFieldValue('lastName', '')
|
||||
}, [clearCustomerData, formik])
|
||||
|
||||
const cashPaymentMethod = paymentMethods[0]
|
||||
|
||||
useEffect(() => {
|
||||
@@ -215,6 +285,16 @@ export const useCreateOrderForm = () => {
|
||||
selectedDeliveryMethod?.method === DeliveryMethodEnum.DeliveryCar
|
||||
const isDineIn = selectedDeliveryMethod?.method === DeliveryMethodEnum.DineIn
|
||||
|
||||
useEffect(() => {
|
||||
if (!isCourierDelivery || customerAddresses.length === 0 || selectedAddressId) {
|
||||
return
|
||||
}
|
||||
|
||||
const defaultAddress =
|
||||
customerAddresses.find((address) => address.isDefault) ?? customerAddresses[0]
|
||||
applySavedAddress(defaultAddress)
|
||||
}, [isCourierDelivery, customerAddresses, selectedAddressId, applySavedAddress])
|
||||
|
||||
const foodsMap = useMemo(
|
||||
() => new Map(foods.map((food) => [food.id, food])),
|
||||
[foods]
|
||||
@@ -280,6 +360,16 @@ export const useCreateOrderForm = () => {
|
||||
)
|
||||
}
|
||||
|
||||
const handleAddressFieldChange = useCallback(
|
||||
(e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
|
||||
if (e.target.name?.startsWith('userAddress.')) {
|
||||
setSelectedAddressId(null)
|
||||
}
|
||||
formik.handleChange(e)
|
||||
},
|
||||
[formik]
|
||||
)
|
||||
|
||||
const removeItem = (foodId: string) => {
|
||||
formik.setFieldValue(
|
||||
'items',
|
||||
@@ -302,6 +392,14 @@ export const useCreateOrderForm = () => {
|
||||
updateItemQuantity,
|
||||
removeItem,
|
||||
isSubmitting: isCreating,
|
||||
customerAddresses,
|
||||
selectedAddressId,
|
||||
handleUserFound,
|
||||
handleUserNotFound,
|
||||
clearCustomerData,
|
||||
applySavedAddress,
|
||||
selectManualAddress,
|
||||
handleAddressFieldChange,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user