diff --git a/admin-spa/src/routes/Marketing/Newsletter.tsx b/admin-spa/src/routes/Marketing/Newsletter.tsx deleted file mode 100644 index c43e6f2..0000000 --- a/admin-spa/src/routes/Marketing/Newsletter.tsx +++ /dev/null @@ -1,225 +0,0 @@ -import React, { useState } from 'react'; -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { SettingsLayout } from '@/routes/Settings/components/SettingsLayout'; -import { SettingsCard } from '@/routes/Settings/components/SettingsCard'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Download, Trash2, Mail, Search } from 'lucide-react'; -import { toast } from 'sonner'; -import { api } from '@/lib/api'; -import { useNavigate } from 'react-router-dom'; -import { useModules } from '@/hooks/useModules'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table'; - -export default function NewsletterSubscribers() { - const [searchQuery, setSearchQuery] = useState(''); - const queryClient = useQueryClient(); - const navigate = useNavigate(); - const { isEnabled } = useModules(); - - // Always call ALL hooks before any conditional returns - const { data: subscribersData, isLoading } = useQuery({ - queryKey: ['newsletter-subscribers'], - queryFn: async () => { - const response = await api.get('/newsletter/subscribers'); - return response.data; - }, - enabled: isEnabled('newsletter'), // Only fetch when module is enabled - }); - - 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()) - ); - - if (!isEnabled('newsletter')) { - return ( - -
- -

Newsletter Module Disabled

-

- The newsletter module is currently disabled. Enable it in Settings > Modules to use this feature. -

- -
-
- ); - } - - return ( - - -
- {/* Actions Bar */} -
-
- - setSearchQuery(e.target.value)} - className="!pl-9" - /> -
-
- - -
-
- - {/* Subscribers Table */} - {isLoading ? ( -
- Loading subscribers... -
- ) : filteredSubscribers.length === 0 ? ( -
- {searchQuery ? 'No subscribers found matching your search' : 'No subscribers yet'} -
- ) : ( -
- - - - Email - Status - Subscribed Date - WP User - Actions - - - - {filteredSubscribers.map((subscriber: any) => ( - - {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 - )} - - - - - - ))} - -
-
- )} -
-
- - {/* 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 -

- -
-
-
-
- ); -}