added shipping method

This commit is contained in:
@jcarymuhammedow
2026-03-02 17:46:18 +05:00
parent bf5980e3b3
commit c13a4655bf
7 changed files with 282 additions and 71 deletions

View File

@@ -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}