user Addresses

This commit is contained in:
hamid zarghami
2026-06-23 11:16:25 +03:30
parent 223b1b5e8f
commit 45494d7ae5
9 changed files with 422 additions and 167 deletions
+99 -1
View File
@@ -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,
}
}