import { useState, useEffect, useCallback } from "react"; import { BytescaleUploader } from "@/components/BytescaleUploader/BytescaleUploader"; import { getNewsApi, createNewsApi, updateNewsApi, deleteNewsApi, } from "@/api/newsMedia"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog"; import { Loader2, Plus, Pencil, Trash, RefreshCw, Eye, ChevronLeft, ChevronRight, Newspaper, ImageIcon, X, } from "lucide-react"; export default function NewsPage() { const [news, setNews] = useState([]); const [loading, setLoading] = useState(true); const [totalItems, setTotalItems] = useState(0); const [searchText, setSearchText] = useState(""); const [openModal, setOpenModal] = useState(false); const [editing, setEditing] = useState(null); const [viewOpen, setViewOpen] = useState(false); const [viewData, setViewData] = useState(null); const [currentPage, setCurrentPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(10); const [form, setForm] = useState({ headline: "", content: "", imageUrls: [] as string[], firstPara: "", secondPara: "", date: "", author: "", }); const fetchAll = useCallback(async () => { setLoading(true); try { const res = await getNewsApi(currentPage, itemsPerPage, searchText); setNews(res?.data || []); setTotalItems(res?.meta?.total || 0); } catch (err) { console.error(err); } finally { setLoading(false); } }, [currentPage, itemsPerPage, searchText]); useEffect(() => { fetchAll(); }, [fetchAll]); const totalPages = Math.ceil(totalItems / itemsPerPage); function handleChange(e: any) { setForm({ ...form, [e.target.name]: e.target.value }); } function removeImageUrl(index: number) { setForm((prev) => ({ ...prev, imageUrls: prev.imageUrls.filter((_, i) => i !== index), })); } function openAdd() { setEditing(null); setForm({ headline: "", content: "", imageUrls: [], firstPara: "", secondPara: "", date: "", author: "", }); setOpenModal(true); } function openEdit(item: any) { setEditing(item); setForm({ headline: item.Headline || "", content: item.Content || "", imageUrls: item.Images ? item.Images.map((img: any) => img.image) : [], firstPara: item.FirstPara || "", secondPara: item.SecondPara || "", date: item.Date ? item.Date.split("T")[0] : "", author: item.Author || "", }); setOpenModal(true); } function openView(item: any) { setViewData(item); setViewOpen(true); } async function handleSubmit() { try { const submissionData = { ...form, firstPara: form.headline, content: form.secondPara.length > 100 ? form.secondPara.substring(0, 100) + "..." : form.secondPara, }; if (editing) { await updateNewsApi(editing.Id, submissionData); } else { await createNewsApi(submissionData); } setOpenModal(false); fetchAll(); } catch (err) { console.error(err); } } async function handleDelete(id: number) { if (!confirm("Delete news?")) return; await deleteNewsApi(id); fetchAll(); } return (

News Media

{ setSearchText(e.target.value); setCurrentPage(1); // reset page }} />
News Archives
ID Cover Headline Author Date Content Preview Actions {loading ? ( ) : news.length === 0 ? ( No news articles found ) : ( news.map((item) => ( {item.Id} {item.Images?.[0] ? ( cover ) : (
)}
{item.Headline}
{item.Author || "-"} {item.Date ? new Date(item.Date).toLocaleDateString() : "-"}
{item.Content}
)) )}
{!loading && totalItems > 0 && (
Total {totalItems} articles (Page {currentPage} of{" "} {totalPages})
Page {currentPage} of {totalPages}
)}
{editing ? "Edit News Article" : "Add New News Article"}

Article Information