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 = () => {
|
export const useImportUsersFromExcel = () => {
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import axios from "@/config/axios";
|
import axios from "@/config/axios";
|
||||||
import type {
|
import type {
|
||||||
|
CreateUserResponse,
|
||||||
|
CreateUserType,
|
||||||
GetCustomersResponse,
|
GetCustomersResponse,
|
||||||
GetUsersParams,
|
GetUsersParams,
|
||||||
ImportUsersResponse,
|
ImportUsersResponse,
|
||||||
@@ -21,6 +23,11 @@ export const searchUserByPhone = async (phone: string) => {
|
|||||||
return data;
|
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) => {
|
export const importUsersFromExcel = async (file: File) => {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
formData.append("file", file);
|
formData.append("file", file);
|
||||||
|
|||||||
@@ -96,3 +96,11 @@ export type ImportUsersResult = {
|
|||||||
export type ImportUsersResponse = IResponse<ImportUsersResult>;
|
export type ImportUsersResponse = IResponse<ImportUsersResult>;
|
||||||
|
|
||||||
export type SearchUserByPhoneResponse = IResponse<UserWithAddresses>;
|
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 { toast } from 'react-toastify'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { useCreateOrder } from './useOrderData'
|
import { useCreateOrder } from './useOrderData'
|
||||||
|
import { useCreateUser } from '@/pages/customers/hooks/useUsersData'
|
||||||
import { useGetFoods } from '@/pages/food/hooks/useFoodData'
|
import { useGetFoods } from '@/pages/food/hooks/useFoodData'
|
||||||
import { useGetRestaurantShipmentMethods } from '@/pages/shipmentMethod/hooks/useShipmentMethodData'
|
import { useGetRestaurantShipmentMethods } from '@/pages/shipmentMethod/hooks/useShipmentMethodData'
|
||||||
import { useGetRestaurantPaymentMethods } from '@/pages/paymentMethods/hooks/usePaymentMethodData'
|
import { useGetRestaurantPaymentMethods } from '@/pages/paymentMethods/hooks/usePaymentMethodData'
|
||||||
@@ -64,8 +65,10 @@ export const getFoodUnitPrice = (food: Food) => {
|
|||||||
export const useCreateOrderForm = () => {
|
export const useCreateOrderForm = () => {
|
||||||
const navigate = useNavigate()
|
const navigate = useNavigate()
|
||||||
const { mutate: createOrder, isPending: isCreating } = useCreateOrder()
|
const { mutate: createOrder, isPending: isCreating } = useCreateOrder()
|
||||||
|
const { mutateAsync: createUser, isPending: isCreatingUser } = useCreateUser()
|
||||||
const [customerAddresses, setCustomerAddresses] = useState<UserSavedAddress[]>([])
|
const [customerAddresses, setCustomerAddresses] = useState<UserSavedAddress[]>([])
|
||||||
const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null)
|
const [selectedAddressId, setSelectedAddressId] = useState<string | null>(null)
|
||||||
|
const [isNewCustomer, setIsNewCustomer] = useState(false)
|
||||||
|
|
||||||
const { data: foodsData } = useGetFoods({ limit: 500 })
|
const { data: foodsData } = useGetFoods({ limit: 500 })
|
||||||
const { data: deliveryMethodsData } = useGetRestaurantShipmentMethods({ limit: 100 })
|
const { data: deliveryMethodsData } = useGetRestaurantShipmentMethods({ limit: 100 })
|
||||||
@@ -113,7 +116,7 @@ export const useCreateOrderForm = () => {
|
|||||||
)
|
)
|
||||||
.min(1, 'حداقل یک آیتم الزامی است'),
|
.min(1, 'حداقل یک آیتم الزامی است'),
|
||||||
}),
|
}),
|
||||||
onSubmit: (values) => {
|
onSubmit: async (values) => {
|
||||||
const selectedDelivery = deliveryMethods.find(
|
const selectedDelivery = deliveryMethods.find(
|
||||||
(method) => method.id === values.deliveryMethodId
|
(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) {
|
if (!selectedPayment) {
|
||||||
toast.error('روش پرداخت نقدی یافت نشد')
|
toast.error('روش پرداخت نقدی یافت نشد')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
submitOrder()
|
await registerNewCustomer()
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -229,6 +251,7 @@ export const useCreateOrderForm = () => {
|
|||||||
|
|
||||||
const handleUserFound = useCallback(
|
const handleUserFound = useCallback(
|
||||||
(user: UserWithAddresses) => {
|
(user: UserWithAddresses) => {
|
||||||
|
setIsNewCustomer(false)
|
||||||
const addresses = user.addresses ?? []
|
const addresses = user.addresses ?? []
|
||||||
setCustomerAddresses(addresses)
|
setCustomerAddresses(addresses)
|
||||||
|
|
||||||
@@ -253,16 +276,20 @@ export const useCreateOrderForm = () => {
|
|||||||
)
|
)
|
||||||
|
|
||||||
const clearCustomerData = useCallback(() => {
|
const clearCustomerData = useCallback(() => {
|
||||||
|
setIsNewCustomer(false)
|
||||||
setCustomerAddresses([])
|
setCustomerAddresses([])
|
||||||
setSelectedAddressId(null)
|
setSelectedAddressId(null)
|
||||||
formik.setFieldValue('userAddress', emptyUserAddress())
|
formik.setFieldValue('userAddress', emptyUserAddress())
|
||||||
}, [formik])
|
}, [formik])
|
||||||
|
|
||||||
const handleUserNotFound = useCallback(() => {
|
const handleUserNotFound = useCallback(() => {
|
||||||
clearCustomerData()
|
setCustomerAddresses([])
|
||||||
|
setSelectedAddressId(null)
|
||||||
|
formik.setFieldValue('userAddress', emptyUserAddress())
|
||||||
formik.setFieldValue('firstName', '')
|
formik.setFieldValue('firstName', '')
|
||||||
formik.setFieldValue('lastName', '')
|
formik.setFieldValue('lastName', '')
|
||||||
}, [clearCustomerData, formik])
|
setIsNewCustomer(true)
|
||||||
|
}, [formik])
|
||||||
|
|
||||||
const cashPaymentMethod = paymentMethods[0]
|
const cashPaymentMethod = paymentMethods[0]
|
||||||
|
|
||||||
@@ -391,7 +418,7 @@ export const useCreateOrderForm = () => {
|
|||||||
addFoodToOrder,
|
addFoodToOrder,
|
||||||
updateItemQuantity,
|
updateItemQuantity,
|
||||||
removeItem,
|
removeItem,
|
||||||
isSubmitting: isCreating,
|
isSubmitting: isCreating || isCreatingUser,
|
||||||
customerAddresses,
|
customerAddresses,
|
||||||
selectedAddressId,
|
selectedAddressId,
|
||||||
handleUserFound,
|
handleUserFound,
|
||||||
|
|||||||
Reference in New Issue
Block a user