Files
mm.com.tm-frontend/src/pages/Orders/index.jsx
2026-04-30 10:44:08 +05:00

189 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, { useState } from "react";
import styles from "./Orders.module.scss";
import { Link } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { useGetOrdersQuery } from "../../app/api/orderApi";
import EmptyOrderState from "./emptyOrder";
import Loader from "../../components/Loader/index";
import { Result, Button } from "antd";
import { useNavigate } from "react-router-dom";
import PendingPriceBadge from "../../components/PendingPriceBadge";
const isPriceZero = (price) => !price || parseFloat(price) === 0;
const orderHasZeroPrice = (orderItems) =>
orderItems?.some((item) => isPriceZero(item.unit_price_amount));
const Orders = () => {
const { t } = useTranslation();
const { data: orders, isLoading, error } = useGetOrdersQuery();
const navigate = useNavigate();
const formatOrderDate = (dateString) => {
try {
return new Date(dateString).toLocaleString("tk-TM", {
day: "2-digit",
month: "2-digit",
year: "numeric",
hour: "2-digit",
minute: "2-digit",
});
} catch {
return dateString;
}
};
if (isLoading) return <Loader />;
if (error)
return (
<Result
status="500"
title="500"
subTitle="Näbelli ýalňyşlyk ýüze çykdy."
extra={
<Button type="primary" onClick={() => navigate("/")}>
Baş sahypa gidiň
</Button>
}
/>
);
if (!orders || orders.length === 0) return <EmptyOrderState />;
return (
<div className={styles.container}>
<h2 className={styles.title}>Sargytlarym</h2>
{/* Desktop table */}
<div className={styles.tableContainer}>
<table className={styles.table}>
<thead>
<tr>
<th>{t("order.orderNumber")}</th>
<th>{t("order.orderDate")}</th>
<th>{t("order.sum")}</th>
<th>{t("checkout.paymentMethod")}</th>
<th>{t("order.orderStatus")}</th>
<th>{t("order.action")}</th>
</tr>
</thead>
<tbody>
{orders.map((order) => {
const hasZeroPrice = orderHasZeroPrice(order.orderItems);
const totalAmount = order.orderItems.reduce(
(sum, item) =>
sum + parseFloat(item.unit_price_amount) * item.quantity,
0,
);
return (
<tr key={order.id}>
<td>{order.id}</td>
<td>{formatOrderDate(order.delivery_at)}</td>
<td style={{ color: "#888888", fontWeight: "700" }}>
{hasZeroPrice ? (
<span
style={{
display: "inline-flex",
alignItems: "center",
gap: 6,
}}
>
{t("cart.pendingPriceTitle")} <PendingPriceBadge />
</span>
) : (
`${totalAmount.toFixed(2)} m.`
)}
</td>
<td>{order.payment_type}</td>
<td>{order.status}</td>
<td>
<Link to={`/orderdetail/${order.id}`}>
<button className={styles.actionButton}>
{t("order.information")}
</button>
</Link>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
{/* Mobile cards */}
<div className={styles.Mobilecontainer}>
{orders.map((order) => {
const hasZeroPrice = orderHasZeroPrice(order.orderItems);
const totalAmount = order.orderItems.reduce(
(sum, item) =>
sum + parseFloat(item.unit_price_amount) * item.quantity,
0,
);
return (
<div
key={order.id}
className={styles.orderCard}
onClick={(e) => {
// Modal veya badge içerisine tıklandığında yönlendirmeyi engelle
if (
e.target.closest(`.${styles.pendingPriceBadgeWrapper}`) ||
e.target.closest(".ant-modal-root") ||
e.target.closest(".ant-modal-wrap")
) {
return;
}
navigate(`/orderdetail/${order.id}`);
}}
style={{ cursor: "pointer" }}
>
<div className={styles.orderRow}>
<span className={styles.label}>{t("order.orderNumber")}:</span>
<span className={styles.value}>{order.id}</span>
</div>
<div className={styles.orderRow}>
<span className={styles.label}>{t("order.orderDate")}:</span>
<span className={styles.value}>
{formatOrderDate(order.delivery_at)}
</span>
</div>
<div className={styles.orderRow}>
<span className={styles.label}>{t("order.sum")}:</span>
<span className={styles.total}>
{hasZeroPrice ? (
<span
style={{
display: "inline-flex",
alignItems: "center",
gap: 6,
}}
>
{t("cart.pendingPriceTitle")} <PendingPriceBadge />
</span>
) : (
`${totalAmount.toFixed(2)} m.`
)}
</span>
</div>
<div className={styles.orderRow}>
<span className={styles.label}>
{t("checkout.paymentMethod")}:
</span>
<span className={styles.value}>{order.payment_type}</span>
</div>
<div className={styles.orderRow}>
<span className={styles.label}>{t("order.orderStatus")}:</span>
<span className={styles.value}>{order.status}</span>
</div>
</div>
);
})}
</div>
</div>
);
};
export default Orders;