diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index 498dc357..af3589b1 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -539,6 +539,7 @@ export type Database = { status: string subject: string thread_id: string | null + ticket_number: string | null updated_at: string user_agent: string | null user_id: string | null @@ -560,6 +561,7 @@ export type Database = { status?: string subject: string thread_id?: string | null + ticket_number?: string | null updated_at?: string user_agent?: string | null user_id?: string | null @@ -581,6 +583,7 @@ export type Database = { status?: string subject?: string thread_id?: string | null + ticket_number?: string | null updated_at?: string user_agent?: string | null user_id?: string | null @@ -3954,6 +3957,7 @@ export type Database = { } extract_cf_image_id: { Args: { url: string }; Returns: string } generate_deletion_confirmation_code: { Args: never; Returns: string } + generate_ticket_number: { Args: never; Returns: string } get_email_change_status: { Args: never; Returns: Json } get_filtered_profile: { Args: { _profile_user_id: string; _viewer_id?: string } diff --git a/src/pages/admin/AdminContact.tsx b/src/pages/admin/AdminContact.tsx index a1bd1987..60794091 100644 --- a/src/pages/admin/AdminContact.tsx +++ b/src/pages/admin/AdminContact.tsx @@ -15,6 +15,9 @@ import { ArrowDownLeft, Loader2, RefreshCw, + Reply, + Copy, + Check, } from 'lucide-react'; import { supabase } from '@/integrations/supabase/client'; import { Button } from '@/components/ui/button'; @@ -71,6 +74,7 @@ interface ContactSubmission { thread_id: string; last_admin_response_at: string | null; response_count: number; + ticket_number: string; } interface EmailThread { @@ -98,6 +102,7 @@ export default function AdminContact() { const [showReplyForm, setShowReplyForm] = useState(false); const [emailThreads, setEmailThreads] = useState([]); const [loadingThreads, setLoadingThreads] = useState(false); + const [copiedTicket, setCopiedTicket] = useState(null); // Fetch contact submissions const { data: submissions, isLoading } = useQuery({ @@ -169,8 +174,10 @@ export default function AdminContact() { if (error) throw error; return data; }, - onSuccess: () => { - handleSuccess('Reply Sent', 'Your email response has been sent successfully'); + onSuccess: (_data, variables) => { + const submission = submissions?.find(s => s.id === variables.submissionId); + const ticketNumber = submission?.ticket_number || 'Unknown'; + handleSuccess('Reply Sent', `Your email response has been sent for ticket ${ticketNumber}`); setReplyBody(''); setShowReplyForm(false); // Refetch threads @@ -264,6 +271,19 @@ export default function AdminContact() { queryClient.invalidateQueries({ queryKey: ['admin-contact-submissions'] }); }; + const handleCopyTicket = (ticketNumber: string) => { + navigator.clipboard.writeText(ticketNumber); + setCopiedTicket(ticketNumber); + setTimeout(() => setCopiedTicket(null), 2000); + }; + + const handleQuickReply = (e: React.MouseEvent, submission: ContactSubmission) => { + e.stopPropagation(); + setSelectedSubmission(submission); + setAdminNotes(submission.admin_notes || ''); + setShowReplyForm(true); + }; + // Show loading state while roles are being fetched if (rolesLoading) { return ( @@ -463,6 +483,20 @@ export default function AdminContact() {

{submission.subject}

+ { + e.stopPropagation(); + handleCopyTicket(submission.ticket_number); + }} + > + {copiedTicket === submission.ticket_number ? ( + <> Copied! + ) : ( + <> {submission.ticket_number} + )} + {getStatusBadge(submission.status)} {getCategoryLabel(submission.category)} {submission.response_count > 0 && ( @@ -489,7 +523,19 @@ export default function AdminContact() {

{submission.message}

- +
+ + +
@@ -520,11 +566,22 @@ export default function AdminContact() { {selectedSubmission && ( <> - + {selectedSubmission.subject} + handleCopyTicket(selectedSubmission.ticket_number)} + > + {copiedTicket === selectedSubmission.ticket_number ? ( + <> Copied! + ) : ( + <> {selectedSubmission.ticket_number} + )} + {selectedSubmission.response_count > 0 && ( - + 📧 {selectedSubmission.response_count} {selectedSubmission.response_count === 1 ? 'reply' : 'replies'} )} @@ -654,9 +711,17 @@ export default function AdminContact() { ) : ( - +
+ + + {selectedSubmission.ticket_number} + +
+
+ Subject: Re: [{selectedSubmission.ticket_number}] {selectedSubmission.subject} +