diff --git a/src/pages/admin/announcements/index.tsx b/src/pages/admin/announcements/index.tsx index a7a6a1c..5a1f656 100644 --- a/src/pages/admin/announcements/index.tsx +++ b/src/pages/admin/announcements/index.tsx @@ -27,13 +27,50 @@ 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: () => { @@ -46,6 +83,59 @@ export default function AnnouncementsPage() { }, }) + 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) @@ -56,7 +146,7 @@ export default function AnnouncementsPage() {

Announcements

- @@ -104,7 +194,11 @@ export default function AnnouncementsPage() {
-