diff --git a/src/pages/customers/hooks/useUsersData.ts b/src/pages/customers/hooks/useUsersData.ts index e5b40e2..3e1bed1 100644 --- a/src/pages/customers/hooks/useUsersData.ts +++ b/src/pages/customers/hooks/useUsersData.ts @@ -15,6 +15,17 @@ export const useSearchUserByPhone = () => { }); }; +export const useCreateUser = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: api.createUser, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: ["users"] }); + }, + }); +}; + export const useImportUsersFromExcel = () => { const queryClient = useQueryClient(); diff --git a/src/pages/customers/service/UsersService.ts b/src/pages/customers/service/UsersService.ts index ba312b7..20fe137 100644 --- a/src/pages/customers/service/UsersService.ts +++ b/src/pages/customers/service/UsersService.ts @@ -1,5 +1,7 @@ import axios from "@/config/axios"; import type { + CreateUserResponse, + CreateUserType, GetCustomersResponse, GetUsersParams, ImportUsersResponse, @@ -21,6 +23,11 @@ export const searchUserByPhone = async (phone: string) => { return data; }; +export const createUser = async (params: CreateUserType) => { + const { data } = await axios.post("/admin/users", params); + return data; +}; + export const importUsersFromExcel = async (file: File) => { const formData = new FormData(); formData.append("file", file); diff --git a/src/pages/customers/types/Types.ts b/src/pages/customers/types/Types.ts index 03c95ae..992a67a 100644 --- a/src/pages/customers/types/Types.ts +++ b/src/pages/customers/types/Types.ts @@ -96,3 +96,11 @@ export type ImportUsersResult = { export type ImportUsersResponse = IResponse; export type SearchUserByPhoneResponse = IResponse; + +export type CreateUserType = { + phone: string; + firstName: string; + lastName: string; +}; + +export type CreateUserResponse = IResponse; diff --git a/src/pages/orders/hooks/useCreateOrderForm.ts b/src/pages/orders/hooks/useCreateOrderForm.ts index 5d0f21a..2ee4eb1 100644 --- a/src/pages/orders/hooks/useCreateOrderForm.ts +++ b/src/pages/orders/hooks/useCreateOrderForm.ts @@ -4,6 +4,7 @@ import * as Yup from 'yup' import { toast } from 'react-toastify' import { useNavigate } from 'react-router-dom' import { useCreateOrder } from './useOrderData' +import { useCreateUser } from '@/pages/customers/hooks/useUsersData' import { useGetFoods } from '@/pages/food/hooks/useFoodData' import { useGetRestaurantShipmentMethods } from '@/pages/shipmentMethod/hooks/useShipmentMethodData' import { useGetRestaurantPaymentMethods } from '@/pages/paymentMethods/hooks/usePaymentMethodData' @@ -64,8 +65,10 @@ export const getFoodUnitPrice = (food: Food) => { export const useCreateOrderForm = () => { const navigate = useNavigate() const { mutate: createOrder, isPending: isCreating } = useCreateOrder() + const { mutateAsync: createUser, isPending: isCreatingUser } = useCreateUser() const [customerAddresses, setCustomerAddresses] = useState([]) const [selectedAddressId, setSelectedAddressId] = useState(null) + const [isNewCustomer, setIsNewCustomer] = useState(false) const { data: foodsData } = useGetFoods({ limit: 500 }) const { data: deliveryMethodsData } = useGetRestaurantShipmentMethods({ limit: 100 }) @@ -113,7 +116,7 @@ export const useCreateOrderForm = () => { ) .min(1, 'حداقل یک آیتم الزامی است'), }), - onSubmit: (values) => { + onSubmit: async (values) => { const selectedDelivery = deliveryMethods.find( (method) => method.id === values.deliveryMethodId ) @@ -189,12 +192,31 @@ export const useCreateOrderForm = () => { }) } + const registerNewCustomer = async () => { + if (!isNewCustomer) { + submitOrder() + return + } + + try { + await createUser({ + phone: values.userPhone.trim(), + firstName: values.firstName.trim(), + lastName: values.lastName.trim(), + }) + setIsNewCustomer(false) + submitOrder() + } catch (error) { + toast.error(extractErrorMessage(error as ErrorType, 'خطا در ثبت مشتری')) + } + } + if (!selectedPayment) { toast.error('روش پرداخت نقدی یافت نشد') return } - submitOrder() + await registerNewCustomer() }, }) @@ -229,6 +251,7 @@ export const useCreateOrderForm = () => { const handleUserFound = useCallback( (user: UserWithAddresses) => { + setIsNewCustomer(false) const addresses = user.addresses ?? [] setCustomerAddresses(addresses) @@ -253,16 +276,20 @@ export const useCreateOrderForm = () => { ) const clearCustomerData = useCallback(() => { + setIsNewCustomer(false) setCustomerAddresses([]) setSelectedAddressId(null) formik.setFieldValue('userAddress', emptyUserAddress()) }, [formik]) const handleUserNotFound = useCallback(() => { - clearCustomerData() + setCustomerAddresses([]) + setSelectedAddressId(null) + formik.setFieldValue('userAddress', emptyUserAddress()) formik.setFieldValue('firstName', '') formik.setFieldValue('lastName', '') - }, [clearCustomerData, formik]) + setIsNewCustomer(true) + }, [formik]) const cashPaymentMethod = paymentMethods[0] @@ -391,7 +418,7 @@ export const useCreateOrderForm = () => { addFoodToOrder, updateItemQuantity, removeItem, - isSubmitting: isCreating, + isSubmitting: isCreating || isCreatingUser, customerAddresses, selectedAddressId, handleUserFound,