import { useState } from "react" import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog" import { Plus, Edit, Trash2 } from "lucide-react" import { announcementService } from "@/services" import { toast } from "sonner" import { format } from "date-fns" export default function AnnouncementsPage() { const queryClient = useQueryClient() const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) const [formDialogOpen, setFormDialogOpen] = useState(false) const [selectedAnnouncement, setSelectedAnnouncement] = useState(null) const [formData, setFormData] = useState({ title: '', message: '', type: 'info' as 'info' | 'warning' | 'success' | 'error', priority: 0, targetAudience: 'all', startsAt: '', endsAt: '', }) const { data: announcements, isLoading } = useQuery({ queryKey: ['admin', 'announcements'], queryFn: () => announcementService.getAnnouncements(false), }) const createMutation = useMutation({ mutationFn: (data: any) => announcementService.createAnnouncement(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'announcements'] }) toast.success("Announcement created successfully") setFormDialogOpen(false) resetForm() }, onError: (error: any) => { toast.error(error.response?.data?.message || "Failed to create announcement") }, }) const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: string; data: any }) => announcementService.updateAnnouncement(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'announcements'] }) toast.success("Announcement updated successfully") setFormDialogOpen(false) resetForm() }, onError: (error: any) => { toast.error(error.response?.data?.message || "Failed to update announcement") }, }) const deleteMutation = useMutation({ mutationFn: (id: string) => announcementService.deleteAnnouncement(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin', 'announcements'] }) toast.success("Announcement deleted successfully") setDeleteDialogOpen(false) }, onError: (error: any) => { toast.error(error.response?.data?.message || "Failed to delete announcement") }, }) const resetForm = () => { setFormData({ title: '', message: '', type: 'info', priority: 0, targetAudience: 'all', startsAt: '', endsAt: '', }) setSelectedAnnouncement(null) } const handleOpenCreateDialog = () => { resetForm() setFormDialogOpen(true) } const handleOpenEditDialog = (announcement: any) => { setSelectedAnnouncement(announcement) setFormData({ title: announcement.title || '', message: announcement.message || '', type: announcement.type || 'info', priority: announcement.priority || 0, targetAudience: announcement.targetAudience || 'all', startsAt: announcement.startsAt ? announcement.startsAt.split('T')[0] : '', endsAt: announcement.endsAt ? announcement.endsAt.split('T')[0] : '', }) setFormDialogOpen(true) } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!formData.title || !formData.message) { toast.error("Title and message are required") return } const submitData = { ...formData, startsAt: formData.startsAt || undefined, endsAt: formData.endsAt || undefined, } if (selectedAnnouncement) { updateMutation.mutate({ id: selectedAnnouncement.id, data: submitData }) } else { createMutation.mutate(submitData) } } const handleDelete = () => { if (selectedAnnouncement) { deleteMutation.mutate(selectedAnnouncement.id) } } return (

Announcements

All Announcements {isLoading ? (
Loading announcements...
) : ( <> Title Type Priority Status Start Date End Date Actions {announcements?.map((announcement: any) => ( {announcement.title} {announcement.type || 'info'} {announcement.priority || 0} {announcement.isActive ? 'Active' : 'Inactive'} {announcement.startsAt ? format(new Date(announcement.startsAt), 'MMM dd, yyyy') : 'N/A'} {announcement.endsAt ? format(new Date(announcement.endsAt), 'MMM dd, yyyy') : 'N/A'}
))}
{announcements?.length === 0 && (
No announcements found
)} )}
{/* Create/Edit Dialog */} {selectedAnnouncement ? 'Edit Announcement' : 'Create Announcement'} {selectedAnnouncement ? 'Update the announcement details below.' : 'Fill in the details to create a new announcement.'}
setFormData({ ...formData, title: e.target.value })} required />