"use client" import { useEffect, useState } from "react" import { useRouter } from "next/navigation" import { Ticket, Search, Filter, Loader2, MoreHorizontal } from "lucide-react" type TicketStatus = "open" | "pending" | "resolved" | "closed" interface TicketMessage { id: string subject: string bodyPreview: string | null status: string trigger: string | null sentAt: string } interface TicketData { id: string subject: string rootSubject: string customerEmail: string status: string updatedAt: string messagesCount: number lastMessageSnippet: string messages: TicketMessage[] } export default function TicketsPage() { const router = useRouter() const [searchTerm, setSearchTerm] = useState("") const [showFilters, setShowFilters] = useState(false) const [statusFilter, setStatusFilter] = useState<"all" | "open" | "pending" | "resolved" | "closed">("all") const [tickets, setTickets] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) useEffect(() => { const loadTickets = async () => { try { setLoading(true) setError(null) const query = searchTerm.trim() const url = query ? `/api/juno-engine/tickets?q=${encodeURIComponent(query)}` : "/api/juno-engine/tickets" const res = await fetch(url, { cache: "no-store", }) if (!res.ok) { throw new Error("Failed to load tickets") } const data = (await res.json()) as { tickets: TicketData[] } setTickets(data.tickets || []) } catch (err) { console.error("Failed to load tickets", err) setError("Could not load tickets. Please ensure your Gmail integration is connected.") } finally { setLoading(false) } } void loadTickets() }, [searchTerm]) const getStatusStyles = (status: TicketStatus | string) => { switch (status) { case "open": return "bg-blue-500/20 text-blue-400" case "pending": return "bg-yellow-500/20 text-yellow-400" case "resolved": return "bg-emerald-500/20 text-emerald-400" case "closed": return "bg-slate-500/20 text-slate-400" default: return "bg-white/10 text-slate-400" } } const filteredTickets = tickets.filter((ticket) => { if (statusFilter === "all") return true return (ticket.status || "").toLowerCase() === statusFilter }) return (
{/* Header */}

Tickets

View conversations between your customers and JUNO support.

{/* Search */}
setSearchTerm(e.target.value)} className="w-full h-10 md:h-11 pl-10 md:pl-11 pr-4 bg-white/5 border border-white/10 rounded-xl focus:outline-none focus:ring-2 focus:ring-indigo-500/30 focus:border-indigo-500/50 text-white placeholder:text-slate-500 text-sm font-medium transition-all" />
{showFilters && (
{(["all", "open", "pending", "resolved", "closed"] as const).map((status) => ( ))}
)} {/* Tickets Grid */}
{loading ? (

Loading tickets...

) : error ? (

{error}

) : filteredTickets.length === 0 ? (

No tickets found.

New conversations will appear here as they come in.

) : (
{filteredTickets.map((ticket) => (
router.push(`/dashboard/juno-engine/tickets/${encodeURIComponent(ticket.id)}`)} > {/* Header */}

{ticket.subject}

{ticket.customerEmail}

{/* Conversation snippet */}

{ticket.lastMessageSnippet}

{/* Meta */}
{ticket.status} {ticket.messagesCount} messages

Updated {new Date(ticket.updatedAt).toLocaleDateString()}

))}
)}
) }