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 { toast } from 'sonner'; 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 (email: string) => { await api.del(`/newsletter/subscribers/${encodeURIComponent(email)}`); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['newsletter-subscribers'] }); toast.success(__('Subscriber removed successfully')); }, onError: () => { toast.error(__('Failed to remove subscriber')); }, }); 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()) ); // Checkbox logic const [selectedIds, setSelectedIds] = useState([]); // Email strings 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 handleBulkDelete = async () => { if (!confirm(__('Are you sure you want to delete selected subscribers?'))) return; for (const email of selectedIds) { await deleteSubscriber.mutateAsync(email); } setSelectedIds([]); }; return (
{/* Actions Bar */}
setSearchQuery(e.target.value)} className="!pl-9" />
{selectedIds.length > 0 && ( )}
{/* Subscribers Table */} { 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')} )} { if (confirm(__('Are you sure you want to remove this subscriber?'))) { deleteSubscriber.mutate(subscriber.email); } }} > {__('Remove')} ))}
) } {/* Email Template Settings */}

{__('Newsletter Welcome Email')}

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

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

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

); }