Create user

This commit is contained in:
hamid zarghami
2026-06-23 11:25:19 +03:30
parent 45494d7ae5
commit f83d0743c6
4 changed files with 58 additions and 5 deletions
+11
View File
@@ -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);
+8
View 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>;
+32 -5
View File
@@ -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,