Advertisement
devraselmiah

rearrange code

Sep 26th, 2024 (edited)
26
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 63.11 KB | Source Code | 0 0
  1. "use client";
  2. import { useMutation, useQueries, useQueryClient } from "@tanstack/react-query";
  3. import moment from "moment";
  4. import Image from "next/image";
  5. import { useSearchParams } from "next/navigation";
  6. import printJS from "print-js";
  7. import React, { useEffect, useRef, useState } from "react";
  8. import { useForm } from "react-hook-form";
  9. import toast from "react-hot-toast";
  10. import { AiFillPlusSquare, AiOutlinePrinter } from "react-icons/ai";
  11. import { BiSolidShoppingBag, BiDetail } from "react-icons/bi";
  12. // import { BsFillInfoCircleFill } from "react-icons/bs";
  13. import {
  14.   FaShippingFast,
  15.   FaShareSquare,
  16.   FaUserCircle,
  17.   FaTags,
  18.   FaDownload,
  19.   FaTruckLoading,
  20.   FaWarehouse,
  21.   FaEdit,
  22. } from "react-icons/fa";
  23. import { FcApproval } from "react-icons/fc";
  24. import { GrCreditCard } from "react-icons/gr";
  25. import { IoIosCopy } from "react-icons/io";
  26. import { useSelector } from "react-redux";
  27. import Select, { components } from "react-select";
  28.  
  29. import PaymentDetails from "./PaymentDetails";
  30.  
  31. import { CreateOrderAPI } from "../../AddNewOrder/api";
  32. import { CustomersApi } from "../../Customer/api";
  33. import AdminPanelNotes from "../AdminPanelNotes";
  34. import { OrderAPI } from "../api";
  35. import CopyMessage from "../CopyMessage";
  36. import CustomerBehaviorModal from "../CustomerBehaviorModal";
  37. import CustomerBehavior from "../CustomerBehaviour";
  38. import EditOrderDataTableByID from "../DataTable/EditOrderDataTableByID";
  39. import OrderDataTableById from "../DataTable/OrderDataTableByID";
  40. import AddTagModal from "../Modal/AddTagModal";
  41. import PathaoModal from "../Modal/PathaoModal";
  42. import RefundModal from "../Modal/RefundModal";
  43. import ReturnReasonModal from "../Modal/ReturnReasonModal";
  44.  
  45. import ConfirmDeleteModal from "@/components/Admin/common/ConfirmDeleteModal";
  46. import Header from "@/components/Admin/common/Headers/Header";
  47. import KlassyImage from "@/components/Admin/common/KlassyImage";
  48. import PaymentModal from "@/components/Admin/common/Modal/PaymentModal/PaymentModal";
  49. import SelectCustomSelectStyles from "@/components/Admin/common/SelectCustomStyle";
  50. import { useStaffPermissions } from "@/hooks/useStaffPermissions";
  51. import { handleCopy } from "@/utils/CopyText";
  52. import { prefixImagePath } from "@/utils/imagePathFinder";
  53.  
  54. const Order_Status = [
  55.   { label: "Order Placed", value: "order_placed" },
  56.   { label: "Order On Hold", value: "order_on_hold" },
  57.   { label: "Confirmed", value: "confirmed" },
  58.   { label: "Processed", value: "processed" },
  59.   { label: "Ready To Pick", value: "order_to_be_picked" },
  60.   { label: "Ready To Pack", value: "order_to_be_packed" },
  61.   { label: "Shipped", value: "shipped" },
  62.   { label: "Delivered", value: "delivered" },
  63.   { label: "Canceled", value: "cancelled" },
  64.   { label: "Returned", value: "returned" },
  65. ];
  66.  
  67. const OptionContainer = (props) => {
  68.   return (
  69.     <components.Option {...props}>
  70.       <div className={`py-1`}>{props.children}</div>
  71.     </components.Option>
  72.   );
  73. };
  74.  
  75. const ShowOrder = ({ id, singleOrder, district, permissions }) => {
  76.   const [addTagModal, setAddTagModal] = useState(false);
  77.   const [matchedUser, setMatchedUser] = useState({});
  78.   const [returnedModal, setReturnedModal] = useState(false);
  79.   const [pathaoModal, setPathaoModal] = useState(false);
  80.   const [openAddressEdit, setOpenAddressEdit] = useState(false);
  81.   const [openEditProduct, setOpenEditProduct] = useState(false);
  82.   const [openProductAddModal, setOpenProductAddModal] = useState(false);
  83.   const [openDeleteModal, setOpenDeleteModal] = useState(false);
  84.   const [updatedAddress, setUpdatedAddress] = useState(null);
  85.   const [userBehavior, setUserBehavior] = useState(false);
  86.   const [updatedAdditionalInfo, setUpdateAdditionalInfo] = useState(null);
  87.   const [openRefundModal, setOpenRefundModal] = useState(false);
  88.   const [productId, setProductId] = useState(null);
  89.   const [printLoading, setPrintLoading] = useState(false);
  90.   const [downloadLoading, setDownloadLoading] = useState(false);
  91.   /* Payment states */
  92.   const [paymentModal, setPaymentModal] = useState(false);
  93.   const { register, handleSubmit, control, reset } = useForm();
  94.  
  95.   const queryClient = useQueryClient();
  96.   const OrderContainerRef = useRef(null);
  97.  
  98.   const { getPermissions } = useStaffPermissions();
  99.  
  100.   const handleResetClick = (ref) => {
  101.     ref.scrollIntoView({ behavior: "smooth" });
  102.   };
  103.  
  104.   const { getOrderById } = CreateOrderAPI();
  105.   const { getOfflineLabels } = CustomersApi();
  106.   const {
  107.     updateInfoOnOrder,
  108.     downloadOrder,
  109.     updateProductOnOrder,
  110.     cancelOrder,
  111.     deleteProductOnOrder,
  112.     getFraudDate,
  113.     addPayment,
  114.   } = OrderAPI();
  115.  
  116.   const PAGINATION = useSelector((state) => state.entities.pagination);
  117.   const query = useSearchParams();
  118.  
  119.   const params = {
  120.     pages: query.has("pages") ? +query.get("pages") : PAGINATION.pages,
  121.     pageSize: query.has("pageSize")
  122.       ? +query.get("pageSize")
  123.       : PAGINATION.pageSize,
  124.   };
  125.  
  126.   const [{ data: orderDataById }, { data: allLabels }] = useQueries({
  127.     queries: [
  128.       {
  129.         queryKey: ["single_order", +id],
  130.         queryFn: async () => await getOrderById(id),
  131.         initialData: singleOrder,
  132.       },
  133.       {
  134.         queryKey: ["manage_labels"],
  135.         queryFn: async () => await getOfflineLabels(),
  136.       },
  137.     ],
  138.   });
  139.  
  140.   const pathaoTranHistory = Object.assign(
  141.     {},
  142.     ...orderDataById?.pathao_invoice_transaction_history
  143.   );
  144.   const [productData, setProductData] = useState([]);
  145.  
  146.   useEffect(() => {
  147.     const productDataArray = [];
  148.  
  149.     orderDataById.order_details.map((e) => {
  150.       const finalProductData = {
  151.         id: e.id,
  152.         product: e.products,
  153.         thumbnail_img: e.products.thumbnail_img,
  154.         variation: e?.product_variations,
  155.         name: e.products.name,
  156.         quantity: e.quantity,
  157.         discount: e.unit_discount,
  158.         price: e.unit_price,
  159.         total_price: e.total_price,
  160.         product_id: e.product_id,
  161.         product_variation_id: e.product_variation_id,
  162.       };
  163.       productDataArray.push(finalProductData);
  164.     });
  165.  
  166.     setProductData(productDataArray);
  167.   }, [orderDataById, openEditProduct]);
  168.  
  169.   const StatusUpdateMutation = useMutation({
  170.     mutationFn: async (formData) => {
  171.       const data = await updateInfoOnOrder(+id, formData);
  172.       return data;
  173.     },
  174.     onMutate: async (newStatus) => {
  175.       await queryClient.cancelQueries({
  176.         queryKey: ["single_order", +id],
  177.       });
  178.  
  179.       const previousData = queryClient.getQueryData(["single_order", +id]);
  180.  
  181.       if (previousData) {
  182.         queryClient.setQueryData(["single_order", +id], (old) => ({
  183.           ...old,
  184.           payment_status: newStatus.payment_status
  185.             ? newStatus.payment_status
  186.             : old.payment_status,
  187.           delivery_status: newStatus.delivery_status
  188.             ? newStatus.delivery_status
  189.             : old.delivery_status,
  190.         }));
  191.       }
  192.       return { previousData };
  193.     },
  194.     onSuccess: (data) => {
  195.       toast.success(data?.message);
  196.     },
  197.     onError: (err) => {
  198.       toast.error(err?.response?.data?.message);
  199.     },
  200.     onSettled: () => {
  201.       queryClient.invalidateQueries({
  202.         queryKey: ["single_order", +id],
  203.       });
  204.     },
  205.   });
  206.  
  207.   const AddressUpdateMutation = useMutation({
  208.     mutationFn: async (formData) => {
  209.       const data = await updateInfoOnOrder(+id, formData);
  210.       return data;
  211.     },
  212.     onMutate: async (newStatus) => {
  213.       await queryClient.cancelQueries({
  214.         queryKey: ["single_order", +id],
  215.       });
  216.  
  217.       const previousData = queryClient.getQueryData(["single_order", +id]);
  218.  
  219.       if (previousData) {
  220.         queryClient.setQueryData(["single_order", +id], (old) => ({
  221.           ...old,
  222.           delivery_address: newStatus.delivery_address
  223.             ? newStatus.delivery_address
  224.             : old.delivery_address,
  225.         }));
  226.       }
  227.       return { previousData };
  228.     },
  229.     onSuccess: (data) => {
  230.       toast.success(data?.message);
  231.     },
  232.     onError: (err) => {
  233.       toast.error(err?.response?.data?.message);
  234.     },
  235.     onSettled: () => {
  236.       queryClient.invalidateQueries({
  237.         queryKey: ["single_order", +id],
  238.       });
  239.     },
  240.   });
  241.   const OrderUpdateMutation = useMutation({
  242.     mutationFn: async (formData) => {
  243.       const data = await updateProductOnOrder(+id, formData);
  244.       return data;
  245.     },
  246.     onSuccess: (data) => {
  247.       toast.success(data?.message);
  248.     },
  249.     onError: (err) => {
  250.       toast.error(err?.response?.data?.message);
  251.     },
  252.     onSettled: () => {
  253.       queryClient.invalidateQueries({
  254.         queryKey: ["single_order", +id],
  255.       });
  256.     },
  257.   });
  258.  
  259.   const OrderDeleteMutation = useMutation({
  260.     mutationFn: async (formData) => {
  261.       const data = await deleteProductOnOrder(+id, formData);
  262.       return data;
  263.     },
  264.     onSuccess: (data) => {
  265.       toast.success(data?.message);
  266.     },
  267.     onError: (err) => {
  268.       toast.error(err?.response?.data?.message);
  269.     },
  270.     onSettled: () => {
  271.       queryClient.invalidateQueries({
  272.         queryKey: ["single_order", +id],
  273.       });
  274.     },
  275.   });
  276.  
  277.   const CancelOrderMutation = useMutation({
  278.     mutationFn: async () => {
  279.       const data = await cancelOrder(+id);
  280.       return data;
  281.     },
  282.     onSuccess: (data) => {
  283.       toast.success(data?.message);
  284.     },
  285.     onError: (err) => {
  286.       toast.error(err?.response?.data?.message);
  287.     },
  288.     onSettled: () => {
  289.       queryClient.invalidateQueries({
  290.         queryKey: ["single_order", +id],
  291.       });
  292.     },
  293.   });
  294.  
  295.   const onInvoiceDownload = async () => {
  296.     try {
  297.       setDownloadLoading(true);
  298.       const pdfBlob = await downloadOrder(+id);
  299.       const downloadLink = document.createElement("a");
  300.       const fileName = `${orderDataById.order_code}.pdf`;
  301.       downloadLink.href = URL.createObjectURL(pdfBlob);
  302.       downloadLink.download = fileName;
  303.       document.body.appendChild(downloadLink);
  304.       downloadLink.click();
  305.       document.body.removeChild(downloadLink);
  306.     } catch (error) {
  307.       toast.error("Error downloading invoice:", error);
  308.     } finally {
  309.       setDownloadLoading(false);
  310.     }
  311.   };
  312.  
  313.   const onInvoicePrint = async () => {
  314.     try {
  315.       setPrintLoading(true);
  316.       const pdfBlob = await downloadOrder(+id);
  317.       const blobURL = URL.createObjectURL(pdfBlob);
  318.       printJS(blobURL);
  319.     } catch (error) {
  320.       toast.error("Error printing invoice:", error);
  321.     } finally {
  322.       setPrintLoading(false);
  323.     }
  324.   };
  325.  
  326.   const handleModalForTag = (id, type) => {
  327.     setMatchedUser({ userID: id, type: type });
  328.     setAddTagModal(true);
  329.   };
  330.  
  331.   const handleCloseModalForTag = () => {
  332.     queryClient.invalidateQueries({
  333.       queryKey: ["single_order", +id],
  334.     });
  335.     setAddTagModal(false);
  336.   };
  337.  
  338.   const handleCloseModalForReturn = () => {
  339.     queryClient.invalidateQueries({
  340.       queryKey: ["single_order", +id],
  341.     });
  342.     setReturnedModal(false);
  343.   };
  344.  
  345.   // Third party fraud checking
  346.   const FraudCheckMutation = useMutation({
  347.     mutationFn: async (formData) => {
  348.       const data = await getFraudDate(formData);
  349.       return data;
  350.     },
  351.     onSuccess: () => {
  352.       toast.success("Successfully Re-Checked");
  353.     },
  354.     onError: (err) => {
  355.       toast.error(err?.response?.data?.message);
  356.     },
  357.     onSettled: () => {
  358.       queryClient.invalidateQueries({
  359.         queryKey: ["single_order", +id],
  360.       });
  361.     },
  362.   });
  363.  
  364.   // manage all labels
  365.   const labelName = allLabels?.customer_labels?.map((label) => ({
  366.     value: label.name,
  367.     label: label.name,
  368.     icon: label.icon,
  369.     id: label?.id,
  370.   }));
  371.  
  372.   const disableOption = (option, selected) => {
  373.     if (permissions && permissions.role_type === "ADMIN") {
  374.       if (selected === "cancelled") {
  375.         return true;
  376.       } else {
  377.         if (option.value === selected) {
  378.           return true;
  379.         }
  380.         return false;
  381.       }
  382.     } else {
  383.       if (option.value === selected) {
  384.         return true;
  385.       }
  386.       if (selected == "shipped") {
  387.         if (option.value == "delivered" || option.value == "returned") {
  388.           return false;
  389.         } else {
  390.           true;
  391.         }
  392.       }
  393.  
  394.       if (selected === "processed_with_courier") {
  395.         if (option.value == "order_on_hold") {
  396.           return false;
  397.         } else {
  398.           true;
  399.         }
  400.       }
  401.  
  402.       if (selected == "delivered") {
  403.         if (option.value == "returned") {
  404.           return false;
  405.         } else {
  406.           true;
  407.         }
  408.       }
  409.       if (selected == "order_placed" || selected == "order_on_hold") {
  410.         if (
  411.           option.value == "order_on_hold" ||
  412.           option.value == "confirmed" ||
  413.           option.value == "order_placed" ||
  414.           option.value == "cancelled"
  415.         ) {
  416.           return false;
  417.         } else {
  418.           true;
  419.         }
  420.       }
  421.  
  422.       if (selected == "confirmed") {
  423.         if (
  424.           option.value == "order_on_hold" ||
  425.           option.value == "processed" ||
  426.           option.value == "order_placed" ||
  427.           option.value == "cancelled"
  428.         ) {
  429.           return false;
  430.         } else {
  431.         }
  432.       }
  433.  
  434.       if (selected == "processed") {
  435.         if (option.value == "order_on_hold") {
  436.           return false;
  437.         } else {
  438.           true;
  439.         }
  440.       }
  441.  
  442.       return true;
  443.     }
  444.   };
  445.  
  446.   const handleQtyUpdate = async (type, data) => {
  447.     const filteredData = productData.filter(
  448.       (item) => item.product.id == data.product.id
  449.     );
  450.     const productDataArray = [];
  451.  
  452.     const excludeProduct = productData.filter(
  453.       (item) => item.product.id !== data.product.id
  454.     );
  455.  
  456.     filteredData.map((item) => {
  457.       const finalProductData = {
  458.         product_id: item.product.id,
  459.         total_price:
  460.           type == "increase"
  461.             ? item.price * (item.quantity + 1)
  462.             : item.price * (item.quantity - 1),
  463.         unit_price: item.price,
  464.         quantity: 1,
  465.         product_variation_id: null,
  466.         action: type ? type : null,
  467.       };
  468.       productDataArray.push(finalProductData);
  469.     });
  470.  
  471.     const orderDetailsCalculation = [...excludeProduct, ...productDataArray];
  472.  
  473.     const sub_total = orderDetailsCalculation.reduce(
  474.       (acc, product) => acc + product.total_price,
  475.       0
  476.     );
  477.  
  478.     const finalData = {
  479.       sub_total: +sub_total,
  480.       grand_total: +sub_total + orderDataById?.shipping_charge,
  481.       paid_amount: orderDataById?.paid_amount,
  482.       due_amount:
  483.         +sub_total +
  484.         orderDataById?.shipping_charge -
  485.         orderDataById?.paid_amount,
  486.       total_saved: 0,
  487.       order_details: productDataArray,
  488.     };
  489.  
  490.     await OrderUpdateMutation.mutateAsync(finalData);
  491.   };
  492.  
  493.   const handleAddProduct = async (type, data) => {
  494.     const excludeProduct = productData.filter(
  495.       (item) => item.product.id !== data.product_id
  496.     );
  497.  
  498.     const productDataArray = [];
  499.  
  500.     const finalProductData = {
  501.       product_id: data.product_id,
  502.       total_price: data?.amount,
  503.       unit_price: data.price,
  504.       unit_discount: data.discount,
  505.       quantity: data?.quantity,
  506.       product_variation_id: data?.product_variation_id,
  507.       action: type ? type : null,
  508.       discount_type: "amount",
  509.     };
  510.  
  511.     productDataArray.push(finalProductData);
  512.  
  513.     const orderDetailsCalculation = [...excludeProduct, ...productDataArray];
  514.  
  515.     const sub_total = orderDetailsCalculation.reduce(
  516.       (acc, product) => acc + product.total_price,
  517.       0
  518.     );
  519.  
  520.     const finalData = {
  521.       sub_total: +sub_total,
  522.       grand_total: +sub_total + orderDataById?.shipping_charge,
  523.       paid_amount: orderDataById?.paid_amount,
  524.       due_amount:
  525.         +sub_total +
  526.         orderDataById?.shipping_charge -
  527.         orderDataById?.paid_amount,
  528.       total_saved: 0,
  529.       order_details: productDataArray,
  530.     };
  531.  
  532.     await OrderUpdateMutation.mutateAsync(finalData);
  533.   };
  534.  
  535.   const handleDeleteModal = (deleteID) => {
  536.     setOpenDeleteModal(true);
  537.     setProductId(deleteID);
  538.   };
  539.  
  540.   const handleDeleteProduct = async () => {
  541.     const updatedData = productData.filter((e) => e.product?.id == productId);
  542.  
  543.     const excludeProduct = productData.filter(
  544.       (item) => item.product.id !== productId
  545.     );
  546.  
  547.     const productDataArray = [];
  548.  
  549.     const finalProductData = {
  550.       product_id: updatedData[0].product.id,
  551.       product_variation_id: updatedData[0]?.product?.product_variation_id,
  552.     };
  553.  
  554.     productDataArray.push(finalProductData);
  555.  
  556.     const sub_total = excludeProduct.reduce(
  557.       (acc, product) => acc + product.total_price,
  558.       0
  559.     );
  560.     const finalData = {
  561.       sub_total: +sub_total,
  562.       grand_total: +sub_total + orderDataById?.shipping_charge,
  563.       paid_amount: orderDataById?.paid_amount,
  564.       due_amount:
  565.         +sub_total +
  566.         orderDataById?.shipping_charge -
  567.         orderDataById?.paid_amount,
  568.  
  569.       order_details: productDataArray,
  570.       order_details_id: updatedData[0].id,
  571.     };
  572.  
  573.     await OrderDeleteMutation.mutateAsync(finalData);
  574.   };
  575.  
  576.   // third party fraud check
  577.   const handFraudRecheck = async (data) => {
  578.     const finalData = {
  579.       order_id: +id,
  580.       phone: data[0].phone,
  581.       check_type: "ORDER",
  582.     };
  583.     await FraudCheckMutation.mutateAsync(finalData);
  584.   };
  585.  
  586.   /*   const handleSave = async () => {
  587.     const productDataArray = [];
  588.  
  589.     productData.map((item) => {
  590.       const finalProductData = {
  591.         product_id: item.id,
  592.         total_price: item.amount,
  593.         unit_price: item.price,
  594.         quantity: item.quantity,
  595.         product_variation_id: null,
  596.         action: item?.action ? item?.action : null,
  597.       };
  598.       productDataArray.push(finalProductData);
  599.     });
  600.  
  601.     const filteredData = productDataArray.filter(
  602.       (item) => item.action !== null
  603.     );
  604.  
  605.     const finalData = {
  606.       order_details: filteredData,
  607.     };
  608.  
  609.     await OrderUpdateMutation.mutateAsync(finalData);
  610.   }; */
  611.  
  612.   //   ? order_delivery_type.Express
  613.   // : dto?.delivery_type === 'Super_Express'
  614.   // ? order_delivery_type.Super_Express
  615.  
  616.   const PaymentSubmitMutation = useMutation({
  617.     mutationFn: async (formData) => {
  618.       const data = await addPayment(id, formData);
  619.       return data;
  620.     },
  621.     onSuccess: () => {
  622.       toast.success("Successfully Added!");
  623.     },
  624.     onError: (err) => {
  625.       toast.error(err?.response?.data?.message);
  626.     },
  627.     /* onSettled: () => {
  628.       queryClient.invalidateQueries({
  629.         queryKey: ["single_order", +id],
  630.       });
  631.     }, */
  632.   });
  633.  
  634.   const paymentModalSubmit = async (data) => {
  635.     console.log(data);
  636.     const paymentData = {
  637.       method: data?.TypeSelect.value,
  638.       payout: orderDataById?.grand_total,
  639.       collected_amount: data?.collectedAmount,
  640.       cod_fee: data?.COD,
  641.       delivery_charge: data?.deliveryCharge,
  642.       additional_charge: data?.additionalCharge,
  643.       transaction_id: data?.transactionID,
  644.     };
  645.     await PaymentSubmitMutation.mutateAsync(paymentData);
  646.   };
  647.  
  648.   return (
  649.     <div>
  650.       {/*       {openProductAddModal && (
  651.         <ModalForEditProductInOrder
  652.           body={() => (
  653.             <ProductAddSectionInCreateOrder
  654.               productData={productData}
  655.               setProductData={setProductData}
  656.             />
  657.           )}
  658.           title={"Add Product"}
  659.           handleSave={() => null}
  660.           handleClose={() => setOpenProductAddModal(false)}
  661.         />
  662.       )} */}
  663.       {userBehavior && (
  664.         <CustomerBehaviorModal
  665.           setUserBehavior={setUserBehavior}
  666.           customerData={orderDataById?.courier_transaction_security}
  667.           handFraudRecheck={handFraudRecheck}
  668.           isLoading={FraudCheckMutation.isPending}
  669.         />
  670.       )}
  671.  
  672.       {openDeleteModal && (
  673.         <ConfirmDeleteModal
  674.           handleClose={() => setOpenDeleteModal(false)}
  675.           handleDelete={() => {
  676.             handleDeleteProduct();
  677.             setOpenDeleteModal(false);
  678.           }}
  679.         />
  680.       )}
  681.       {addTagModal && (
  682.         <AddTagModal
  683.           handleCloseModal={handleCloseModalForTag}
  684.           allLabel={allLabels}
  685.           customer={matchedUser}
  686.           customersLabel={labelName}
  687.           params={params}
  688.           orderID={orderDataById?.id}
  689.         />
  690.       )}
  691.  
  692.       {returnedModal && (
  693.         <ReturnReasonModal
  694.           handleCloseModal={handleCloseModalForReturn}
  695.           allLabel={allLabels}
  696.           orderID={orderDataById?.id}
  697.           returnAmount={orderDataById?.paid_amount}
  698.         />
  699.       )}
  700.       {openRefundModal && (
  701.         <RefundModal
  702.           handleCloseModal={() => setOpenRefundModal(false)}
  703.           orderID={orderDataById?.id}
  704.           paymentData={
  705.             orderDataById.payment_response.length > 0
  706.               ? orderDataById.payment_response[0]
  707.               : null
  708.           }
  709.         />
  710.       )}
  711.       {pathaoModal && district && (
  712.         <PathaoModal
  713.           handleCloseModal={() => setPathaoModal(false)}
  714.           allLabel={allLabels}
  715.           orderData={orderDataById}
  716.           orderID={orderDataById?.id}
  717.           returnAmount={orderDataById?.paid_amount}
  718.           district={district}
  719.         />
  720.       )}
  721.       <Header header={"Sales"} />
  722.       <div className="rounded-sm bg-[#F4F6F9] dark:bg-[#0d0e10]">
  723.         <div className="sm:flex sm:flex-col xs:flex-col md:flex-row lg:flex-row justify-between bg-white dark:bg-[#222529] px-4 md:px-6 py-3  text-black dark:text-gray-300">
  724.           <div className="flex items-center mb-4 md:mb-0 justify-start text[16px] sm:text-[17px] md:text-xl font-semibold ">
  725.             Order {orderDataById?.order_code}
  726.             <div
  727.               onClick={() =>
  728.                 handleCopy(CopyMessage(orderDataById), "Payment link copied")
  729.               }
  730.             >
  731.               <IoIosCopy className="ml-3 hover:text-[#E0A800] cursor-pointer" />
  732.             </div>
  733.           </div>
  734.           <div className="md:flex md:items-center xs:ml-0">
  735.             <div className=" md:mr-1 lg:mr-5 xl:mr-7">
  736.               <div className="mb-4 md:mb-0">
  737.                 <p
  738.                   htmlFor="paymentStatus"
  739.                   className="mb-1 text-sm md:text-[16px] font-bold"
  740.                 >
  741.                   Payment Status
  742.                 </p>
  743.                 <Select
  744.                   classNamePrefix="select"
  745.                   className="select-container text-center w-full md:w-[130px]"
  746.                   styles={SelectCustomSelectStyles}
  747.                   isSearchable={false}
  748.                   options={[
  749.                     {
  750.                       value: "paid",
  751.                       label: "PAID",
  752.                     },
  753.                     {
  754.                       value: "unpaid",
  755.                       label: "UNPAID",
  756.                     },
  757.                   ]}
  758.                   defaultValue={{
  759.                     label: orderDataById?.payment_status?.toUpperCase(),
  760.                   }}
  761.                   onChange={async (selected) => {
  762.                     await StatusUpdateMutation.mutateAsync({
  763.                       payment_status: selected.value,
  764.                       action: "payment_status",
  765.                     });
  766.                   }}
  767.                 />
  768.               </div>
  769.             </div>
  770.             <div className="">
  771.               <div className="mb-4 md:mb-0">
  772.                 <p
  773.                   htmlFor="paymentStatus"
  774.                   className="mb-1 text-sm md:text-[16px] font-bold"
  775.                 >
  776.                   Delivery Status
  777.                 </p>
  778.                 <Select
  779.                   classNamePrefix="select"
  780.                   className="disabled:cursor-not-allowed select-container w-full md:w-[180px] text-center"
  781.                   styles={SelectCustomSelectStyles}
  782.                   options={Order_Status}
  783.                   isSearchable={false}
  784.                   defaultValue={{
  785.                     label: orderDataById?.delivery_status
  786.                       ?.replace(/_/g, " ")
  787.                       ?.replace(/\b\w/g, (match) => match.toUpperCase()),
  788.                   }}
  789.                   onChange={async (selected) => {
  790.                     orderDataById?.delivery_status === selected.value
  791.                       ? toast.error(
  792.                           `Change Order Status from ${selected.value?.replace(
  793.                             /_/g,
  794.                             " "
  795.                           )} to Update`
  796.                         )
  797.                       : selected.value === "returned"
  798.                         ? setReturnedModal(true)
  799.                         : selected.value === "cancelled"
  800.                           ? await CancelOrderMutation.mutateAsync()
  801.                           : await StatusUpdateMutation.mutateAsync({
  802.                               delivery_status: selected.value,
  803.                               action: "delivery_status",
  804.                             });
  805.                   }}
  806.                   components={{ Option: OptionContainer }}
  807.                   isOptionDisabled={(option) =>
  808.                     disableOption(option, orderDataById?.delivery_status)
  809.                   }
  810.                 />
  811.               </div>
  812.             </div>
  813.           </div>
  814.  
  815.           {/* other service customer order success rate */}
  816.           {orderDataById?.courier_transaction_security.length > 0 && (
  817.             <CustomerBehavior
  818.               setUserBehavior={setUserBehavior}
  819.               customerData={orderDataById?.courier_transaction_security}
  820.             />
  821.           )}
  822.  
  823.           <div className="flex flex-col items-center justify-center align-middle">
  824.             <div className="flex justify-between md:ml-4 ml-0 basis-[28%]">
  825.               {downloadLoading ? (
  826.                 <div className="flex  items-center justify-center mr-3 sm:mr-2 xs:justify-start select-none text-white text-sm bg-[#626167] cursor-not-allowed dark:bg-[#222529] px-3 py-1 border rounded-md">
  827.                   <span className="loading loading-bars loading-sm"></span>
  828.                   <span className="ml-1.5"> Downloading</span>
  829.                 </div>
  830.               ) : (
  831.                 <div className="flex flex-col items-center justify-center mr-3 sm:mr-2 xs:justify-start">
  832.                   <button
  833.                     type="button"
  834.                     onClick={async () => await onInvoiceDownload()}
  835.                     className="button select-none text-white text-sm bg-black dark:bg-[#222529] px-3 py-1 border rounded-md"
  836.                   >
  837.                     <FaDownload className="inline w-4 h-4 mr-2 text-white" />
  838.                     Download
  839.                   </button>
  840.                 </div>
  841.               )}
  842.  
  843.               {printLoading ? (
  844.                 <div className="flex cursor-not-allowed select-none items-center justify-center text-white text-sm bg-[#626167] dark:bg-[#222529] px-3 py-1 border rounded-md">
  845.                   <span className="loading loading-bars loading-sm"></span>
  846.                   <span className="ml-1.5"> Printing</span>
  847.                 </div>
  848.               ) : (
  849.                 <div
  850.                   onClick={async () => await onInvoicePrint()}
  851.                   className="flex items-center justify-center"
  852.                 >
  853.                   <button
  854.                     type="button"
  855.                     className=" button select-none text-white text-sm bg-black dark:bg-[#222529] px-4 py-1 border rounded-md"
  856.                   >
  857.                     <AiOutlinePrinter className="inline w-5 h-5 mr-2 text-white" />
  858.                     Print
  859.                   </button>
  860.                 </div>
  861.               )}
  862.             </div>
  863.  
  864.             {orderDataById?.delivery_status === "confirmed" ||
  865.               (orderDataById?.delivery_status === "processed" && (
  866.                 <div
  867.                   type="button"
  868.                   onClick={() => setPathaoModal(true)}
  869.                   className="cursor-pointer flex button text-black dark:test-white text-sm dark:bg-[#222529] px-2 py-1 mt-1  border border-gray-600 rounded-md"
  870.                 >
  871.                   <Image
  872.                     src="/images/pathao-icon.png"
  873.                     width={22}
  874.                     height={20}
  875.                     alt="pathao logo"
  876.                   />
  877.                   <span className="pl-1">Entry</span>
  878.                 </div>
  879.               ))}
  880.           </div>
  881.         </div>
  882.  
  883.         <div className="flex-col pt-2 sm:flex md:flex-row">
  884.           <div className="md:basis-[40%] drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] text-black dark:text-gray-300">
  885.             <div className="block shadow-[1px 1px 4px 0px rgba(0, 0, 0, 0.15)] rounded-md sm:mr-3 sm:mb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529] text-black dark:text-gray-300">
  886.               <div className="justify-between pt-6 pb-4 pl-6 pr-2 border-b md:pr-6 xs:flex border-neutral-200 dark:border-gray-400">
  887.                 <div>
  888.                   <FaShippingFast className="inline w-5 h-5 mr-2" />
  889.                   <span className="font-bold">Shipping Details</span>
  890.                 </div>
  891.  
  892.                 {openAddressEdit ? (
  893.                   <div className="flex justify-center mt-2 xs:mt-0 bg-red">
  894.                     <button
  895.                       onClick={() => setOpenAddressEdit(false)}
  896.                       className="bg-gray-100 hover:bg-white border-[0.5px] border-gray-400 mr-2 flex justify-center align-middle items-center px-2 sm:px-1 md:px-2 py-[4px] text-[12px] md:text-sm rounded-sm text-black"
  897.                     >
  898.                       Cancel
  899.                     </button>
  900.                     <button
  901.                       onClick={async () => {
  902.                         await AddressUpdateMutation.mutateAsync({
  903.                           delivery_address:
  904.                             updatedAddress ?? orderDataById?.delivery_address,
  905.                           additional_info:
  906.                             updatedAdditionalInfo ??
  907.                             orderDataById?.additional_info,
  908.                           action: "address_status",
  909.                         });
  910.                         setOpenAddressEdit(false);
  911.                       }}
  912.                       className="text-[12px] md:text-sm px-[4px] md:px-[6px] py-[2px] bg-gray-800 dark:bg-black hover:bg-black rounded-sm text-white"
  913.                     >
  914.                       Save Changes
  915.                     </button>
  916.                   </div>
  917.                 ) : (
  918.                   <div className="flex items-center justify-center mt-2 align-middle xs:mt-0">
  919.                     <div
  920.                       className="cursor-pointer hover:bg-gray-100  dark:hover:bg-gray-700 border-[0.5px] px-2 border-gray-400 rounded-sm flex justify-center align-middle items-center"
  921.                       onClick={() => setOpenAddressEdit(true)}
  922.                     >
  923.                       Edit
  924.                       <FaEdit className="ml-2" />
  925.                     </div>
  926.                   </div>
  927.                 )}
  928.               </div>
  929.  
  930.               <div className="px-5 py-3 text-sm">
  931.                 <div className="flex items-center  text-[13px] mb-2 xs:text-[14px] md:text-[15px] font-semibold">
  932.                   <p className="mr-1 ">Name: </p>
  933.                   <p className="">
  934.                     {" "}
  935.                     {orderDataById?.offline_customer_id
  936.                       ? orderDataById?.offline_customers?.name
  937.                       : orderDataById?.users?.name}
  938.                   </p>
  939.                 </div>
  940.                 <div className="flex items-center text-[13px] mb-2 xs:text-[14px] md:text-[15px] font-semibold">
  941.                   <p className="mr-2 ">Phone: </p>
  942.                   <p className="">
  943.                     {" "}
  944.                     {orderDataById?.offline_customer_id
  945.                       ? orderDataById?.offline_customers?.phone
  946.                       : orderDataById?.users?.phone}{" "}
  947.                   </p>
  948.                 </div>
  949.                 <div className="block md:flex items-center text-[13px] mb-2 xs:text-[14px] md:text-[15px]  font-semibold">
  950.                   <p className="mr-2  md:mb-0 mb-[4px]">Address: </p>
  951.                   {openAddressEdit ? (
  952.                     <textarea
  953.                       defaultValue={orderDataById?.delivery_address}
  954.                       onChange={(e) => setUpdatedAddress(e.target.value)}
  955.                       className="h-20 w-full p-3 outline-none border-[1px]  border-gray-400  "
  956.                     />
  957.                   ) : (
  958.                     <p className="">{orderDataById?.delivery_address}</p>
  959.                   )}
  960.                 </div>
  961.  
  962.                 {orderDataById?.alternative_phone && (
  963.                   <div className="flex items-center text-[13px] mb-2 xs:text-[14px] md:text-[15px]  font-semibold">
  964.                     <p className="mr-2">Alternative Phone:</p>
  965.                     <p>{orderDataById?.alternative_phone}</p>
  966.                   </div>
  967.                 )}
  968.  
  969.                 <div className="flex items-center text-[13px] mb-2 xs:text-[14px] md:text-[15px]  font-semibold">
  970.                   <p
  971.                     className={` ${
  972.                       orderDataById?.delivery_type === "Express" ||
  973.                       orderDataById?.delivery_type === "Super_Express"
  974.                         ? "bg-[#FFFF00] w-fit pl-[2px] dark:text-black text-black  font-bold"
  975.                         : "dark:text-white text-black mr-2"
  976.                     }`}
  977.                   >
  978.                     Delivery Type :
  979.                   </p>
  980.                   <p>
  981.                     {orderDataById?.delivery_type === "Express" ||
  982.                     orderDataById?.delivery_type === "Super_Express" ? (
  983.                       <span className="font-bold dark:text-black text-black bg-[#FFFF00] p-[2px] pl-1">
  984.                         {orderDataById?.delivery_type === "Express" && (
  985.                           <span>Same Day Delivery</span>
  986.                         )}
  987.                         {orderDataById?.delivery_type === "Super_Express" && (
  988.                           <span>Super Express Delivery</span>
  989.                         )}
  990.                         {/* {orderDataById?.delivery_type?.replace(/_/g, " ")} */}
  991.                       </span>
  992.                     ) : (
  993.                       <span>
  994.                         {orderDataById?.delivery_type?.replace(/_/g, " ")}{" "}
  995.                         Delivery
  996.                       </span>
  997.                     )}
  998.                   </p>
  999.                 </div>
  1000.                 {orderDataById?.additional_info ? (
  1001.                   <div className="block md:flex items-center text-[13px] mb-2 xs:text-[14px] md:text-[15px] font-semibold">
  1002.                     <p className="mr-2 md:mb-0 mb-[4px] ">Delivery Notes: </p>
  1003.                     {openAddressEdit ? (
  1004.                       <textarea
  1005.                         defaultValue={orderDataById?.additional_info}
  1006.                         onChange={(e) =>
  1007.                           setUpdateAdditionalInfo(e.target.value)
  1008.                         }
  1009.                         className="h-20 w-full p-3 outline-none border-[1px]  border-gray-400  "
  1010.                       />
  1011.                     ) : (
  1012.                       <p className=" bg-[#FFFF00] w-fit pl-[4px] pr-[2px] py-[4px]  font-bold">
  1013.                         {orderDataById?.additional_info}
  1014.                       </p>
  1015.                     )}
  1016.                   </div>
  1017.                 ) : (
  1018.                   openAddressEdit && (
  1019.                     <>
  1020.                       <div className="block md:flex items-center text-[13px] xs:text-[14px] md:text-[15px] font-semibold">
  1021.                         <p className="mr-2 ">Delivery Notes: </p>
  1022.                         <textarea
  1023.                           defaultValue={orderDataById?.additional_info}
  1024.                           onChange={(e) =>
  1025.                             setUpdateAdditionalInfo(e.target.value)
  1026.                           }
  1027.                           className="h-20 w-full p-3 outline-none border-[1px]  border-gray-400  "
  1028.                         />
  1029.                       </div>
  1030.                     </>
  1031.                   )
  1032.                 )}
  1033.               </div>
  1034.             </div>
  1035.  
  1036.             <div
  1037.               className="block shadow-[1px 1px 4px 0px rgba(0, 0, 0, 0.15)] rounded-md sm:mr-3 sm:mb-2 pb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529]"
  1038.               style={{
  1039.                 backgroundColor: orderDataById?.offline_customers
  1040.                   ? orderDataById?.offline_customers?.customer_lebels?.bg_color
  1041.                   : orderDataById?.users?.customer_lebels?.bg_color,
  1042.               }}
  1043.             >
  1044.               <div className="px-6 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1045.                 <FaUserCircle className="inline w-5 h-5 mr-2" />
  1046.                 <span className="font-bold">Customer Info</span>
  1047.               </div>
  1048.               <div className="flex flex-row pt-3 pl-5 pr-2 text-sm">
  1049.                 <div className="basis-[15%] sm:basis-[17%] mr-7 sm:mr-0">
  1050.                   <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px] font-semibold">
  1051.                     Name:{" "}
  1052.                   </p>
  1053.                   {(orderDataById?.offline_customer_id ||
  1054.                     orderDataById?.user_id) &&
  1055.                   (orderDataById?.offline_customers?.email ||
  1056.                     orderDataById?.users?.email) ? (
  1057.                     <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px] font-semibold">
  1058.                       Email:{" "}
  1059.                     </p>
  1060.                   ) : null}
  1061.  
  1062.                   <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px] font-semibold">
  1063.                     Phone:{" "}
  1064.                   </p>
  1065.                 </div>
  1066.                 <div className="basis-[75%] sm:basis-[68%]">
  1067.                   <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px]  font-semibold">
  1068.                     {orderDataById?.offline_customer_id
  1069.                       ? orderDataById?.offline_customers?.name
  1070.                       : orderDataById?.users?.name}
  1071.                     <button
  1072.                       onClick={() => {
  1073.                         orderDataById?.offline_customer_id
  1074.                           ? handleModalForTag(
  1075.                               orderDataById?.offline_customer_id,
  1076.                               "offline"
  1077.                             )
  1078.                           : handleModalForTag(orderDataById?.user_id, "online");
  1079.                       }}
  1080.                       className="bg-[#D9D9D9] text-black hidden sm:inline px-1 border rounded-md ml-2 text-[10px]"
  1081.                     >
  1082.                       <FaTags className="inline " /> Add Tag
  1083.                     </button>
  1084.                   </p>
  1085.  
  1086.                   {orderDataById?.offline_customer_id ? (
  1087.                     orderDataById?.offline_customers?.email ? (
  1088.                       <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px]">
  1089.                         {orderDataById?.offline_customers?.email}
  1090.                       </p>
  1091.                     ) : null
  1092.                   ) : orderDataById?.users && orderDataById?.users?.email ? (
  1093.                     <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px]">
  1094.                       {orderDataById?.users?.email}
  1095.                     </p>
  1096.                   ) : null}
  1097.  
  1098.                   <p className="pb-2 text-[14px] xs:text-[15px] md:text-[16px]">
  1099.                     {orderDataById?.offline_customer_id
  1100.                       ? orderDataById?.offline_customers?.phone
  1101.                       : orderDataById?.users?.phone}
  1102.                   </p>
  1103.                 </div>
  1104.                 <div className="basis-[10%] sm:basis-[15%] flex flex-col justify-center items-center">
  1105.                   {orderDataById?.offline_customer_id ? (
  1106.                     <KlassyImage
  1107.                       className="w-5 h-5 col-span-1 md:w-7 md:h-7"
  1108.                       alt="Klassy Order Image"
  1109.                       width="24px"
  1110.                       height="24px"
  1111.                       src={prefixImagePath(
  1112.                         orderDataById?.offline_customers &&
  1113.                           orderDataById?.offline_customers?.customer_lebels &&
  1114.                           orderDataById?.offline_customers?.customer_lebels
  1115.                             ?.icon
  1116.                       )}
  1117.                     />
  1118.                   ) : (
  1119.                     <KlassyImage
  1120.                       className="w-5 h-5 col-span-1 md:w-7 md:h-7"
  1121.                       alt="Klassy Order Image"
  1122.                       width="28px"
  1123.                       height="28px"
  1124.                       src={prefixImagePath(
  1125.                         orderDataById?.users &&
  1126.                           orderDataById?.users?.customer_lebels &&
  1127.                           orderDataById?.users?.customer_lebels?.icon
  1128.                       )}
  1129.                     />
  1130.                   )}
  1131.                   <p className="text-center text-black text-[11px] sm:text-[12px] md:text-sm">
  1132.                     {orderDataById?.offline_customer_id
  1133.                       ? orderDataById.offline_customers.customer_lebels &&
  1134.                         orderDataById?.offline_customers?.customer_lebels?.name
  1135.                       : orderDataById?.users?.customer_lebels &&
  1136.                         orderDataById?.users?.customer_lebels?.name}
  1137.                   </p>
  1138.                 </div>
  1139.               </div>
  1140.  
  1141.               <div className="flex items-center justify-center w-full align-middle sm:hidden">
  1142.                 <button
  1143.                   onClick={() => {
  1144.                     orderDataById?.offline_customer_id
  1145.                       ? handleModalForTag(
  1146.                           orderDataById?.offline_customer_id,
  1147.                           "offline"
  1148.                         )
  1149.                       : handleModalForTag(orderDataById?.user_id, "online");
  1150.                   }}
  1151.                   className="bg-[#D9D9D9] text-black sm:hidden block px-1 border rounded-md ml-2 text-[10px]"
  1152.                 >
  1153.                   <FaTags className="inline" /> Add Tag
  1154.                 </button>
  1155.               </div>
  1156.             </div>
  1157.  
  1158.             {/* {orderDataById?.additional_info && (
  1159.               <div className="block shadow-[1px 1px 4px 0px rgba(0, 0, 0, 0.15)] min-h-[100px] rounded-md sm:mr-3 sm:mb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529] text-black dark:text-gray-300">
  1160.                 <div className="px-6 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1161.                   <BsFillInfoCircleFill className="inline w-5 h-5 mr-2 text-black " />
  1162.                   <span className="font-bold">Delivery Notes</span>
  1163.                 </div>
  1164.                 <div className="px-4 py-3 text-[14px] xs:text-[15px] md:text-[16px]">
  1165.                   <ul>
  1166.                     <li>{orderDataById?.additional_info}</li>
  1167.                   </ul>
  1168.                 </div>
  1169.               </div>
  1170.             )} */}
  1171.           </div>
  1172.  
  1173.           <div className="md:basis-[32%]">
  1174.             <div className="block drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] rounded-md sm:mr-3 sm:mb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529] text-black dark:text-gray-300">
  1175.               <div className="px-5 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1176.                 <GrCreditCard className="inline w-5 h-5 mr-2" />
  1177.                 <span className="font-bold ">Payment Details</span>
  1178.               </div>
  1179.               <div className="px-5 py-3 flex flex-row text-[14px] xs:text-[15px] md:text-[16px]">
  1180.                 <div className="basis-[53%] ">
  1181.                   <p className="pb-4 font-semibold">Payment Method : </p>
  1182.  
  1183.                   {orderDataById.payment_method == "bkash" ? (
  1184.                     orderDataById?.payment_details !== null ||
  1185.                     orderDataById?.payment_response.length > 0 ? (
  1186.                       <>
  1187.                         <p className="pb-4 font-semibold">TrxID : </p>
  1188.                         <p className="pb-4 font-semibold">bKash Number :</p>
  1189.                         <p className="pb-4 font-semibold">Payment Time :</p>
  1190.                         <p className="pb-4 font-semibold">Payment Date :</p>
  1191.                       </>
  1192.                     ) : null
  1193.                   ) : null}
  1194.                 </div>
  1195.                 <div className="basis-[47%] text-[14px] xs:text-[15px] md:text-[16px]">
  1196.                   <p className="pb-4 font-semibold">
  1197.                     {orderDataById?.payment_method
  1198.                       ?.replace(/_/g, " ")
  1199.                       ?.replace(/\b\w/g, (match) => match.toUpperCase())}
  1200.                   </p>
  1201.                   {orderDataById.payment_method == "bkash" ? (
  1202.                     orderDataById.payment_response.length == 0 ||
  1203.                     orderDataById?.payment_details !== null ? (
  1204.                       <>
  1205.                         <p className="pb-4">
  1206.                           {JSON.parse(orderDataById?.payment_details)?.trxID}
  1207.                         </p>
  1208.                         <p className="pb-4">
  1209.                           {
  1210.                             JSON.parse(orderDataById?.payment_details)
  1211.                               ?.customerMsisdn
  1212.                           }
  1213.                         </p>
  1214.                         <p className="pb-4">
  1215.                           {JSON.parse(
  1216.                             orderDataById?.payment_details
  1217.                           )?.updateTime.match(/\d{2}:\d{2}:\d{2}/g)}
  1218.                         </p>
  1219.                         <p>
  1220.                           {JSON.parse(
  1221.                             orderDataById?.payment_details
  1222.                           )?.updateTime.match(/\d{4}-\d{2}-\d{2}/g)}
  1223.                         </p>
  1224.                       </>
  1225.                     ) : (
  1226.                       <>
  1227.                         <p className="pb-4">
  1228.                           {orderDataById?.payment_response[0]?.trxID}
  1229.                         </p>
  1230.                         <p className="pb-4">
  1231.                           {orderDataById?.payment_response[0]?.customerMsisdn}
  1232.                         </p>
  1233.                         <p className="pb-4">
  1234.                           {moment(
  1235.                             orderDataById?.payment_response[0].paymentExecuteTime?.replace(
  1236.                               ":008",
  1237.                               ".008"
  1238.                             ),
  1239.                             "YYYY-MM-DDTHH:mm:ss.SSS Z"
  1240.                           ).format("hh:mm:ss A")}
  1241.                         </p>
  1242.                         <p>
  1243.                           {moment(
  1244.                             orderDataById?.payment_response[0].paymentExecuteTime?.replace(
  1245.                               ":008",
  1246.                               ".008"
  1247.                             ),
  1248.                             "YYYY-MM-DDTHH:mm:ss.SSS Z"
  1249.                           ).format("YYYY-MM-DD")}
  1250.                         </p>
  1251.                       </>
  1252.                     )
  1253.                   ) : null}
  1254.                 </div>
  1255.               </div>
  1256.               {getPermissions({
  1257.                 accessKey: "Orders",
  1258.                 component: (
  1259.                   <div className="block w-full pb-5">
  1260.                     {orderDataById?.payment_method == "bkash" &&
  1261.                     orderDataById.payment_status == "paid" &&
  1262.                     orderDataById.refunded == 0 ? (
  1263.                       (orderDataById?.payment_details !== null ||
  1264.                         orderDataById?.payment_response.length > 0) && (
  1265.                         <button
  1266.                           onClick={() => setOpenRefundModal(true)}
  1267.                           className="py-2 block text-center px-4 w-[70%] m-auto border rounded-md bg-[#C60000]"
  1268.                         >
  1269.                           <FaShareSquare className="inline w-5 h-5 mr-2 text-white" />
  1270.                           <span className="text-white font-bold text-sm sm:text-[15px] text-center">
  1271.                             Refund Payment
  1272.                           </span>
  1273.                         </button>
  1274.                       )
  1275.                     ) : orderDataById.refunded === 1 ? (
  1276.                       <p className="py-2 block text-center px-4 w-[70%] m-auto border rounded-md bg-[#C60000]">
  1277.                         <span className="text-white">Refunded</span>
  1278.                       </p>
  1279.                     ) : null}
  1280.                   </div>
  1281.                 ),
  1282.                 childAccess: "can_refund",
  1283.               })}
  1284.             </div>
  1285.  
  1286.             <div className="block drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] rounded-md sm:mr-3 sm:mb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529] text-black dark:text-gray-300">
  1287.               <div className="px-5 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1288.                 <BiSolidShoppingBag className="inline w-5 h-5 mr-2" />
  1289.                 <span className="font-bold">Order Details</span>
  1290.                 {orderDataById?.is_exchange && (
  1291.                   <span className="px-2 py-1 ml-3 text-white bg-blue-400 rounded-md">
  1292.                     Exchange
  1293.                   </span>
  1294.                 )}
  1295.               </div>
  1296.               <div className="grid items-center justify-center grid-cols-2 gap-5 px-5 py-3 align-middle">
  1297.                 <div className="col-span-1 text-[12px] xs:text-[13px] md:text-[14px]">
  1298.                   <p className="pb-2">Order CODE: </p>
  1299.                   <p className="pb-2">Order Date: </p>
  1300.                   <p className="pb-2">Order Time: </p>
  1301.                 </div>
  1302.                 <div className="col-span-1 text-[12px] xs:text-[13px] md:text-[14px]">
  1303.                   <p className="pb-2">{orderDataById?.code}</p>
  1304.                   <p className="pb-2">
  1305.                     {new Date(orderDataById?.created_at).toLocaleDateString(
  1306.                       "en-US",
  1307.                       { year: "numeric", day: "numeric", month: "short" }
  1308.                     )}
  1309.                   </p>
  1310.                   <p className="pb-2">
  1311.                     {new Date(orderDataById?.created_at).toLocaleTimeString(
  1312.                       "en-US",
  1313.                       {
  1314.                         hour12: true,
  1315.                         hour: "2-digit",
  1316.                         minute: "2-digit",
  1317.                         second: "2-digit",
  1318.                       }
  1319.                     )}
  1320.                   </p>
  1321.                 </div>
  1322.               </div>
  1323.             </div>
  1324.           </div>
  1325.           <div className="md:basis-[28%] ">
  1326.             <AdminPanelNotes orderDataById={orderDataById} />
  1327.  
  1328.             {orderDataById.refunded == 1 &&
  1329.               orderDataById?.refund_response.length > 0 && (
  1330.                 <div className="block drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] rounded-md  sm:mb-2 mt-2 mb-[1.5rem] bg-white dark:bg-[#222529] text-black dark:text-gray-300">
  1331.                   <div className="px-5 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1332.                     <BiSolidShoppingBag className="inline w-5 h-5 mr-2" />
  1333.                     <span className="font-bold">Refund Details</span>
  1334.                   </div>
  1335.                   <div className="grid items-center justify-center grid-cols-2 gap-5 px-5 py-3 align-middle">
  1336.                     <div className="col-span-1 text-[12px] xs:text-[13px] md:text-[14px]">
  1337.                       <p className="pb-2">Refund Amount: </p>
  1338.                       <p className="pb-2">Refund TrxID: </p>
  1339.                       <p className="pb-2">Refund Date: </p>
  1340.                       <p className="pb-2">Refund Time: </p>
  1341.                     </div>
  1342.                     <div className="col-span-1 text-[12px] xs:text-[13px] md:text-[14px]">
  1343.                       <p className="pb-2">
  1344.                         {orderDataById?.refund_response[0]?.amount} TK
  1345.                       </p>
  1346.                       <p className="pb-2">
  1347.                         {orderDataById?.refund_response[0]?.refundTrxID}
  1348.                       </p>
  1349.                       <p className="pb-2">
  1350.                         {moment(
  1351.                           orderDataById?.refund_response[0].completedTime?.replace(
  1352.                             ":008",
  1353.                             ".008"
  1354.                           ),
  1355.                           "YYYY-MM-DDTHH:mm:ss.SSS Z"
  1356.                         ).format("YYYY-MM-DD")}
  1357.                       </p>
  1358.                       <p className="pb-2">
  1359.                         {moment(
  1360.                           orderDataById?.refund_response[0].completedTime?.replace(
  1361.                             ":008",
  1362.                             ".008"
  1363.                           ),
  1364.                           "YYYY-MM-DDTHH:mm:ss.SSS Z"
  1365.                         ).format("hh:mm:ss A")}
  1366.                       </p>
  1367.                     </div>
  1368.                   </div>
  1369.                 </div>
  1370.               )}
  1371.           </div>
  1372.         </div>
  1373.         <div ref={OrderContainerRef} className=" sm:flex sm:flex-row">
  1374.           <div className="block sm:basis-[72%] sm:mr-3 sm:mb-5 mt-2 mb-[1.5rem] drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] rounded-md">
  1375.             <div className="block rounded-md bg-white dark:bg-[#222529]  text-black dark:text-gray-300  sticky top-3">
  1376.               <div className="items-center justify-between align-middle border-b md:flex border-neutral-200 dark:border-gray-400">
  1377.                 <div className="px-6 pt-6 pb-2 md:pb-4">
  1378.                   <BiDetail className="inline w-6 h-6 mr-2 " />
  1379.                   <span className="font-bold">Order Product Details</span>
  1380.                 </div>
  1381.                 {orderDataById.delivery_status !==
  1382.                 "order_placed" ? null : openEditProduct ? (
  1383.                   <div className="flex items-center justify-center mb-3 mr-3 align-middle md:mb-0">
  1384.                     <button
  1385.                       onClick={() => setOpenProductAddModal(true)}
  1386.                       className="bg-black flex justify-center align-middle items-center px-3 py-[6px] text-sm rounded-sm text-white hover:bg-blue-400"
  1387.                     >
  1388.                       <AiFillPlusSquare className="inline w-6 h-6 mr-3 cursor-pointer " />
  1389.                       Add New Product
  1390.                     </button>
  1391.                   </div>
  1392.                 ) : (
  1393.                   <div className="flex items-center justify-center mt-2 mb-3 mr-0 align-middle md:mb-0 xs:mt-0 md:mr-3">
  1394.                     <div
  1395.                       className="cursor-pointer hover:bg-gray-100  dark:hover:bg-gray-700 border-[0.5px] px-2 border-gray-400 rounded-sm flex justify-center align-middle items-center"
  1396.                       onClick={() => setOpenEditProduct(true)}
  1397.                     >
  1398.                       Edit
  1399.                       <FaEdit className="ml-2" />
  1400.                     </div>
  1401.                   </div>
  1402.                 )}
  1403.               </div>
  1404.  
  1405.               {openEditProduct ? (
  1406.                 <EditOrderDataTableByID
  1407.                   productData={productData}
  1408.                   setProductData={setProductData}
  1409.                   orderData={orderDataById}
  1410.                   addNewProduct={openProductAddModal}
  1411.                   handleAddProduct={handleAddProduct}
  1412.                   handleClose={() => {
  1413.                     setOpenEditProduct(false);
  1414.                     setOpenProductAddModal(false);
  1415.                     handleResetClick(OrderContainerRef.current);
  1416.                   }}
  1417.                   handleDeleteProduct={handleDeleteModal}
  1418.                   // handleSave={handleSave}
  1419.                   handleQtyUpdate={handleQtyUpdate}
  1420.                 />
  1421.               ) : (
  1422.                 <OrderDataTableById orderData={orderDataById} />
  1423.               )}
  1424.             </div>
  1425.           </div>
  1426.  
  1427.           <div className="block basis-[28%] sm:mb-2 mt-2 mb-[1.5rem] rounded-md bg-[#F4F6F9] dark:bg-[#14181d]">
  1428.             <div className="block rounded-md mb-3 drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] bg-white dark:bg-[#222529] text-black dark:text-gray-300 ">
  1429.               <div className="px-6 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1430.                 <FaTruckLoading className="inline w-5 h-5 mr-2 " />
  1431.                 <span className="font-bold">Order Timeline</span>
  1432.               </div>
  1433.               {orderDataById?.pathao_webhook_response &&
  1434.                 orderDataById?.pathao_webhook_response?.payload.length > 0 && (
  1435.                   <div className="px-4 py-3">
  1436.                     <div className="flex justify-center">
  1437.                       <Image
  1438.                         src="/images/logo_pathao_courier.svg"
  1439.                         width={80}
  1440.                         height={40}
  1441.                         alt="pathao logo"
  1442.                       />
  1443.                     </div>
  1444.                     <ol className="relative border-l border-green-100 dark:border-gray-700">
  1445.                       {orderDataById?.pathao_webhook_response.payload
  1446.                         .slice()
  1447.                         .reverse()
  1448.                         .map((item, index) => (
  1449.                           <li key={index} className="mt-3 mb-10 ml-4">
  1450.                             <div className="absolute w-3 h-3 bg-green-500 rounded-full mt-1.5 -left-1.5 border border-white dark:border-gray-900 dark:bg-gray-700"></div>
  1451.  
  1452.                             <p>{item?.order_status}</p>
  1453.                             <time className="my-1 text-sm font-normal leading-none text-gray-400 dark:text-gray-500">
  1454.                               {moment(item?.updated_at).format(
  1455.                                 "MMMM Do , YYYY, h:mm:ss a"
  1456.                               )}
  1457.                             </time>
  1458.                           </li>
  1459.                         ))}{" "}
  1460.                     </ol>
  1461.                   </div>
  1462.                 )}
  1463.               <div className="px-4 py-3">
  1464.                 <ol className="relative border-l border-green-100 dark:border-gray-700">
  1465.                   {orderDataById?.order_updates.length > 0 ? (
  1466.                     orderDataById?.order_updates.map((item, index) => {
  1467.                       return (
  1468.                         <li key={index} className="mt-3 mb-10 ml-4">
  1469.                           <div className="absolute w-3 h-3 bg-green-500 rounded-full mt-1.5 -left-1.5 border border-white dark:border-gray-900 dark:bg-gray-700"></div>
  1470.                           <h4>
  1471.                             {item.note
  1472.                               ?.replace(/_/g, " ")
  1473.                               ?.replace(/\b\w/g, (match) =>
  1474.                                 match.toUpperCase()
  1475.                               )}{" "}
  1476.                             by {item?.admin?.full_name}
  1477.                           </h4>
  1478.                           <time className="my-1 text-sm font-normal leading-none text-gray-400 dark:text-gray-500">
  1479.                             {moment(item?.created_at).format(
  1480.                               "MMMM Do , YYYY, h:mm:ss a"
  1481.                             )}
  1482.                           </time>
  1483.                         </li>
  1484.                       );
  1485.                     })
  1486.                   ) : (
  1487.                     <p className="text-sm text-center text-gray-600">
  1488.                       No Order Log Found
  1489.                     </p>
  1490.                   )}
  1491.                 </ol>
  1492.               </div>
  1493.             </div>
  1494.             <div className="block rounded-md drop-shadow-[2px_2px_2px_rgba(0,0,0,0.15)] mt-6 bg-white dark:bg-[#222529] text-black dark:text-gray-300  ">
  1495.               <div className="px-6 pt-6 pb-4 border-b border-neutral-200 dark:border-gray-400">
  1496.                 <FaWarehouse className="inline w-5 h-5 mr-2 " />
  1497.                 <span className="font-bold">Warehouse Timeline</span>
  1498.               </div>
  1499.               <div className="px-4 py-3">
  1500.                 <div className="relative border-l border-green-100 dark:border-gray-700">
  1501.                   {orderDataById?.warehouse_shipping_dispatch_logs.length >
  1502.                   0 ? (
  1503.                     orderDataById?.warehouse_shipping_dispatch_logs.map(
  1504.                       (item, index) => {
  1505.                         const types = ["PICKED", "PACKED"];
  1506.                         return (
  1507.                           <div key={index} className="mt-3 mb-10 ml-4">
  1508.                             <div className="absolute w-3 h-3 bg-green-500 rounded-full mt-1.5 -left-1.5 border border-white dark:border-gray-900 dark:bg-gray-700"></div>
  1509.                             <h5>
  1510.                               <span className="mr-1"> Order</span>
  1511.                               <span className="mr-1">
  1512.                                 {item.types
  1513.                                   ?.replace(/_/g, " ")
  1514.                                   ?.replace(/\b\w/g, (match) =>
  1515.                                     match.toUpperCase()
  1516.                                   )}
  1517.                               </span>
  1518.                               {types.includes(item.types) && (
  1519.                                 <>
  1520.                                   <span className="mr-2 italic">
  1521.                                     {`"${item.products[0].name}"`}
  1522.                                   </span>
  1523.                                   <span className="mr-1 text-center bg-[#D6FFDA] px-[4px] py-[1px] rounded-sm w-fit inline-block">
  1524.                                     <FcApproval className="inline mb-1 mr-1" />
  1525.                                     <span className="text-[#00820D]">
  1526.                                       Verified
  1527.                                     </span>
  1528.                                   </span>
  1529.                                 </>
  1530.                               )}
  1531.                               <span className="mr-1"> by</span>
  1532.                               {item?.admin?.full_name}
  1533.                             </h5>
  1534.                             <time className="my-1 text-sm font-normal leading-none text-gray-400 dark:text-gray-500">
  1535.                               {moment(item?.created_at).format(
  1536.                                 "MMMM Do , YYYY, h:mm:ss a"
  1537.                               )}
  1538.                             </time>
  1539.                           </div>
  1540.                         );
  1541.                       }
  1542.                     )
  1543.                   ) : (
  1544.                     <p className="text-sm text-center text-gray-600">
  1545.                       No Warehouse Log Found{" "}
  1546.                     </p>
  1547.                   )}
  1548.                 </div>
  1549.               </div>
  1550.             </div>
  1551.           </div>
  1552.         </div>
  1553.         <div className="w-[71.5%] drop-shadow-[1px_1px_1px_rgba(0,0,0,0.15)] rounded-md bg-[#F4F6F9] mb-20 mt-5">
  1554.           {/* Add payment section */}
  1555.           <PaymentModal
  1556.             register={register}
  1557.             control={control}
  1558.             handleSubmit={handleSubmit}
  1559.             paymentModalSubmit={paymentModalSubmit}
  1560.             payout={orderDataById?.grand_total}
  1561.             reset={reset}
  1562.           />
  1563.           {orderDataById?.pathao_invoice_transaction_history?.length === 0 ? (
  1564.             <div className="flex items-center justify-between p-6 bg-white">
  1565.               <div>
  1566.                 <h5 className="">Payment Data Missing!</h5>
  1567.                 <p className="text-sm">
  1568.                   No payment data found. Please check or add it manually to mark
  1569.                   the invoice as paid.
  1570.                 </p>
  1571.               </div>
  1572.               <button
  1573.                 className="px-3 py-1 text-white bg-black rounded"
  1574.                 onClick={() => my_modal_2.showModal()}
  1575.               >
  1576.                 Add Payment
  1577.               </button>
  1578.             </div>
  1579.           ) : (
  1580.             <PaymentDetails data={pathaoTranHistory} />
  1581.           )}
  1582.         </div>
  1583.       </div>
  1584.     </div>
  1585.   );
  1586. };
  1587.  
  1588. export default ShowOrder;
  1589.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement