import { useEffect, useState, useRef } from 'react'; import { FaEllipsisV } from 'react-icons/fa'; import api from '../../config/api'; import ContactFormModal, { ContactData } from './ContactsFormModal'; import { Bounce, toast } from 'react-toastify'; import { IoMdAdd } from 'react-icons/io'; import LoaderUi from '../../helper/LoaderUi'; import logoRecord from '../../assets/record.svg' type ContactSchema = [{ id: number, firstName: string lastName: string email: string phone: string }] const Contacts = () => { const activeAccountId = JSON.parse(sessionStorage.getItem('activeAccountId') || 'null'); const [contacts, setContacts] = useState([]); const [loading, setLoading] = useState(true); const [openMenuId, setOpenMenuId] = useState(null); const blurTimeoutRef = useRef(null); const [createAndInviteLoader, setCreateAndInviteLoader] = useState(false); const [showModal, setShowModal] = useState(false) const [editJsonData, setEditJsonData] = useState({}) const [actionStatus, setActionStatus] = useState("") console.log("editJsonData", editJsonData) const fetchContacts = async () => { setLoading(true) try { const res = await api.get(`/api/accounts/${activeAccountId}/contacts`); setContacts(res.data.content || []); } catch (error) { console.error('Failed to fetch contacts:', error); } finally { setLoading(false); } }; useEffect(() => { if (activeAccountId) { fetchContacts(); } }, [activeAccountId]); const handleEdit = (contactId) => { console.log('Edit contact:', contactId); let jsonEditData = contacts.find((prev) => prev.id === contactId) setEditJsonData(jsonEditData) setActionStatus("Edit") setShowModal((prev) => !prev) setOpenMenuId(null); }; const handleDelete = async (contactId) => { console.log('Delete contact:', contactId); try { let res = await api.delete(`/api/accounts/${activeAccountId}/contacts/${contactId}`) if (res?.data) { toast.error("Contact delete successfully!", { position: "top-center", autoClose: 1500, transition: Bounce, }); fetchContacts() setOpenMenuId(null); } } catch (error) { console.log(error) } }; const toggleMenu = (contactId) => { // Cancel any pending blur timeout (prevents blinking) clearTimeout(blurTimeoutRef.current); setOpenMenuId((prevId) => (prevId === contactId ? null : contactId)); }; const handleBlur = () => { blurTimeoutRef.current = setTimeout(() => { setOpenMenuId(null); }, 100); }; const handleContactSubmit = async (data: ContactData, type: "") => { try { let res; setCreateAndInviteLoader(true); if (type === 'Edit') { res = await api.put(`/api/accounts/${activeAccountId}/contacts`, [data]) } else { res = await api.post(`/api/accounts/${activeAccountId}/contacts`, [data]); } if (res.status === 200) { toast.success('Contact created successfully!', { position: "top-center", autoClose: 1500, transition: Bounce, }); setShowModal(false) fetchContacts(); } // return res; } catch (err) { console.error("Error creating contact", err); toast.error("Failed to create contact", { position: "top-center", autoClose: 1500, transition: Bounce, }); throw err; } finally { setCreateAndInviteLoader(false); } }; return ( <>
{ setShowModal((prev) => !prev); setActionStatus("Add") }} className="flex items-center gap-1 bg-gradient-to-br from-[var(--primary)] to-blue-600 px-3 py-1.5 rounded-sm hover:opacity-90 ">
{loading ? ( ) : contacts.length === 0 ? ( ) : ( contacts.map((contact, index) => ( )) )}
First Name Last Name Email Actions
Record Not Found
{contact.firstName} {contact.lastName} {contact.email}
{openMenuId === contact.id && (
)}
{showModal && ( )}
); }; export default Contacts;