"use client"; import { useState, useEffect } from "react"; import Button from "@/components/ui/Button"; import Badge from "@/components/ui/Badge"; export default function ProjectContactSelector({ projectId, onChange }) { const [contacts, setContacts] = useState([]); const [projectContacts, setProjectContacts] = useState([]); const [availableContacts, setAvailableContacts] = useState([]); const [showSelector, setShowSelector] = useState(false); const [loading, setLoading] = useState(false); const [searchTerm, setSearchTerm] = useState(""); useEffect(() => { fetchAllContacts(); if (projectId) { fetchProjectContacts(); } }, [projectId]); async function fetchAllContacts() { try { const response = await fetch("/api/contacts?is_active=true"); if (response.ok) { const data = await response.json(); setContacts(data); } } catch (error) { console.error("Error fetching contacts:", error); } } async function fetchProjectContacts() { try { const response = await fetch(`/api/projects/${projectId}/contacts`); if (response.ok) { const data = await response.json(); setProjectContacts(data); updateAvailableContacts(data); onChange?.(data); } } catch (error) { console.error("Error fetching project contacts:", error); } } function updateAvailableContacts(linkedContacts) { const linkedIds = linkedContacts.map((c) => c.contact_id); const available = contacts.filter( (c) => !linkedIds.includes(c.contact_id) ); setAvailableContacts(available); } async function handleAddContact(contactId) { setLoading(true); try { const response = await fetch(`/api/projects/${projectId}/contacts`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ contactId }), }); if (response.ok) { await fetchProjectContacts(); setShowSelector(false); setSearchTerm(""); } } catch (error) { console.error("Error adding contact:", error); alert("Nie udało się dodać kontaktu"); } finally { setLoading(false); } } async function handleRemoveContact(contactId) { if (!confirm("Czy na pewno chcesz usunąć ten kontakt z projektu?")) return; try { const response = await fetch( `/api/projects/${projectId}/contacts?contactId=${contactId}`, { method: "DELETE", } ); if (response.ok) { await fetchProjectContacts(); } } catch (error) { console.error("Error removing contact:", error); alert("Nie udało się usunąć kontaktu"); } } async function handleSetPrimary(contactId) { try { const response = await fetch(`/api/projects/${projectId}/contacts`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ contactId }), }); if (response.ok) { await fetchProjectContacts(); } } catch (error) { console.error("Error setting primary contact:", error); alert("Nie udało się ustawić głównego kontaktu"); } } const getContactTypeBadge = (type) => { const types = { project: { label: "Projekt", variant: "primary" }, contractor: { label: "Wykonawca", variant: "warning" }, office: { label: "Urząd", variant: "info" }, supplier: { label: "Dostawca", variant: "success" }, other: { label: "Inny", variant: "secondary" }, }; return types[type] || types.other; }; const filteredAvailable = searchTerm ? availableContacts.filter( (c) => c.name?.toLowerCase().includes(searchTerm.toLowerCase()) || c.phone?.toLowerCase().includes(searchTerm.toLowerCase()) || c.email?.toLowerCase().includes(searchTerm.toLowerCase()) || c.company?.toLowerCase().includes(searchTerm.toLowerCase()) ) : availableContacts; return (
{projectId && ( )}
{/* Current project contacts */} {projectContacts.length > 0 ? (
{projectContacts.map((contact) => { const typeBadge = getContactTypeBadge(contact.contact_type); return (
{contact.name} {contact.is_primary === 1 && ( Główny )} {typeBadge.label}
{contact.phone &&
📞 {contact.phone}
} {contact.email &&
📧 {contact.email}
} {contact.company && (
🏢 {contact.company}
)}
{contact.is_primary !== 1 && ( )}
); })}
) : (
{projectId ? "Brak powiązanych kontaktów. Dodaj kontakt do projektu." : "Zapisz projekt, aby móc dodać kontakty."}
)} {/* Contact selector */} {showSelector && projectId && (
setSearchTerm(e.target.value)} placeholder="Szukaj kontaktu..." className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" />
{filteredAvailable.length === 0 ? (

{searchTerm ? "Nie znaleziono kontaktów" : "Wszystkie kontakty są już dodane"}

) : ( filteredAvailable.map((contact) => { const typeBadge = getContactTypeBadge(contact.contact_type); return (
{contact.name} {typeBadge.label}
{contact.phone && {contact.phone}} {contact.phone && contact.email && ( )} {contact.email && {contact.email}}
{contact.company && (
{contact.company}
)}
); }) )}
)}
); }