'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import api from '@/lib/api'; import CreateTicketModal from '@/components/create-ticket-modal'; interface Ticket { id: string; tenantName: string; subject: string; category: string; priority: string; status: string; createdAt: string; assignee: { id: string; firstName: string; lastName: string } | null; _count: { comments: number }; } const statusColors: Record = { open: 'bg-yellow-50 text-yellow-700', in_progress: 'bg-blue-50 text-blue-700', waiting_tenant: 'bg-orange-50 text-orange-700', resolved: 'bg-green-50 text-green-700', closed: 'bg-surface-100 text-surface-500', }; const priorityColors: Record = { low: 'bg-surface-100 text-surface-600', normal: 'bg-blue-50 text-blue-600', high: 'bg-orange-50 text-orange-600', urgent: 'bg-red-50 text-red-600', }; interface TenantOption { id: string; name: string; slug: string; } export default function SupportPage() { const [tickets, setTickets] = useState([]); const [loading, setLoading] = useState(true); const [status, setStatus] = useState(''); const [priority, setPriority] = useState(''); const [search, setSearch] = useState(''); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const [showCreate, setShowCreate] = useState(false); const [tenants, setTenants] = useState([]); const limit = 20; useEffect(() => { api.get('/tenants?limit=100').then((res) => setTenants(res.data.data.items || [])).catch(() => {}); }, []); useEffect(() => { loadTickets(); }, [status, priority, search, page]); async function loadTickets() { setLoading(true); try { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (status) params.set('status', status); if (priority) params.set('priority', priority); if (search) params.set('search', search); const res = await api.get(`/support/tickets?${params}`); setTickets(res.data.data.items); setTotal(res.data.data.total); } catch (err) { console.error('Failed to load tickets:', err); } finally { setLoading(false); } } return (

Support Tickets

{total} total tickets

{ setSearch(e.target.value); setPage(1); }} className="px-3 py-2 border border-surface-300 rounded-lg text-sm flex-1 min-w-[200px] max-w-xs" />
{loading ? ( ) : tickets.length === 0 ? ( ) : ( tickets.map((t) => ( )) )}
Subject Tenant Priority Status Assignee Comments Created
Loading...
No tickets found
{t.subject} {t.tenantName} {t.priority} {t.status.replace(/_/g, ' ')} {t.assignee ? `${t.assignee.firstName} ${t.assignee.lastName}` : 'Unassigned'} {t._count.comments} {new Date(t.createdAt).toLocaleDateString()}
{showCreate && ( setShowCreate(false)} onSuccess={() => loadTickets()} /> )}
); }