"use client"; import { useState, useEffect, useCallback } from "react"; import { Plus, Search, Mail, Phone, Building2, Trash2, X } from "lucide-react"; import { Button } from "@/components/ui/button"; import { fetchCustomers, createCustomer, deleteCustomer, getUserRole, type Customer, } from "@/lib/supabase/customers-actions"; import PageSkeleton from "./PageSkeleton"; export default function ClientsPage() { const [clients, setClients] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(""); const [showForm, setShowForm] = useState(false); const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [userRole, setUserRole] = useState("employee"); const [formName, setFormName] = useState(""); const [formEmail, setFormEmail] = useState(""); const [formPhone, setFormPhone] = useState(""); const [formCompany, setFormCompany] = useState(""); const [formAddress, setFormAddress] = useState(""); const [formNotes, setFormNotes] = useState(""); const canDelete = userRole === "owner" || userRole === "admin"; useEffect(() => { let cancelled = false; Promise.all([fetchCustomers(search || undefined), getUserRole()]) .then(([c, role]) => { if (!cancelled) { setClients(c); setUserRole(role); } }) .catch(() => {}) .finally(() => { if (!cancelled) setLoading(false); }); return () => { cancelled = true; }; }, [search]); const handleSubmit = async () => { setError(null); if (!formName.trim()) { setError("Name is required"); return; } setSaving(true); try { const result = await createCustomer({ name: formName, email: formEmail || undefined, phone: formPhone || undefined, company: formCompany || undefined, address: formAddress || undefined, notes: formNotes || undefined, }); if (!result.success) { setError(result.error || "Failed"); return; } resetForm(); const updated = await fetchCustomers(search || undefined); setClients(updated); } catch (e: any) { setError(e.message); } finally { setSaving(false); } }; const handleDelete = async (id: string) => { const result = await deleteCustomer(id); if (result.success) setClients((prev) => prev.filter((c) => c.id !== id)); }; const resetForm = () => { setShowForm(false); setFormName(""); setFormEmail(""); setFormPhone(""); setFormCompany(""); setFormAddress(""); setFormNotes(""); setError(null); }; if (loading) return ; return (
{/* Header */}

Clients

Manage your client contacts

{/* Search */}
setSearch(e.target.value)} placeholder="Search clients..." className="w-full pl-10 pr-4 py-2.5 text-sm border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" />
{/* Add Client Form */} {showForm && (

New client

{error && (
{error}
)}
setFormName(e.target.value)} className="mt-1 w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" placeholder="John Smith" />
setFormEmail(e.target.value)} type="email" className="mt-1 w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" placeholder="john@example.com" />
setFormPhone(e.target.value)} className="mt-1 w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" placeholder="+61 400 000 000" />
setFormCompany(e.target.value)} className="mt-1 w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" placeholder="Acme Corp" />
setFormAddress(e.target.value)} className="mt-1 w-full border border-gray-200 rounded-lg px-3 py-2.5 text-sm focus:outline-none focus:ring-2 focus:ring-[#1D9E75]/20 focus:border-[#1D9E75]" placeholder="123 Main St, Sydney NSW 2000" />