Files
web-menu-react-version-/src/pages/checkout/hooks/useOrder.ts

214 lines
6.4 KiB
TypeScript

import { message } from "antd";
import {
clearCart,
selectCart,
selectCartTotal,
selectDiscountTotal,
selectGrandTotal,
selectHighestPricedLoyaltyItem,
} from "features/order/orderSlice";
import { OrderType } from "pages/checkout/hooks/types.ts";
import { useCallback } from "react";
import { useTranslation } from "react-i18next";
import { useNavigate, useParams } from "react-router-dom";
import { useCreateOrderMutation } from "redux/api/others";
import { useAppDispatch, useAppSelector } from "redux/hooks";
import { PAYMENT_CONFIRMATION_URL } from "utils/constants";
import { Customer } from "../../otp/types";
import { Variant } from "utils/types/appTypes";
export default function useOrder() {
const dispatch = useAppDispatch();
const navigate = useNavigate();
const { t } = useTranslation();
const { subdomain } = useParams();
const restaurantID = localStorage.getItem("restaurantID");
const { mobilenumber, user_uuid } = JSON.parse(
localStorage.getItem("customer") || "{}",
) as Customer;
const {
items,
coupon,
tip,
table,
specialRequest,
phone,
estimateTime,
orderType,
location,
discount,
plateCar,
pickupTime,
pickupDate,
pickupType,
giftDetails,
order,
restaurant,
} = useAppSelector(selectCart);
const highestLoyaltyItem = useAppSelector(selectHighestPricedLoyaltyItem);
const { useLoyaltyPoints } = useAppSelector(selectCart);
const orderPrice = useAppSelector(selectGrandTotal);
const subtotal = useAppSelector(selectCartTotal);
const discountAmount = useAppSelector(selectDiscountTotal);
const [createOrder] = useCreateOrderMutation();
console.log(order);
const getDeliveryMethod = useCallback(() => {
if (orderType === OrderType.Delivery) return 1;
if (orderType === OrderType.Pickup) return 2;
if (orderType === OrderType.DineIn) return 3;
if (orderType === OrderType.Gift) return 10;
if (orderType === OrderType.ScheduledOrder) return 9;
if (orderType === OrderType.ToRoom) return 5;
if (orderType === OrderType.ToOffice) return 4;
return undefined;
}, [orderType]);
const handleCreateOrder = useCallback(() => {
const loadingMessageKey = "create-order-loader";
message.loading({
content: t("order.creatingOrder", {
defaultValue: "Creating order...",
}),
key: loadingMessageKey,
duration: 0,
});
createOrder({
phone: mobilenumber || phone || giftDetails?.senderPhone,
comment: specialRequest,
delivery_method: getDeliveryMethod(),
timeslot: "",
table_id: table,
deliveryType: orderType,
type: "table-pickup",
// user_id: id,
restorant_id: restaurantID,
items: items.map((i) => ({
...i,
qty: i.quantity,
extras: i.extras?.map((e) => e.id) || [],
extrasgroup: i.extrasgroup || [],
order_item_comment: i.comment || "",
variant: (i.variant as Variant)?.id || "",
})),
office_no: order?.officeNumber,
room_no: order?.roomNumber,
...(discount.isDiscount ? { couponID: coupon } : {}),
...(discount.isGift ? { discountGiftCode: coupon } : {}),
discountAmount: discountAmount || 0,
paymentType: "cod",
uuid: user_uuid,
pickup_comments: "",
pickup_time: pickupTime,
pickup_date: pickupDate,
car_plate: plateCar,
pickupTimeType: pickupType,
delivery_pickup_interval: "",
orderPrice: orderPrice,
use_loylaty: useLoyaltyPoints && highestLoyaltyItem ? 1 : 0,
useWallet: 0,
tip,
userCoordinates:
location?.lat && location?.lng
? `${location?.lat},${location?.lng}`
: "",
delivery_address: location?.address,
vatvalue: ((restaurant?.vat || 0) / 100) * (subtotal - discountAmount),
taxes:
restaurant?.taxes
?.filter((t) => t.is_active === 1)
.map((t) => ({
tax_id: t.id,
percentage: t.percentage,
amount:
((Number(t.percentage) || 0) / 100) * (subtotal - discountAmount),
})) || [],
...(orderType === OrderType.Gift
? {
receiverName: giftDetails?.receiverName,
receiverPhone: giftDetails?.receiverPhone,
specialMessage: giftDetails?.message,
keepNameSecret: giftDetails?.isSecret,
senderEmail: giftDetails?.senderEmail,
senderPhone: giftDetails?.senderPhone,
senderName: giftDetails?.senderName,
dineType: orderType,
}
: {}),
})
.then((res: unknown) => {
message.destroy(loadingMessageKey);
const mutationResult = res as {
data?: { result?: { orderID?: string } };
error?: { data?: { message?: string } };
};
if (mutationResult.error)
message.error(
mutationResult.error.data?.message || t("order.createOrderFailed"),
);
else {
const redirectMessageKey = "order-redirect-loader";
if (
orderType === OrderType.Gift &&
mutationResult.data?.result?.orderID
) {
message.loading({
content: t("order.redirectingToPayment", {
defaultValue: "Redirecting to payment...",
}),
key: redirectMessageKey,
duration: 0,
});
window.location.href = `${PAYMENT_CONFIRMATION_URL}/${mutationResult.data.result.orderID}`;
} else {
message.destroy(redirectMessageKey);
if (mutationResult.data?.result?.orderID) {
navigate(
`/${subdomain}/order/${mutationResult.data.result.orderID}`,
);
}
}
dispatch(clearCart());
}
})
.catch((error: unknown) => {
message.destroy(loadingMessageKey);
console.error("Create Order failed:", error);
message.error(t("order.createOrderFailed"));
});
}, [
createOrder,
mobilenumber,
phone,
specialRequest,
getDeliveryMethod,
table,
orderType,
restaurantID,
items,
giftDetails,
discount.isDiscount,
discount.isGift,
discount.value,
coupon,
user_uuid,
estimateTime,
orderPrice,
useLoyaltyPoints,
highestLoyaltyItem,
tip,
location?.lat,
location?.lng,
location?.address,
t,
navigate,
subdomain,
dispatch,
]);
return { handleCreateOrder };
}