/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { JSX, useEffect } from "react"; import { toast } from "react-toastify"; import "react-toastify/dist/ReactToastify.css"; import { MAX_WEIGHT_TOAST_MESSAGE } from "../../../../utlits/Messages"; import { useSearchParams } from "next/navigation"; interface PackageDetail { package_id: number; weight: string; package_description: string; customer_input_package_value: string; external_package_id?: string; } interface PackageFormProps { noOfPackages: number; onPackagesChange: (value: any) => void; packageDetails: PackageDetail[]; onPackageDetailsChange: (updatedPackages: PackageDetail[]) => void; errors?: { packageCount?: string; noOfPackages?: string; packageDetails?: { [key: number]: any }; // keyed by index }; isEditMode?: boolean; } const PackageForm: React.FC = ({ noOfPackages, onPackagesChange, packageDetails, onPackageDetailsChange, errors = {}, // isEditMode = false }) => { const searchParams: any = useSearchParams(); const packageDisable: string = searchParams.get("packageDisable"); const storedUser = localStorage.getItem("ALL_DATA"); const allData = storedUser ? JSON.parse(storedUser)?.data : null; const [defaultDescription, setDefaultDescription] = React.useState( packageDetails[0]?.package_description || allData?.packageDescription || "" ); const [defaultWeight, setDefaultWeight] = React.useState( packageDetails[0]?.weight || 1 ); // const weightOptions = [ // { id: 4, name: "< 5kg" }, // { id: 29, name: "5kg - 30kg" }, // // { id: 31, name: "> 30kg" }, // ]; // eslint-disable-next-line @typescript-eslint/no-unused-vars const [selectedWeightId, setSelectedWeightId] = React.useState(""); // Initialize selected weight from package details useEffect(() => { if (packageDetails?.[0]?.weight) { setSelectedWeightId(packageDetails[0].weight); setDefaultWeight(packageDetails[0].weight || 1); } }, [packageDetails]); // Initialize package details when component mounts or when noOfPackages changes useEffect(() => { // If no packages, or the number of packages doesn't match, or the first package is empty, initialize if ( packageDetails.length === 0 || packageDetails.length !== noOfPackages || (noOfPackages === 1 && (!packageDetails[0] || Object.values(packageDetails[0]).every((v) => v === "" || v === 0))) ) { const updatedDetails = Array(noOfPackages) .fill(null) .map((_, index) => { if (packageDetails[index]) { return { package_id: packageDetails[index].package_id, weight: packageDetails[index].weight || 1, package_description: packageDetails[index].package_description, customer_input_package_value: packageDetails[index].customer_input_package_value, external_package_id: packageDetails[index].external_package_id || "", }; } // Default package return { package_id: 1, weight: 1, package_description: defaultDescription || "", customer_input_package_value: "0.000", external_package_id: "", }; }) as PackageDetail[]; onPackageDetailsChange(updatedDetails); } }, [ noOfPackages, packageDetails, onPackageDetailsChange, defaultDescription, ]); const handleWeightChange = (index: number, value: string) => { const numValue = Number(value); // Calculate the new total weight if this change is applied const currentTotal = packageDetails.reduce( (sum, pkg, i) => sum + (i === index ? 0 : Number(pkg.weight) || 0), 0 ); const newTotal = currentTotal + (Number(value) || 0); if (newTotal > 30) { toast.warning(MAX_WEIGHT_TOAST_MESSAGE, { position: "top-right", autoClose: 3000, }); return; } if (numValue < 1 && value !== "") { // Optionally set an error here, or handle via validation // For now, just prevent update return; } const updated = [...packageDetails]; updated[index] = { ...updated[index], weight: value, // Ensure defaults if missing package_id: updated[index]?.package_id ?? 1, package_description: updated[index]?.package_description ?? (defaultDescription || ""), customer_input_package_value: updated[index]?.customer_input_package_value ?? "0.000", external_package_id: updated[index]?.external_package_id ?? "", }; onPackageDetailsChange(updated); }; const handleDescriptionChange = (index: number, value: string) => { const updated = [...packageDetails]; updated[index] = { ...updated[index], package_description: value }; onPackageDetailsChange(updated); }; const handlePackageValueChange = (index: number, value: string) => { const updated = [...packageDetails]; updated[index] = { ...updated[index], customer_input_package_value: value || "0.000", }; onPackageDetailsChange(updated); }; const handleExternalPackageIdChange = (index: number, value: string) => { // Limit string length if needed, e.g., 50 chars if (value.length > 50) return; const updated = [...packageDetails]; updated[index] = { ...updated[index], external_package_id: value, }; onPackageDetailsChange(updated); }; const safePackageDetails = packageDetails.length === 0 ? [ { package_id: 1, weight: "", package_description: defaultDescription || "", customer_input_package_value: "0.000", external_package_id: "", }, ] : packageDetails; const renderPackageFields = (): JSX.Element[] => { return safePackageDetails.map((pkg: any, index) => (
{/* Weight Input */}
handleWeightChange(index, e.target.value)} placeholder="Enter package weight (KG)" disabled={packageDisable == "true" ? true : false} />
{errors?.packageDetails?.[index]?.weight ? (
{errors?.packageDetails[index].weight}
) : safePackageDetails?.length === 1 && errors?.packageDetails && typeof errors?.packageDetails === "string" ? (
{"Weight is required."}
) : ( "" )}
{/* Description Input */}
handleDescriptionChange(index, e.target.value)} placeholder="Enter package description" disabled={packageDisable == "true" ? true : false} />
{errors?.packageDetails?.[index]?.package_description && (
{errors?.packageDetails[index].package_description}
)}
{/* Package Value */}
handlePackageValueChange(index, e.target.value) } placeholder="Enter the package value" disabled={packageDisable == "true" ? true : false} />
{errors?.packageDetails?.[index]?.customer_input_package_value && (
{errors?.packageDetails[index].customer_input_package_value}
)}
{/* External Package ID */}
handleExternalPackageIdChange(index, e.target.value) } placeholder="External Package ID" disabled={packageDisable == "true" ? true : false} />
{errors?.packageDetails?.[index]?.external_package_id && (
{errors?.packageDetails[index].external_package_id}
)}
)); }; // const handleWeightSelection = (packageWeight: { // id: number; // name: string; // }) => { // setSelectedWeightId(String(packageWeight.id)); // setDefaultWeight(String(packageWeight.id)); // const updated = [...packageDetails]; // if (updated.length === 0) { // updated.push({ // package_id: 1, // weight: String(packageWeight.id), // package_description: defaultDescription || "", // customer_input_package_value: "0.000", // }); // } else { // // Update all packages with the same weight // const updated = packageDetails.map((pkg) => ({ // ...pkg, // weight: String(packageWeight.id), // })); // onPackageDetailsChange(updated); // } // }; return ( <>
No.of packages *
onPackagesChange(Number(e.target.value))} />
{/* */} {errors?.packageCount && (
{errors?.packageCount}
)}
{/* Number of Packages */}
{noOfPackages > 1 && ( <>
{ setDefaultDescription(e.target.value); // Update all packages with the same description const updated = packageDetails.map((pkg) => ({ ...pkg, package_description: e.target.value, })); onPackageDetailsChange(updated); }} disabled={packageDisable == "true" ? true : false} />
{ const value = e?.target?.value; const numValue = Number(value); // Calculate the new total weight if this change is applied to all packages const newTotal = numValue === 0 ? 0 : numValue * packageDetails.length; if (newTotal > 30) { toast.warning(MAX_WEIGHT_TOAST_MESSAGE, { position: "top-right", autoClose: 3000, }); return; } // if (numValue < 1 && value !== "") { // // Optionally set an error here, or handle via validation // // For now, just prevent update // return; // } setDefaultWeight(e.target.value); // Update all packages with the same weight const updated = packageDetails.map((pkg) => ({ ...pkg, weight: e.target.value, })); onPackageDetailsChange(updated); }} disabled={packageDisable == "true" ? true : false} />
)}
{/* Single or Multiple Package Inputs */} {/* {noOfPackages === 1 ? ( <>
Package Weight
{weightOptions.map((option) => { let iconClass = ""; if (option.name === "< 5kg") iconClass = "ri-instance-line"; else if (option.name === "5kg - 30kg") iconClass = "ri-stacked-view"; else if (option.name === "> 30kg") iconClass = "ri-weight-line"; return (
handleWeightSelection(option)} />
); })} {errors?.packageDetails?.[0]?.weight && (
{errors?.packageDetails[0]?.weight}
)}
handleDescriptionChange(0, e.target.value)} placeholder="Enter package description" />
{errors?.packageDetails?.[0]?.package_description && (
{errors?.packageDetails[0]?.package_description}
)}
handlePackageValueChange(0, e.target.value) } placeholder="Enter the package value" />
{errors?.packageDetails?.[0]?.customer_input_package_value && (
{errors?.packageDetails[0]?.customer_input_package_value}
)}
) : ( */}
No.of Packages ({packageDetails?.length || 0})
{renderPackageFields()}
{/* )} */}
); }; export default PackageForm;