/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useState, useEffect } from "react"; import SelectField from "../TextField/ReactSelect"; import { getMasterList } from "../../Api/MastersApi"; import { createCustomerAddress, getCustomerAddresses, updateCustomerAddress, } from "../../Api/CustomerApi"; import Swal from "sweetalert2"; import HourGlassLoader from "../Loader/Loader"; import { validateForm } from "./AddEditAddress/Validation"; import InputFieldCustom from "../TextField/InputFieldCustom"; import PhoneInputFieldAddAddressModal from "../TextField/PhoneInputFieldAddAddressModal"; interface FormData { isPrimary: string; name: string; blockNo: any; roadNo: any; buildingNo: any; flatNo: string; latitude: string; longitude: string; phone: string; } interface MasterList { id: string; name: string; code: string | number; } interface Option { id: string; name: string; } const AddAddressModal: React.FC = ({ onHide, data, setData }) => { const [isLoading, setIsLoading] = useState(false); const [isPrimaryAvailable, setIsPrimaryAvailable] = useState(false); const [formData, setFormData] = useState({ isPrimary: !isPrimaryAvailable ? "no" : "yes", name: "", blockNo: "", roadNo: "", buildingNo: "", flatNo: "", latitude: "", longitude: "", phone: "", }); const [filteredRoads, setFilteredRoads] = useState([]); const [filteredBuildings, setFilteredBuildings] = useState([]); const [errors, setErrors] = useState<{ [key: string]: string }>({}); const [blocks, setBlocks] = useState([]); const fetchDefaultValuesForEdit = async () => { if (data?.id) { if (data?.block?.id) { try { setIsLoading(true); const roadRes = await getMasterList("road", { block_id: data.block.id, }); setFilteredRoads(roadRes?.data || []); let selectedRoad = null; let selectedBuilding = null; if (data?.road?.id) { selectedRoad = (roadRes?.data || []).find((r: any) => r.id === data.road.id) || data.road.id; const buildingRes = await getMasterList("building", { block_id: data.block.id, road_id: data.road.id, }); setFilteredBuildings(buildingRes?.data || []); if (data?.building?.id) { selectedBuilding = (buildingRes?.data || []).find( (b: any) => b.id === data.building.id ) || data.building.id; } } else { setFilteredBuildings([]); } setFormData({ isPrimary: data?.isPrimary ? "yes" : "no", name: data?.addressTitle || "", blockNo: data?.block?.id || "", roadNo: selectedRoad?.id || (data?.road?.id ?? null), buildingNo: selectedBuilding?.id || (data?.building?.id ?? null), flatNo: data?.addressLineOne || "", latitude: data?.latitude || "", longitude: data?.longitude || "", phone: data?.phone || "", }); } catch { setFilteredRoads([]); setFilteredBuildings([]); setFormData({ isPrimary: data?.isPrimary ? "yes" : "no", name: data?.addressTitle || "", blockNo: data?.block?.id || "", roadNo: data?.road?.id || "", buildingNo: data?.building?.id || "", flatNo: data?.addressLineOne || "", latitude: data?.latitude || "", longitude: data?.longitude || "", phone: data?.phone || "", }); } finally { setIsLoading(false); } } else { setFilteredRoads([]); setFilteredBuildings([]); setFormData({ isPrimary: data?.isPrimary ? "yes" : "no", name: data?.addressTitle || "", blockNo: data?.block?.id || "", roadNo: data?.road?.id || "", buildingNo: data?.building?.id || "", flatNo: data?.addressLineOne || "", latitude: data?.latitude || "", longitude: data?.longitude || "", phone: data?.phone || "", }); } } }; useEffect(() => { const fetchMasterLists = async () => { try { setIsLoading(true); const [, block] = await Promise.all([ getMasterList("road"), getMasterList("block"), getMasterList("building"), ]); setBlocks(block?.data || []); setFilteredRoads([]); setFilteredBuildings([]); if (data?.id) await fetchDefaultValuesForEdit(); else { const primaryAddress: any = await getCustomerAddresses({ is_primary: true, }); if (primaryAddress?.data?.length > 0) setIsPrimaryAvailable(true); else setIsPrimaryAvailable(false); setFormData({ ...formData, isPrimary: !isPrimaryAvailable ? "no" : "yes", }); } } catch (err) { console.error("Error loading masterlists", err); } finally { setIsLoading(false); } }; fetchMasterLists(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); // Fetch roads when block changes useEffect(() => { const fetchRoads = async () => { if (formData.blockNo) { setIsLoading(true); try { const response = await getMasterList("road", { block_id: formData.blockNo, }); setFilteredRoads(response?.data || []); } catch { setFilteredRoads([]); } finally { setIsLoading(false); } } else { setFilteredRoads([]); } // Only clear roadNo/buildingNo if blockNo actually changed setFormData((prev) => { if (prev.roadNo || prev.buildingNo) { return { ...prev, roadNo: data?.road?.id ?? "", buildingNo: data?.building?.id ?? "", }; } return prev; }); setFilteredBuildings([]); }; fetchRoads(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [formData.blockNo]); // Fetch buildings when road or block changes useEffect(() => { const fetchBuildings = async () => { if (formData.blockNo && formData.roadNo) { setIsLoading(true); try { const response = await getMasterList("building", { block_id: formData.blockNo, road_id: formData.roadNo, }); setFilteredBuildings(response?.data || []); } catch { setFilteredBuildings([]); } finally { setIsLoading(false); } } else { setFilteredBuildings([]); } // Only clear buildingNo if roadNo actually changed setFormData((prev) => { if (prev.buildingNo) { return { ...prev, buildingNo: data?.building?.id ?? "" }; } return prev; }); }; fetchBuildings(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [formData.roadNo, formData.blockNo]); const handleChange = (field: keyof FormData) => (e: React.ChangeEvent | { value: string }) => { const value = (e as React.ChangeEvent).target?.value ?? (e as { value: string }).value ?? ""; setFormData((prev) => { const newFormData = { ...prev, [field]: value }; // Validate the specific field that changed const validationErrors = validateForm(newFormData); setErrors(validationErrors); return newFormData; }); }; const handleSelectChange = (field: keyof FormData) => (selectedOption: Option | null) => { const newValue = selectedOption ? { id: selectedOption.id, name: selectedOption.name } : null; setFormData((prev) => { const newFormData = field === "blockNo" ? { ...prev, [field]: newValue ? newValue.id : "", roadNo: "", buildingNo: "", } : { ...prev, [field]: newValue ? newValue.id : "", }; if (field === "blockNo") { setData({ ...data, road: "", building: "" }); } // Validate the specific field that changed const validationErrors = validateForm(newFormData); setErrors(validationErrors); return newFormData; }); }; const handlePrimaryChange = (e: React.ChangeEvent) => { setFormData((prev) => ({ ...prev, isPrimary: e.target.value, })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const validationErrors = validateForm(formData); setErrors(validationErrors); if (Object.keys(validationErrors).length > 0) { // Swal.fire({ // icon: "error", // title: "Form Error", // text: "Please fix the errors before submitting.", // confirmButtonText: "OK", // }); return; } const payload = { ...formData, phone: formData.phone.startsWith('+') ? formData.phone : `+${formData.phone}`, address_title: formData?.name, address_line_one: formData?.flatNo, address_line_two: "", block_id: formData?.blockNo, road_id: filteredRoads.find((road) => road.id === formData.roadNo)?.code || formData?.roadNo, building_id: filteredBuildings.find( (building) => building.id === formData.buildingNo )?.code || formData.buildingNo, is_primary: formData.isPrimary === "yes" ? true : false, // Convert "yes"/"no" to boolean }; try { let response: any = {}; if (data?.id) response = await updateCustomerAddress(data?.id, payload); else response = await createCustomerAddress(payload); if (response?.status) onHide(); else { Swal.fire({ icon: "error", title: "Oops...", text: response.message || "Something went wrong. Please try again.", confirmButtonText: "OK", customClass: { confirmButton: "delybell-primary px-4", cancelButton: "delybell-dark", }, }); } } catch (error) { console.error("Failed to create address", error); onHide(); } }; return ( <> {isLoading && }

{data?.id ? "Edit" : "Add New"} Address

({ id: block.id, name: block.name, code: block?.code, }))} title="Block" value={ blocks.find((block) => block.id === formData.blockNo) || null } onChange={handleSelectChange("blockNo")} placeholder="Select Block" isCreatable={false} width="100%" errors={errors.blockNo} usageType={1} icon={"ri ri-layout-grid-line"} page="my-profile" label="block no." name="blockNo" /> {/* {errors?.blockNo && (
{errors?.blockNo}
)} */} ({ id: road.id, name: road.name, code: road?.code, }))} value={ data?.road ? data?.road : filteredRoads.find( (road) => road.id === formData.roadNo ) || null } onChange={handleSelectChange("roadNo")} placeholder="Select Road" stringAdd={true} width="100%" errors={errors.roadNo} usageType={1} icon={"ri ri-road-map-line"} title="Road" page="my-profile" label="road no." name="roadNo" /> {/* {errors?.roadNo && (
{errors?.roadNo}
)} */} ({ id: building.id, name: building.name, code: building?.code, }))} value={ data?.building ? data?.building : filteredBuildings.find( (building) => building.id === formData.buildingNo ) || null } onChange={handleSelectChange("buildingNo")} placeholder="Select Building" stringAdd={true} width="100%" errors={errors.buildingNo} usageType={1} icon={"ri ri-building-line"} title="Building" page="my-profile" label="building no." name="buildingNo" /> {/* {errors?.blockNo && (
{errors?.blockNo}
)} */} {/*
*/}
{ setFormData((prev) => { const updated = { ...prev, phone: val }; const validationErrors = validateForm(updated); setErrors(validationErrors); return updated; }); }} placeholder="Enter phone number" error={errors.phone} />
{/*
*/} {/*
*/} {/*
*/}
); }; export default AddAddressModal;