Create user
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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<CreateUserResponse>("/admin/users", params);
|
||||
return data;
|
||||
};
|
||||
|
||||
export const importUsersFromExcel = async (file: File) => {
|
||||
const formData = new FormData();
|
||||
formData.append("file", file);
|
||||
|
||||
@@ -96,3 +96,11 @@ export type ImportUsersResult = {
|
||||
export type ImportUsersResponse = IResponse<ImportUsersResult>;
|
||||
|
||||
export type SearchUserByPhoneResponse = IResponse<UserWithAddresses>;
|
||||
|
||||
export type CreateUserType = {
|
||||
phone: string;
|
||||
firstName: string;
|
||||
lastName: string;
|
||||
};
|
||||
|
||||
export type CreateUserResponse = IResponse<User>;
|
||||
|
||||
@@ -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<UserSavedAddress[]>([])
|
||||
const [selectedAddressId, setSelectedAddressId] = useState<string | null>(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,
|
||||
|
||||
Reference in New Issue
Block a user