/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useEffect, useState } from "react"; import CreateOrderFooter from "./CreateOrderFooter"; import SelectOptions, { OptionType } from "../../../TextField/SelectOptions"; import InternationalPhoneInput from "../../../TextField/InternationalPhoneInput"; import { useAppSelector } from "@/Redux/Hooks"; import { getMasterList, getInternationalCities, } from "../../../../Api/MastersApi"; import { initiateInternationalDraftOrder } from "../../../../Api/InternationalOrderApi"; import { resolveCountryCode } from "../../../../lib/Helper"; type Step3Props = { onSave: (data: any) => void; step: number; setStep: React.Dispatch>; defaultOrderDetails: any; isEditMode?: boolean; }; const Step3: React.FC = ({ onSave, step, setStep, defaultOrderDetails, isEditMode, }) => { const createOrderData: any = useAppSelector((state) => state.createOrder); const step1Data = createOrderData?.step1; const step3Data = createOrderData?.step3; console.log(createOrderData?.step1, 'createOrderData?.step1') const [isLoading, setIsLoading] = useState(false); // --- Sender State --- const [senderName, setSenderName] = useState( step3Data?.senderName || "" ); const [senderTaxId, setSenderTaxId] = useState( step3Data?.senderTaxId || "" ); const [senderCountry, setSenderCountry] = useState( step3Data?.senderCountry || step1Data?.fromCountry || null ); const [senderCity, setSenderCity] = useState( step3Data?.senderCity || step1Data?.fromCity || null ); const [senderState, setSenderState] = useState( step3Data?.senderState || "" ); const [senderPostalCode, setSenderPostalCode] = useState( step3Data?.senderPostalCode || "" ); const [senderPhone, setSenderPhone] = useState( step3Data?.senderPhone || "" ); const [senderAltPhone, setSenderAltPhone] = useState( step3Data?.senderAltPhone || "" ); const [senderEmail, setSenderEmail] = useState( step3Data?.senderEmail || "" ); const [senderAddress, setSenderAddress] = useState( step3Data?.senderAddress || "" ); const [senderAddress2, setSenderAddress2] = useState( step3Data?.senderAddress2 || "" ); const [saveSender, setSaveSender] = useState( step3Data?.saveSender ?? false ); // --- Receiver State --- const [receiverName, setReceiverName] = useState( step3Data?.receiverName || "" ); const [receiverTaxId, setReceiverTaxId] = useState( step3Data?.receiverTaxId || "" ); const [receiverCountry, setReceiverCountry] = useState( step3Data?.receiverCountry || step1Data?.toCountry || null ); const [receiverCity, setReceiverCity] = useState( step3Data?.receiverCity || step1Data?.toCity || null ); const [receiverState, setReceiverState] = useState( step3Data?.receiverState || "" ); const [receiverPostalCode, setReceiverPostalCode] = useState( step3Data?.receiverPostalCode || "" ); const [receiverPhone, setReceiverPhone] = useState( step3Data?.receiverPhone || "" ); const [receiverAltPhone, setReceiverAltPhone] = useState( step3Data?.receiverAltPhone || "" ); const [receiverEmail, setReceiverEmail] = useState( step3Data?.receiverEmail || "" ); const [receiverAddress, setReceiverAddress] = useState( step3Data?.receiverAddress || "" ); const [receiverAddress2, setReceiverAddress2] = useState( step3Data?.receiverAddress2 || "" ); const [saveReceiver, setSaveReceiver] = useState( step3Data?.saveReceiver ?? false ); // --- Lists --- const [countries, setCountries] = useState([]); const [senderCities, setSenderCities] = useState([]); const [receiverCities, setReceiverCities] = useState([]); // --- Effects --- useEffect(() => { const fetchCountries = async () => { try { const response = await getMasterList("country"); if (response?.status) { const countryOptions = response.data.map((c: any) => ({ value: c.id, label: c.name, code: c.code ?? c.shortCode, name: c.name, id: c.id, })); setCountries(countryOptions); } } catch (err) { console.error("Error fetching countries:", err); } }; fetchCountries(); }, []); // helper to fetch cities const fetchCitiesFor = async ( country: OptionType | null, setCities: React.Dispatch> ) => { if (!country) { setCities([]); return; } try { const response = await getInternationalCities({ country_id: country.value, }); if (response?.status) { setCities( response.data.map((c: any) => ({ value: c.id, label: c.name, name: c.name, id: c.id, })) ); } else { setCities([]); } } catch (err) { console.error("Error fetching cities:", err); setCities([]); } }; useEffect(() => { fetchCitiesFor(senderCountry, setSenderCities); }, [senderCountry]); useEffect(() => { fetchCitiesFor(receiverCountry, setReceiverCities); }, [receiverCountry]); // --- Handlers --- const handleClearSender = () => { setSenderName(""); setSenderTaxId(""); // Keep country/city as they are likely correct from Step 1 setSenderState(""); setSenderPostalCode(""); setSenderPhone(""); setSenderAltPhone(""); setSenderEmail(""); setSenderAddress(""); setSenderAddress2(""); }; const handleClearReceiver = () => { setReceiverName(""); setReceiverTaxId(""); // Keep country/city as they are likely correct from Step 1 setReceiverState(""); setReceiverPostalCode(""); setReceiverPhone(""); setReceiverAltPhone(""); setReceiverEmail(""); setReceiverAddress(""); setReceiverAddress2(""); }; const validateStep3 = async () => { if (isLoading) return false; // prevent duplicate submissions // ensure step1 exists if (!step1Data) { window.alert("Please complete Step 1 before proceeding."); return false; } // Basic validation if ( !senderName || !senderPhone || !senderAddress || !senderCountry || !senderCity || !receiverName || !receiverPhone || !receiverAddress || !receiverCountry || !receiverCity ) { window.alert("Please fill all required fields in From and To sections."); return false; } const payload = { id: step1Data?.draft_order_id, from_country_id: senderCountry?.value || step1Data?.fromCountry?.value, to_country_id: receiverCountry?.value || step1Data?.toCountry?.value, from_city_id: senderCity?.value || step1Data?.fromCity?.value, to_city_id: receiverCity?.value || step1Data?.toCity?.value, shipment_content: step1Data?.shipmentContent, no_of_packages: step1Data?.noOfPackages, total_weight: step1Data?.totalWeight, total_value: step1Data?.totalValue, package_details: (step1Data?.packageDetails || []).map((pkg: any) => ({ weight: parseFloat(pkg.weight || 0), length: parseFloat(pkg.length || 0), width: parseFloat(pkg.width || 0), height: parseFloat(pkg.height || 0), package_description: pkg.package_description, customer_input_package_value: parseFloat( pkg.customer_input_package_value || 0 ), })), // Step 2 Data (Service/Carrier) - guard values carrier: createOrderData.step2?.selectedCarrierDetails?.name || null, service_code: createOrderData.step2?.selectedServiceDetails?.id || null, service_name: createOrderData.step2?.selectedServiceDetails?.name || null, shipping_charge: createOrderData.step2?.selectedServiceDetails?.price ?? null, currency: createOrderData.step2?.selectedServiceDetails?.currency ?? null, // Step 3 Data (Sender/Receiver) sender_name: senderName, sender_company_name: "", // Add field if needed sender_email: senderEmail, sender_phone: senderPhone, sender_alt_phone: senderAltPhone, sender_address: senderAddress, sender_address_2: senderAddress2, sender_city_id: senderCity?.value, sender_postal_code: senderPostalCode, sender_state: senderState, receiver_name: receiverName, receiver_company_name: "", // Add field if needed receiver_email: receiverEmail, receiver_phone: receiverPhone, receiver_alt_phone: receiverAltPhone, receiver_address: receiverAddress, receiver_address_2: receiverAddress2, receiver_city_id: receiverCity?.value, receiver_postal_code: receiverPostalCode, receiver_state: receiverState, }; try { setIsLoading(true); const response = await initiateInternationalDraftOrder(payload); if (response?.status) { // pass saved values back (include API response if useful) onSave({ senderName, senderTaxId, senderCountry, senderCity, senderState, senderPostalCode, senderPhone, senderAltPhone, senderEmail, senderAddress, senderAddress2, saveSender, receiverName, receiverTaxId, receiverCountry, receiverCity, receiverState, receiverPostalCode, receiverPhone, receiverAltPhone, receiverEmail, receiverAddress, receiverAddress2, saveReceiver, apiResponse: response.data ?? null, }); return true; } else { console.error("Failed to update draft:", response?.message); window.alert(response?.message || "Failed to update draft order."); return false; } } catch (error) { console.error("Error updating draft:", error); window.alert("An error occurred while updating draft. Please try again."); return false; } finally { setIsLoading(false); } }; console.log({senderCountry, receiverCountry}) return ( <>
{/* Sender Section (From) */}
From
setSenderName(e.target.value)} placeholder="Name" />
setSenderTaxId(e.target.value)} placeholder="Tax ID/VAT/EIN Number" />
setSenderCountry(val)} placeholder="Select Country" divClassName="mb-0" style={{ control: (base: any) => ({ ...base, borderRadius: "10px", height: "45px", paddingLeft: "35px", border: "1px solid #dee2e6", boxShadow: "none", "&:hover": { borderColor: "#dee2e6" }, }), }} />
setSenderCity(val)} placeholder="Select City" divClassName="mb-0" style={{ control: (base: any) => ({ ...base, borderRadius: "10px", height: "45px", paddingLeft: "35px", border: "1px solid #dee2e6", boxShadow: "none", "&:hover": { borderColor: "#dee2e6" }, }), }} />
setSenderPostalCode(e.target.value)} placeholder="Postal Code" />
setSenderState(e.target.value)} placeholder="State" />
setSenderPhone(val)} placeholder="Mobile Number" country={resolveCountryCode(senderCountry, countries)} />
setSenderAltPhone(val)} placeholder="Alternative Mobile Number" country={resolveCountryCode(senderCountry, countries)} />
setSenderEmail(e.target.value)} placeholder="Email Address" />
setSenderAddress(e.target.value)} placeholder="Address Line 1" />
setSenderAddress2(e.target.value)} placeholder="Address Line 2" />
setSaveSender(e.target.checked)} />
{/* Receiver Section (To) */}
To
setReceiverName(e.target.value)} placeholder="Name" />
setReceiverTaxId(e.target.value)} placeholder="Tax ID/VAT/EIN Number" />
setReceiverCountry(val)} placeholder="Select Country" divClassName="mb-0" style={{ control: (base: any) => ({ ...base, borderRadius: "10px", height: "45px", paddingLeft: "35px", border: "1px solid #dee2e6", boxShadow: "none", "&:hover": { borderColor: "#dee2e6" }, }), }} />
setReceiverCity(val)} placeholder="Select City" divClassName="mb-0" style={{ control: (base: any) => ({ ...base, borderRadius: "10px", height: "45px", paddingLeft: "35px", border: "1px solid #dee2e6", boxShadow: "none", "&:hover": { borderColor: "#dee2e6" }, }), }} />
setReceiverPostalCode(e.target.value)} placeholder="Postal Code" />
setReceiverState(e.target.value)} placeholder="State" />
setReceiverPhone(val)} placeholder="Mobile Number" country={resolveCountryCode(receiverCountry, countries)} />
setReceiverAltPhone(val)} placeholder="Alternative Mobile Number" country={resolveCountryCode(receiverCountry, countries)} />
setReceiverEmail(e.target.value)} placeholder="Email Address" />
setReceiverAddress(e.target.value)} placeholder="Address Line 1" />
setReceiverAddress2(e.target.value)} placeholder="Address Line 2" />
setSaveReceiver(e.target.checked)} />
{ if (await validateStep3()) setStep(nextStep); }} validation={validateStep3} backButton={true} backButtonFn={() => setStep(2)} defaultOrderDetails={defaultOrderDetails} isEditMode={isEditMode} /> ); }; export default Step3;