import { Select as AntSelect, DatePicker, Space } from "antd";
import {
ChevronUp,
PlusCircle,
RotateCcw,
} from "feather-icons-react/build/IconComponents";
import { useEffect, useState } from "react";
import { OverlayTrigger, Tooltip } from "react-bootstrap";
import { useDispatch, useSelector } from "react-redux";
import { Link } from "react-router-dom";
import Select from "react-select";
import CustomPagination from "../../components/CustomPagination";
import ImageWithBasePath from "../../core/img/imagewithbasebath";
import { setToogleHeader } from "../../core/redux/action";
import {
clearOrderError,
fetchOrders,
} from "../../core/redux/actions/orderActions";
import { formatRupiah } from "../../utils/currency";
import { formatDate, formatInputDate } from "../../utils/date";
const SalesList = () => {
const {
orders: apiOrders,
loading,
error,
totalOrders,
totalPages,
pageSize: reduxPageSize,
currentPage: reduxCurrentPage,
} = useSelector((state) => state.orders);
const dispatch = useDispatch();
const data = useSelector((state) => state.toggle_header);
const dataSource = apiOrders?.length > 0 ? apiOrders : [];
const [params, setParams] = useState({
page: reduxCurrentPage || 1,
limit: reduxPageSize || 10,
status: null,
date_from: null,
date_to: null,
});
const [searchTerm, setSearchTerm] = useState("");
const [debouncedSearchTerm, setDebouncedSearchTerm] = useState("");
const [selectedOrder, setSelectedOrder] = useState(null);
const handleSetParams = (key, value) => {
setParams({
...params,
[key]: value,
});
};
useEffect(() => {
const loadOrders = async () => {
try {
const receivedParams = {
page: params.page,
limit: params.limit,
search: debouncedSearchTerm || "",
status: params.status,
date_from: params.date_from,
date_to: params.date_to,
};
// Remove empty parameters
const cleanParams = Object.fromEntries(
Object.entries(receivedParams).filter(([, value]) => value !== "")
);
await dispatch(fetchOrders(cleanParams));
} catch (error) {
console.error("Failed to fetch orders", error);
}
};
loadOrders();
}, [dispatch, params, debouncedSearchTerm]);
useEffect(() => {
const timer = setTimeout(() => {
setDebouncedSearchTerm(searchTerm);
handleSetParams("page", 1);
}, 500); // 500ms delay
return () => clearTimeout(timer);
}, [searchTerm]);
// Handle search
const handleSearch = (e) => {
const value = e.target.value;
setSearchTerm(value);
};
// Handle pagination
const handlePageChange = (page) => {
handleSetParams("page", page);
};
// Handle page size change
const handlePageSizeChange = (newPageSize) => {
handleSetParams("limit", newPageSize);
handleSetParams("page", 1);
};
// Calculate pagination info
const totalRecords = totalOrders || dataSource.length;
const calculatedTotalPages = Math.ceil(totalRecords / params.limit);
const actualTotalPages = totalPages || calculatedTotalPages;
// Clear error when component unmounts
useEffect(() => {
return () => {
dispatch(clearOrderError());
};
}, [dispatch]);
const paymentStatus = [
{ value: "", label: "All" },
{ value: "pending", label: "Pending" },
{ value: "completed", label: "Completed" },
{ value: "cancelled", label: "Cancelled" },
];
const customer = [
{ value: "Choose Customer", label: "Choose Customer" },
{ value: "Customer Name", label: "Customer Name" },
];
const suppliername = [
{ value: "Supplier", label: "Supplier" },
{ value: "Supplier Name", label: "Supplier Name" },
];
const statusupdate = [
{ value: "Supplier", label: "Choose" },
{ value: "Completed", label: "Completed" },
{ value: "InProgress", label: "InProgress" },
];
const paymenttype = [
{ value: "Choose", label: "Choose" },
{ value: "Cash", label: "Cash" },
{ value: "Online", label: "Online" },
];
const badgeColors = {
pending: "primary",
completed: "success",
cancelled: "danger",
};
const [selectedDate, setSelectedDate] = useState(new Date());
const handleDateChange = (date) => {
setSelectedDate(date);
};
const renderTooltip = (props) => (
Loading products...
| Customer Name | Reference | Date | Status | Total Amount | Discount Amount | Table Number | Action | |
|---|---|---|---|---|---|---|---|---|
| {item.metadata?.customer_name} | {item.order_number} | {formatDate(item.created_at)} | {item.status} | {formatRupiah(item.total_amount)} | {formatRupiah(item.discount_amount)} | {item.table_number ?? 0} |
|
{selectedOrder?.metadata?.customer_name}
3103 Trainer Avenue Peoria, IL 61602 Email: carlevans241@example.com Phone: +1 987 471 6589DGT
2077 Chicago Avenue Orosi, CA 93647 Email: admin@example.com Phone: +1 893 174 0385| Product | Variant | Status | Quantity | Unit Price | Total Price |
|---|---|---|---|---|---|
| {item?.product_name} | {item?.product_variant_name ?? "-"} | {item?.status} | {item?.quantity} | {formatRupiah(item?.unit_price)} | {formatRupiah(item?.total_price)} |
| Order Tax | {formatRupiah(selectedOrder?.tax_amount)} |
| Discount | {formatRupiah(selectedOrder?.discount_amount)} |
| Grand Total | {formatRupiah(selectedOrder?.total_amount)} |
| Sub Total | {formatRupiah(selectedOrder?.subtotal)} |