import React, { useEffect, useState } from 'react'; import api from '../../utils/api'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Badge } from '../../components/ui/badge'; import { Input } from '../../components/ui/input'; import { Label } from '../../components/ui/label'; import { Textarea } from '../../components/ui/textarea'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../components/ui/select'; import { toast } from 'sonner'; import { FileText, Plus, Edit, Trash2, Calendar, ExternalLink } from 'lucide-react'; const AdminNewsletters = () => { const [newsletters, setNewsletters] = useState([]); const [loading, setLoading] = useState(true); const [dialogOpen, setDialogOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [selectedNewsletter, setSelectedNewsletter] = useState(null); const [newsletterToDelete, setNewsletterToDelete] = useState(null); const [uploadedFile, setUploadedFile] = useState(null); const [formData, setFormData] = useState({ title: '', description: '', published_date: '', document_url: '', document_type: 'google_docs' }); const [submitting, setSubmitting] = useState(false); useEffect(() => { fetchNewsletters(); }, []); const fetchNewsletters = async () => { try { const response = await api.get('/newsletters'); setNewsletters(response.data); } catch (error) { toast.error('Failed to fetch newsletters'); } finally { setLoading(false); } }; const handleCreate = () => { setSelectedNewsletter(null); setFormData({ title: '', description: '', published_date: new Date().toISOString().split('T')[0], document_url: '', document_type: 'google_docs' }); setDialogOpen(true); }; const handleEdit = (newsletter) => { setSelectedNewsletter(newsletter); setFormData({ title: newsletter.title, description: newsletter.description || '', published_date: new Date(newsletter.published_date).toISOString().split('T')[0], document_url: newsletter.document_url, document_type: newsletter.document_type }); setDialogOpen(true); }; const handleDelete = (newsletter) => { setNewsletterToDelete(newsletter); setDeleteDialogOpen(true); }; const handleSubmit = async (e) => { e.preventDefault(); setSubmitting(true); try { const formDataToSend = new FormData(); formDataToSend.append('title', formData.title); formDataToSend.append('description', formData.description); formDataToSend.append('published_date', new Date(formData.published_date).toISOString()); formDataToSend.append('document_type', formData.document_type); // Handle file upload or URL based on document_type if (formData.document_type === 'upload') { if (!uploadedFile && !selectedNewsletter) { toast.error('Please select a file to upload'); setSubmitting(false); return; } if (uploadedFile) { formDataToSend.append('file', uploadedFile); } } else { formDataToSend.append('document_url', formData.document_url); } if (selectedNewsletter) { await api.put(`/admin/newsletters/${selectedNewsletter.id}`, formDataToSend); toast.success('Newsletter updated successfully'); } else { await api.post('/admin/newsletters', formDataToSend); toast.success('Newsletter created successfully'); } setDialogOpen(false); setUploadedFile(null); fetchNewsletters(); } catch (error) { toast.error(error.response?.data?.detail || 'Failed to save newsletter'); } finally { setSubmitting(false); } }; const confirmDelete = async () => { try { await api.delete(`/admin/newsletters/${newsletterToDelete.id}`); toast.success('Newsletter deleted successfully'); setDeleteDialogOpen(false); fetchNewsletters(); } catch (error) { toast.error('Failed to delete newsletter'); } }; const formatDate = (dateString) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }); }; const groupByYear = (newsletters) => { const grouped = {}; newsletters.forEach(newsletter => { const year = new Date(newsletter.published_date).getFullYear(); if (!grouped[year]) { grouped[year] = []; } grouped[year].push(newsletter); }); return grouped; }; const groupedNewsletters = groupByYear(newsletters); const sortedYears = Object.keys(groupedNewsletters).sort((a, b) => b - a); if (loading) { return (
Loading newsletters...
Create and manage newsletter archive
No newsletters yet
{newsletter.description}
)}