/* eslint-disable @typescript-eslint/no-explicit-any */ import React, { useState, useEffect } from "react"; import { Field, FieldArray, useFormikContext } from "formik"; import { updateCustomerBillingEmails } from "../../../../Api/CustomerApi"; import { toast } from "react-toastify"; interface Props { toggleSection: (section: string) => void; openSections: { [key: string]: boolean }; billingEmailsDisabled: boolean; handleBillingEmailsDisabled: () => void; values: any; } const MAX_EMAILS = 5; const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; // simple email validation const BillingEmails: React.FC = ({ toggleSection, openSections, billingEmailsDisabled, handleBillingEmailsDisabled, values, }) => { const { setSubmitting, setFieldValue } = useFormikContext(); const [errors, setErrors] = useState<{ [key: number]: string }>({}); // Live validation useEffect(() => { const newErrors: { [key: number]: string } = {}; const emailSet = new Set(); values.billing_emails.forEach((email: string, index: number) => { const trimmed = email?.trim(); if (!trimmed) { newErrors[index] = "Email cannot be empty"; } else if (!emailRegex.test(trimmed)) { newErrors[index] = "Invalid email format"; } else if (emailSet.has(trimmed)) { newErrors[index] = "Duplicate email not allowed"; } else { emailSet.add(trimmed); } }); setErrors(newErrors); }, [values.billing_emails]); const handleSave = async () => { if (Object.keys(errors).length > 0) return; // prevent save if any error try { setSubmitting(true); const payload = { billing_emails: values.billing_emails.filter((e: string) => e.trim() !== ""), }; const response = await updateCustomerBillingEmails(payload); if (response?.status) { toast.success("Billing emails updated successfully"); handleBillingEmailsDisabled(); } else { toast.error(response?.message || "Failed to update billing emails"); } } catch (err) { console.error(err); toast.error("Something went wrong"); } finally { setSubmitting(false); } }; const disableSave = billingEmailsDisabled || Object.keys(errors).length > 0 || !values.billing_emails?.some((e: string) => e.trim() !== ""); return (
toggleSection("billingEmails")} style={{ cursor: "pointer", display: "flex", alignItems: "center", justifyContent: "space-between", padding: "1rem", background: "#fff", borderBottom: openSections.billingEmails ? "none" : "1px solid #eee", }} >

Billing Emails

{billingEmailsDisabled ? ( { e.preventDefault(); if (openSections?.billingEmails) e.stopPropagation(); handleBillingEmailsDisabled(); }} > Edit ) : ( )}
{openSections.billingEmails && (

Add one or more billing emails where invoices and settlement reports will be sent.

{({ remove, push }) => ( <> {values.billing_emails.map((email: string, index: number) => (
setFieldValue(`billing_emails.${index}`, e.target.value)} /> {!billingEmailsDisabled && ( )}
{errors[index] &&
{errors[index]}
}
))} {!billingEmailsDisabled && values.billing_emails.length < MAX_EMAILS && ( )} {values.billing_emails.length >= MAX_EMAILS && ( Maximum {MAX_EMAILS} emails allowed )} )}
)}
); }; export default BillingEmails;