/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useState } from "react"; import CreateOrderFooter from "./CreateOrderFooter"; import HourGlassLoader from "../../../Loader/Loader"; import { useAppSelector } from "@/Redux/Hooks"; import Swal from "sweetalert2"; import { useRouter } from "next/navigation"; import InternationalPhoneInput from "../../../TextField/InternationalPhoneInput"; import { getInternationalDraftOrderDetails, initiateInternationalDraftOrder, placeInternationalOrder, } from "../../../../Api/InternationalOrderApi"; import SelectOptions from "../../../TextField/SelectOptions"; import { getMasterList } from "../../../../Api/MastersApi"; import OrderPlacedModal from "./Step3/OrderPlacedModal"; import AddressList from "../../MyProfile/Containers/AddressList"; import Modal from "../../../Modal/Modal"; import { showSuccess, showError } from "../../../utlits/toast"; type Step4Props = { step: number; setStep: React.Dispatch>; defaultOrderDetails: any; isEditMode?: boolean; onSave: (data: any) => void; }; const Step4: React.FC = ({ step, setStep, defaultOrderDetails, isEditMode, onSave, }) => { const router = useRouter(); const createOrderData: any = useAppSelector((state) => state.createOrder); const step1Data = createOrderData?.step1; const step2Data = createOrderData?.step2; const step3Data = createOrderData?.step3; // eslint-disable-next-line @typescript-eslint/no-unused-vars const step4Data = createOrderData?.step4; const [isLoading, setIsLoading] = useState(false); const [orderPlacedModalVisible, setOrderPlacedModalVisible] = useState(false); const [placedOrderNumber, setPlacedOrderNumber] = useState( "", ); const [pickupDate, setPickupDate] = useState<"Today" | "Tomorrow" | "Custom">( "Today", ); const [pickupTime, setPickupTime] = useState< "Morning" | "Afternoon" | "Evening" >("Morning"); const [customDate, setCustomDate] = useState(""); const getMinCustomDate = () => { const date = new Date(); date.setDate(date.getDate() + 2); // Day after tomorrow return date.toISOString().split("T")[0]; }; const [contactNumber, setContactNumber] = useState( step3Data?.senderPhone || "", ); const [pickupAddress, setPickupAddress] = useState( step3Data?.senderAddress || "", ); const [isEditingContact, setIsEditingContact] = useState(false); const [countries, setCountries] = useState([]); const [goodsOrigin, setGoodsOrigin] = useState( step1Data?.fromCountry || null, ); const [isEditingGoodsOrigin, setIsEditingGoodsOrigin] = useState(false); const [showAddressList, setShowAddressList] = useState(false); const [pickupAddressId, setPickupAddressId] = useState(null); React.useEffect(() => { const fetchCountries = async () => { const res = await getMasterList("country"); if (res?.status) { setCountries( res.data.map((c: any) => ({ value: c.id, label: c.name, name: c.name, code: c.code, })), ); } }; fetchCountries(); }, []); const handlePlaceOrder = async () => { setIsLoading(true); try { // Construct final payload const payload = { draft_order_id: step1Data.draft_order_id, goods_origin_country_id: goodsOrigin?.value, pickup_date: pickupDate === "Custom" ? customDate : getPickupDateString(pickupDate), pickup_slot_type: pickupTime === "Morning" ? 1 : pickupTime === "Afternoon" ? 2 : 3, pickup_contact_number: contactNumber, pickup_address: pickupAddress, pickup_address_id: pickupAddressId, }; console.log("Placing Order with Payload:", payload); const response = await placeInternationalOrder(payload); if (response.status) { // Swal.fire({ // icon: "success", // title: "Order Placed!", // text: "Your international order has been successfully created.", // confirmButtonText: "Go to Dashboard", // }).then(() => { // }); const orderNo = response?.data?.order_no || response?.data?.orderNumber || response?.data?.id || response?.data || ""; setPlacedOrderNumber(orderNo); setOrderPlacedModalVisible(true); } else { throw new Error(response.message || "Failed to place order"); } } catch (error: any) { console.error("Order placement failed:", error); Swal.fire({ icon: "error", title: "Oops...", text: error.message || "Something went wrong while placing your order.", }); } finally { setIsLoading(false); } }; const allData = JSON.parse(localStorage.getItem("ALL_DATA") || "{}"); // eslint-disable-next-line @typescript-eslint/no-unused-vars const handleAddressSelect = () => { const addresses = allData?.data?.addresses || []; const primaryAddress = addresses.find((addr: any) => addr.is_primary) || addresses[0] || null; const address = primaryAddress || null; const addressId = address?.id || null; setPickupAddressId(addressId); setPickupAddress( `${address?.addressLineOne || ""}${address?.addressLineTwo ? `, ${address.addressLineTwo}` : ""}, ${address?.building?.code || ""}${address?.building?.name ? ` - ${address.building.name}` : ""}, ${address?.road?.code || ""}${address?.road?.name ? ` - ${address.road.name}` : ""}, ${address?.block?.code || ""}${address?.block?.name ? ` - ${address.block.name}` : ""}`, ); // Save pickup_address_id to Redux if (onSave) { onSave({ pickup_address_id: addressId, }); } setShowAddressList(false); }; const toggleAddressList = async () => { setShowAddressList((prev) => !prev); try { const addresses = allData?.data?.addresses || []; const primaryAddress = addresses.find((addr: any) => addr.is_primary) || addresses[0] || null; const address = primaryAddress || null; const addressId = address?.id || null; setPickupAddress( `${address?.addressLineOne || ""}${address?.addressLineTwo ? `, ${address.addressLineTwo}` : ""}, ${address?.building?.code || ""}${address?.building?.name ? ` - ${address.building.name}` : ""}, ${address?.road?.code || ""}${address?.road?.name ? ` - ${address.road.name}` : ""}, ${address?.block?.code || ""}${address?.block?.name ? ` - ${address.block.name}` : ""}`, ); // Save pickup_address_id to Redux if (onSave) { onSave({ pickup_address_id: addressId, }); } const step1 = JSON.parse( localStorage.getItem("CREATE_INTL_STEP1") || "{}", ); const payload = { draft_order_id: step1.draft_order_id, pickup_address_id: addressId, package_details: step1.package_details?.map((pkg: any) => ({ weight: Number(pkg.weight), length: Number(pkg.length), width: Number(pkg.width), height: Number(pkg.height), package_description: pkg.package_description || "", customer_input_package_value: Number( pkg.customer_input_package_value, ), })), }; const response = await initiateInternationalDraftOrder(payload); if (response.status) // ✅ SUCCESS TOAST showSuccess("Pickup address updated successfully"); else showError("Failed to update pickup address"); } catch (error: any) { console.error(error); // ❌ ERROR TOAST (API + validation safe) showError( error?.response?.data?.message || error?.message || "Failed to update draft order", ); } }; const handlePickupContactUpdate = async (_phone_no: string) => { try { const step1 = JSON.parse( localStorage.getItem("CREATE_INTL_STEP1") || "{}", ); const payload = { draft_order_id: step1.draft_order_id, pickup_mobile_number: _phone_no, package_details: step1.package_details?.map((pkg: any) => ({ weight: Number(pkg.weight), length: Number(pkg.length), width: Number(pkg.width), height: Number(pkg.height), package_description: pkg.package_description || "", customer_input_package_value: Number( pkg.customer_input_package_value, ), })), }; const response = await initiateInternationalDraftOrder(payload); if (response.status) // ✅ SUCCESS TOAST showSuccess("Pickup contact number updated successfully"); else showError("Failed to update pickup contact number"); } catch (error: any) { console.error(error); // ❌ ERROR TOAST (API + validation safe) showError( error?.response?.data?.message || error?.message || "Failed to update draft order", ); } }; const handleUpdatePickupTime = async ( _time: "Morning" | "Afternoon" | "Evening", ) => { try { const step1Raw = localStorage.getItem("CREATE_INTL_STEP1"); if (!step1Raw) { throw new Error("Draft order not found"); } const step1 = JSON.parse(step1Raw); const payload = { draft_order_id: step1.draft_order_id, pickup_slot_type: _time === "Morning" ? 1 : _time === "Afternoon" ? 2 : 3, package_details: step1.package_details?.map((pkg: any) => ({ weight: Number(pkg.weight), length: Number(pkg.length), width: Number(pkg.width), height: Number(pkg.height), package_description: pkg.package_description || "", customer_input_package_value: Number( pkg.customer_input_package_value, ), })), }; const response = await initiateInternationalDraftOrder(payload); if (!response?.status) { throw new Error("Failed to update pickup time"); } setPickupTime(_time); showSuccess("Pickup time updated successfully"); } catch (error: any) { console.error(error); showError( error?.response?.data?.message || error?.message || "Failed to update pickup time", ); } }; const handleGoodOriginUpdate = async (_country_id: number) => { try { const step1 = JSON.parse( localStorage.getItem("CREATE_INTL_STEP1") || "{}", ); const payload = { draft_order_id: step1.draft_order_id, goods_origin_country_id: _country_id, package_details: step1.package_details?.map((pkg: any) => ({ weight: Number(pkg.weight), length: Number(pkg.length), width: Number(pkg.width), height: Number(pkg.height), package_description: pkg.package_description || "", customer_input_package_value: Number( pkg.customer_input_package_value, ), })), }; const response = await initiateInternationalDraftOrder(payload); if (response.status) // ✅ SUCCESS TOAST showSuccess("Goods origin updated successfully"); else showError("Failed to update goods origin"); } catch (error: any) { console.error(error); // ❌ ERROR TOAST (API + validation safe) showError( error?.response?.data?.message || error?.message || "Failed to update draft order", ); } }; const resolvePickupDate = ( type: "Today" | "Tomorrow" | "Custom", _customDate?: string, ) => { const today = new Date(); if (type === "Today") { return today.toISOString().slice(0, 10); } if (type === "Tomorrow") { today.setDate(today.getDate() + 1); return today.toISOString().slice(0, 10); } if (type === "Custom") { const dateToUse = _customDate || customDate; if (!dateToUse) { throw new Error("Please select a pickup date"); } return dateToUse; } throw new Error("Invalid pickup date"); }; const handleUpdatePickupDate = async ( _date: "Today" | "Tomorrow" | "Custom", _customDate?: string, ) => { try { const step1Raw = localStorage.getItem("CREATE_INTL_STEP1"); if (!step1Raw) { throw new Error("Draft order not found"); } const step1 = JSON.parse(step1Raw); // 🔐 Resolve actual pickup date const pickup_date = resolvePickupDate(_date, _customDate); const payload = { draft_order_id: step1.draft_order_id, pickup_date, package_details: step1.package_details?.map((pkg: any) => ({ weight: Number(pkg.weight), length: Number(pkg.length), width: Number(pkg.width), height: Number(pkg.height), package_description: pkg.package_description || "", customer_input_package_value: Number( pkg.customer_input_package_value, ), })), }; const response = await initiateInternationalDraftOrder(payload); if (!response?.status) { throw new Error("Failed to update pickup date"); } // ✅ Update state ONLY after success setPickupDate(_date); showSuccess("Pickup date updated successfully"); } catch (error: any) { console.error(error); showError( error?.response?.data?.message || error?.message || "Failed to update pickup date", ); } }; const [step4Detail, setStep4Data] = useState(null); React.useEffect(() => { const loadDraftDetails = async () => { try { const draftOrderId = step1Data?.draft_order_id; if (!draftOrderId) return; const res = await getInternationalDraftOrderDetails(draftOrderId); if (res?.status) { const data = res.data; setStep4Data(data); // ✅ Optional: save to localStorage (refresh-safe) localStorage.setItem("CREATE_INTL_STEP4", JSON.stringify(data)); // ✅ Hydrate local states } } catch (err) { console.error("Failed to load step4 data", err); } }; loadDraftDetails(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const stepPreview = JSON.parse( localStorage.getItem("CREATE_INTL_STEP4") || "{}", ); return ( <> {isLoading && } { setOrderPlacedModalVisible(false); router.push("/dashboard/orders"); }} onHome={() => { setOrderPlacedModalVisible(false); router.push("/dashboard"); }} onClose={() => setOrderPlacedModalVisible(false)} />
{/* Left Column: Order Summary */}
{/* From & To */}
From
{step3Data?.senderName}
{step3Data?.senderPhone}
{step3Data?.senderEmail}
{step3Data?.senderAddress} {step3Data?.senderAddress2 && `, ${step3Data.senderAddress2}`}
{step3Data?.senderCity?.label}, {step3Data?.senderState}{" "} {step3Data?.senderPostalCode}
{step3Data?.senderCountry?.label}
To
{step3Data?.receiverName}
{step3Data?.receiverPhone}
{step3Data?.receiverEmail}
{step3Data?.receiverAddress} {step3Data?.receiverAddress2 && `, ${step3Data.receiverAddress2}`}
{step3Data?.receiverCity?.label},{" "} {step3Data?.receiverState}{" "} {step3Data?.receiverPostalCode}
{step3Data?.receiverCountry?.label}

{/* Details List */}
Tax ID/VAT/EIN Number {step3Data?.senderTaxId || "TXN000001"}
Package Type {step1Data?.shipmentContent}
Number of Packages {step1Data?.noOfPackages}
Weight {stepPreview?.totalWeight ?? 0} KG
Goods Origin {!isEditingGoodsOrigin ? (
{goodsOrigin?.name || "--"} { setIsEditingGoodsOrigin(true); }} >
) : (
{ setGoodsOrigin(val); handleGoodOriginUpdate(val?.id); }} placeholder="Select Country" /> setIsEditingGoodsOrigin(false)} >
)}
Country {step1Data?.toCountry?.name}
City {step1Data?.toCity?.name || "--"}
{/*
Remarks {step2Data?.remarks || "--"}
*/}
{/* Right Column: Schedule Pickup */}
Schedule Pickup
No. of Packages {String(step1Data?.noOfPackages).padStart(2, "0")}
Total Weight {stepPreview?.totalWeight ?? 0} Kg
Shipping Charge
{step2Data?.selectedServiceDetails?.currency}{" "} {step4Detail?.calculatedTotalShippingCharge?.toFixed(3) ?? step2Data?.selectedServiceDetails?.price?.toFixed(3)}
{!isEditingContact ? (
{contactNumber}
setIsEditingContact(true)} >
) : (
{ setContactNumber(val); }} placeholder="Contact Number" className="bg-light" /> { setIsEditingContact(false); handlePickupContactUpdate(contactNumber); }} >
)}
{pickupAddress || "Select pickup address"}
setShowAddressList(true)} >
{["Today", "Tomorrow", "Custom"].map((opt) => ( ))}
{pickupDate === "Custom" && ( { setCustomDate(e.target.value); handleUpdatePickupDate("Custom", e.target.value); }} /> )}
{["Morning", "Afternoon", "Evening"].map((opt) => ( ))}
{ if (nextStep === 5) { await handlePlaceOrder(); } else { setStep(nextStep); } }} validation={() => true} backButton={true} backButtonFn={() => setStep(3)} defaultOrderDetails={defaultOrderDetails} isEditMode={isEditMode} // validation={() => !isEditingGoodsOrigin} // nextButtonText="PLACE ORDER" /> ); }; export default Step4; const getPickupDateString = (type: "Today" | "Tomorrow") => { const date = new Date(); if (type === "Tomorrow") { date.setDate(date.getDate() + 1); } return date.toISOString().split("T")[0]; };