'use client' import { useState, useEffect, useCallback } from 'react' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Input } from '@/components/ui/input' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { Mail, Search, Filter, Eye, Calendar, User, Building, Phone, MessageSquare, ExternalLink } from 'lucide-react' import { toast } from 'sonner' interface FormResponse { id: string formId: string data: any // Changed from specific interface to any to handle different form types metadata?: { ipAddress?: string userAgent?: string referrer?: string timestamp?: string } status: string createdAt: string updatedAt: string } interface Pagination { page: number limit: number total: number pages: number } export default function AdminFormsPage() { const [forms, setForms] = useState([]) const [loading, setLoading] = useState(true) const [selectedForm, setSelectedForm] = useState(null) const [showDetails, setShowDetails] = useState(false) const [pagination, setPagination] = useState({ page: 1, limit: 10, total: 0, pages: 0 }) // Filters const [statusFilter, setStatusFilter] = useState('all') const [formTypeFilter, setFormTypeFilter] = useState('all') const [searchQuery, setSearchQuery] = useState('') const fetchForms = useCallback(async () => { try { setLoading(true) const params = new URLSearchParams({ page: pagination.page.toString(), limit: pagination.limit.toString(), }) if (statusFilter !== 'all') { params.append('status', statusFilter) } if (formTypeFilter !== 'all') { params.append('formId', formTypeFilter) } const response = await fetch(`/api/forms?${params}`) const result = await response.json() if (result.success) { setForms(result.data) setPagination(result.pagination) } else { toast.error('Failed to fetch form responses') } } catch (error) { console.error('Error fetching forms:', error) toast.error('Failed to fetch form responses') } finally { setLoading(false) } }, [pagination.page, pagination.limit, statusFilter, formTypeFilter]) useEffect(() => { fetchForms() }, [fetchForms]) const updateFormStatus = async (formId: string, newStatus: string) => { try { const response = await fetch(`/api/forms/${formId}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ status: newStatus }) }) if (response.ok) { toast.success('Status updated successfully') fetchForms() if (selectedForm && selectedForm.id === formId) { setSelectedForm({ ...selectedForm, status: newStatus }) } } else { toast.error('Failed to update status') } } catch (error) { console.error('Error updating status:', error) toast.error('Failed to update status') } } const getStatusBadge = (status: string) => { const statusColors = { new: 'bg-blue-100 text-blue-800', in_progress: 'bg-yellow-100 text-yellow-800', resolved: 'bg-green-100 text-green-800', closed: 'bg-gray-100 text-gray-800' } return ( {status.replace('_', ' ').toUpperCase()} ) } const getFormTypeBadge = (formId: string) => { const typeColors = { contact: 'bg-purple-100 text-purple-800', partnership: 'bg-indigo-100 text-indigo-800', bulk_inquiry: 'bg-orange-100 text-orange-800', support: 'bg-teal-100 text-teal-800' } return ( {formId.replace('_', ' ').toUpperCase()} ) } const filteredForms = forms.filter(form => { if (searchQuery) { const query = searchQuery.toLowerCase() const data = form.data // Handle different form types if (form.formId === 'partnership_application') { return ( data.firstName?.toLowerCase().includes(query) || data.lastName?.toLowerCase().includes(query) || data.email?.toLowerCase().includes(query) || data.businessName?.toLowerCase().includes(query) || data.partnershipTier?.toLowerCase().includes(query) || data.motivation?.toLowerCase().includes(query) ) } else { // Contact forms and other types return ( data.name?.toLowerCase().includes(query) || data.email?.toLowerCase().includes(query) || data.message?.toLowerCase().includes(query) || data.subject?.toLowerCase().includes(query) ) } } return true }) return (
{/* Header */}

Form Responses

Manage and respond to customer inquiries and form submissions

{/* Filters */} Filters
setSearchQuery(e.target.value)} className="w-64" />
{/* Form Responses Table */} Form Responses ({pagination.total}) Click on any row to view detailed information and respond to inquiries {loading ? (
) : (
Name Email Type Status Subject Date Actions {filteredForms.map((form) => { // Handle different form types for display const displayName = form.formId === 'partnership_application' ? `${form.data.firstName || ''} ${form.data.lastName || ''}`.trim() : form.data.name || 'Unknown' const displayEmail = form.data.email || 'No email' const displaySubject = form.formId === 'partnership_application' ? `${form.data.partnershipTier || 'Unknown'} Partnership Application` : form.data.subject || form.data.inquiryType || 'No subject' return ( {displayName} {displayEmail} {getFormTypeBadge(form.formId)} {getStatusBadge(form.status)} {displaySubject} {new Date(form.createdAt).toLocaleDateString()} ) })}
{/* Pagination */} {pagination.pages > 1 && (

Showing {((pagination.page - 1) * pagination.limit) + 1} to{' '} {Math.min(pagination.page * pagination.limit, pagination.total)} of{' '} {pagination.total} entries

Page {pagination.page} of {pagination.pages}
)}
)}
{/* Form Details Dialog */} Form Response Details View and manage this form submission {selectedForm && (
{/* Header Info */}
{getFormTypeBadge(selectedForm.formId)} {getStatusBadge(selectedForm.status)}

Submitted on {new Date(selectedForm.createdAt).toLocaleDateString()} at{' '} {new Date(selectedForm.createdAt).toLocaleTimeString()}

{/* Contact Information */} Contact Information
Name: {selectedForm.formId === 'partnership_application' ? `${selectedForm.data.firstName || ''} ${selectedForm.data.lastName || ''}`.trim() : selectedForm.data.name || 'Unknown' }
{selectedForm.data.phone && ( )} {/* Show business info for partnership applications */} {selectedForm.formId === 'partnership_application' && selectedForm.data.businessName && (
Business: {selectedForm.data.businessName}
)} {/* Show company info for other forms */} {selectedForm.formId !== 'partnership_application' && selectedForm.data.company && (
Company: {selectedForm.data.company}
)}
{/* Message/Details Content */} {selectedForm.formId === 'partnership_application' ? ( // Partnership Application Details <> Partnership Details
Partnership Tier: {selectedForm.data.partnershipTier}
Expected Customers: {selectedForm.data.expectedCustomers || 'Not specified'}
Business Type: {selectedForm.data.businessType || 'Not specified'}
Experience: {selectedForm.data.experience || 'Not specified'}
Address Information
Address: {selectedForm.data.address || 'Not provided'}
City: {selectedForm.data.city || 'Not provided'}
State: {selectedForm.data.state || 'Not provided'}
Zip Code: {selectedForm.data.zipCode || 'Not provided'}
Motivation & Plans
Motivation:

{selectedForm.data.motivation || 'Not provided'}

Marketing Plan:

{selectedForm.data.marketingPlan || 'Not provided'}

) : ( // Regular Contact Form Message Message {selectedForm.data.subject && ( Subject: {selectedForm.data.subject} )}

{selectedForm.data.message}

)} {/* Additional Information */} {(selectedForm.data.inquiryType || selectedForm.data.formSource) && ( Additional Information {selectedForm.data.inquiryType && (
Inquiry Type: {selectedForm.data.inquiryType}
)} {selectedForm.data.formSource && (
Form Source: {selectedForm.data.formSource}
)}
)} {/* Metadata */} {selectedForm.metadata && ( Technical Details {selectedForm.metadata.ipAddress && (
IP Address: {selectedForm.metadata.ipAddress}
)} {selectedForm.metadata.referrer && (
Referrer: {selectedForm.metadata.referrer}
)} {selectedForm.metadata.userAgent && (
User Agent:
{selectedForm.metadata.userAgent}
)}
)} {/* Actions */}
)}
) }