import React, { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { SettingsCard } from '@/routes/Settings/components/SettingsCard'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Checkbox } from '@/components/ui/checkbox'; import { Download, Trash2, Search, MoreHorizontal } from 'lucide-react'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { api } from '@/lib/api'; import { useNavigate } from 'react-router-dom'; import { __ } from '@/lib/i18n'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; export default function Subscribers() { const [searchQuery, setSearchQuery] = useState(''); const queryClient = useQueryClient(); const navigate = useNavigate(); const { data: subscribersData, isLoading } = useQuery({ queryKey: ['newsletter-subscribers'], queryFn: async () => { const response = await api.get('/newsletter/subscribers'); return response.data; }, }); const deleteSubscriber = useMutation({ mutationFn: async (emails: string[]) => { for (const email of emails) { await api.del(`/newsletter/subscribers/${encodeURIComponent(email)}`); } }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['newsletter-subscribers'] }); toast.success(__('Subscriber(s) removed successfully')); setSelectedIds([]); setShowDeleteDialog(false); setDeleteTargetEmail(null); }, onError: () => { toast.error(__('Failed to remove subscriber(s)')); setShowDeleteDialog(false); setDeleteTargetEmail(null); }, }); const exportSubscribers = () => { if (!subscribersData?.subscribers) return; const csv = ['Email,Subscribed Date'].concat( subscribersData.subscribers.map((sub: any) => `${sub.email},${sub.subscribed_at || 'N/A'}` ) ).join('\n'); const blob = new Blob([csv], { type: 'text/csv' }); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `newsletter-subscribers-${new Date().toISOString().split('T')[0]}.csv`; a.click(); window.URL.revokeObjectURL(url); }; const subscribers = subscribersData?.subscribers || []; const filteredSubscribers = subscribers.filter((sub: any) => sub.email.toLowerCase().includes(searchQuery.toLowerCase()) ); const [selectedIds, setSelectedIds] = useState([]); const toggleAll = () => { if (selectedIds.length === filteredSubscribers.length) { setSelectedIds([]); } else { setSelectedIds(filteredSubscribers.map((s: any) => s.email)); } }; const toggleRow = (email: string) => { setSelectedIds(prev => prev.includes(email) ? prev.filter(e => e !== email) : [...prev, email] ); }; const confirmDelete = () => { const emailsToDelete = deleteTargetEmail ? [deleteTargetEmail] : selectedIds; deleteSubscriber.mutate(emailsToDelete); }; return (
setSearchQuery(e.target.value)} className="!pl-9" />
{selectedIds.length > 0 && ( )}
{isLoading ? (
{__('Loading subscribers...')}
) : filteredSubscribers.length === 0 ? (
{searchQuery ? __('No subscribers found matching your search') : __('No subscribers yet')}
) : (
0 && selectedIds.length === filteredSubscribers.length} onCheckedChange={toggleAll} aria-label={__('Select all')} /> {__('Email')} {__('Status')} {__('Subscribed Date')} {__('WP User')} {__('Actions')} {filteredSubscribers.map((subscriber: any) => ( toggleRow(subscriber.email)} aria-label={__('Select subscriber')} /> {subscriber.email} {subscriber.status || __('Active')} {subscriber.subscribed_at ? new Date(subscriber.subscribed_at).toLocaleDateString() : 'N/A' } {subscriber.user_id ? ( {__('Yes')} (ID: {subscriber.user_id}) ) : ( {__('No')} )} { setDeleteTargetEmail(subscriber.email); setShowDeleteDialog(true); }} > {__('Remove')} ))}
)} {__('Are you sure?')} {__('This action cannot be undone. This will permanently remove the selected subscriber(s).')} {__('Cancel')} {__('Delete')}

{__('Newsletter Welcome Email')}

{__('Welcome email sent when someone subscribes to your newsletter')}

{__('New Subscriber Notification (Admin)')}

{__('Admin notification when someone subscribes to newsletter')}

); }