added shipping method
This commit is contained in:
@@ -11,18 +11,18 @@ import {
|
||||
useCreateOrder,
|
||||
useRegions,
|
||||
usePaymentTypes,
|
||||
useOrderDeliveries,
|
||||
} from "@/lib/hooks";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { useRouter } from "next/navigation";
|
||||
import type { DeliveryType, PaymentType } from "@/lib/types/api";
|
||||
import type { PaymentType, OrderDelivery } from "@/lib/types/api";
|
||||
import EmptyCart from "@/features/cart/components/EmptyCart";
|
||||
import ErrorPage from "@/components/ErrorPage";
|
||||
|
||||
export default function CartPage() {
|
||||
const [isClient, setIsClient] = useState(false);
|
||||
const [paymentType, setPaymentType] = useState<PaymentType | null>(null);
|
||||
const [deliveryType, setDeliveryType] =
|
||||
useState<DeliveryType>("SELECTED_DELIVERY");
|
||||
const [selectedOrderDelivery, setSelectedOrderDelivery] = useState<OrderDelivery | null>(null);
|
||||
const [selectedRegion, setSelectedRegion] = useState<string>("");
|
||||
const [selectedProvince, setSelectedProvince] = useState<number | null>(null);
|
||||
const [notes, setNote] = useState<string>("");
|
||||
@@ -36,15 +36,22 @@ export default function CartPage() {
|
||||
const { data: provinces = [], isLoading: provincesLoading } = useRegions();
|
||||
const { data: paymentTypes = [], isLoading: paymentTypesLoading } =
|
||||
usePaymentTypes();
|
||||
const { data: orderDeliveries = [], isLoading: deliveriesLoading } = useOrderDeliveries();
|
||||
const { mutate: createOrder, isPending: isCreatingOrder } = useCreateOrder();
|
||||
|
||||
const cartItems = cartResponse?.data || [];
|
||||
const isLoading = cartLoading || provincesLoading || paymentTypesLoading;
|
||||
const isLoading = cartLoading || provincesLoading || paymentTypesLoading || deliveriesLoading;
|
||||
|
||||
useEffect(() => {
|
||||
setIsClient(true);
|
||||
}, []);
|
||||
|
||||
const handleRegionChange = (region: string) => {
|
||||
setSelectedRegion(region);
|
||||
setSelectedProvince(null);
|
||||
setSelectedOrderDelivery(null);
|
||||
};
|
||||
|
||||
const regionGroups = useMemo(() => {
|
||||
return provinces.reduce((acc, province) => {
|
||||
if (!acc[province.region]) {
|
||||
@@ -77,25 +84,25 @@ export default function CartPage() {
|
||||
}, [cartItems]);
|
||||
|
||||
const totalAmount = useMemo(() => {
|
||||
return cartItems.reduce((sum, item) => {
|
||||
const productsTotal = cartItems.reduce((sum, item) => {
|
||||
const price = parseFloat(item.product.price_amount || "0");
|
||||
return sum + price * item.product_quantity;
|
||||
}, 0);
|
||||
return productsTotal;
|
||||
}, [cartItems]);
|
||||
|
||||
const handleDeliveryTypeChange = (type: DeliveryType) => {
|
||||
setDeliveryType(type);
|
||||
setSelectedProvince(null);
|
||||
};
|
||||
const finalTotal = useMemo(() => {
|
||||
const shippingPrice = selectedOrderDelivery?.price || 0;
|
||||
return totalAmount + shippingPrice;
|
||||
}, [totalAmount, selectedOrderDelivery]);
|
||||
|
||||
|
||||
const formatPhoneForBackend = (phoneNumber: string): string => {
|
||||
|
||||
return phoneNumber.replace(/^\+993\s*/, "").replace(/\s+/g, "");
|
||||
};
|
||||
|
||||
const handleCompleteOrder = () => {
|
||||
if (!selectedRegion || !selectedProvince || !paymentType || !phone || !name) {
|
||||
if (!selectedRegion || !selectedProvince || !paymentType || !phone || !name || !selectedOrderDelivery) {
|
||||
console.warn("Missing required fields for order");
|
||||
return;
|
||||
}
|
||||
@@ -112,9 +119,10 @@ export default function CartPage() {
|
||||
createOrder(
|
||||
{
|
||||
customer_name: `${name} ${lastName}`.trim(),
|
||||
customer_phone: parseInt(phoneDigits, 10),
|
||||
customer_phone: phoneDigits,
|
||||
customer_address: selectedProvinceData.name,
|
||||
shipping_method: "standart",
|
||||
shipping_method: selectedOrderDelivery.name,
|
||||
shipping_price: selectedOrderDelivery.price,
|
||||
payment_type_id: paymentType.id,
|
||||
region: selectedRegion,
|
||||
notes: notes || undefined,
|
||||
@@ -226,15 +234,25 @@ export default function CartPage() {
|
||||
title: t("products"),
|
||||
value: `${totalAmount.toFixed(2)} TMT`,
|
||||
},
|
||||
...(selectedOrderDelivery
|
||||
? [
|
||||
{
|
||||
title: t("shipping_method"),
|
||||
value: `${selectedOrderDelivery.price.toFixed(2)} TMT`,
|
||||
},
|
||||
]
|
||||
: []),
|
||||
],
|
||||
footer: {
|
||||
title: t("total_price"),
|
||||
value: `${totalAmount.toFixed(2)} TMT`,
|
||||
value: `${finalTotal.toFixed(2)} TMT`,
|
||||
},
|
||||
},
|
||||
}}
|
||||
paymentType={paymentType}
|
||||
deliveryType={deliveryType}
|
||||
orderDeliveries={orderDeliveries}
|
||||
selectedOrderDelivery={selectedOrderDelivery}
|
||||
onOrderDeliveryChange={setSelectedOrderDelivery}
|
||||
selectedRegion={selectedRegion}
|
||||
selectedProvince={selectedProvince}
|
||||
notes={notes}
|
||||
@@ -248,8 +266,7 @@ export default function CartPage() {
|
||||
onNameChange={setName}
|
||||
onLastNameChange={setLastName}
|
||||
onPaymentTypeChange={setPaymentType}
|
||||
onDeliveryTypeChange={handleDeliveryTypeChange}
|
||||
onRegionChange={setSelectedRegion}
|
||||
onRegionChange={handleRegionChange}
|
||||
onProvinceChange={setSelectedProvince}
|
||||
onNoteChange={setNote}
|
||||
onCompleteOrder={handleCompleteOrder}
|
||||
|
||||
Reference in New Issue
Block a user