"use client"; import { Box, Table, Badge, HStack, IconButton, Button } from "@chakra-ui/react"; import { useState, useEffect, useCallback } from "react"; import { useSession } from "next-auth/react"; import { LuEye, LuPencil, LuTrash2, LuRefreshCw } from "react-icons/lu"; import { toaster } from "@/components/ui/feedback/toaster"; import { ContentPreviewDialog } from "./ContentPreviewDialog"; const getStatusColor = (status: string) => { switch (status?.toLowerCase()) { case "published": return "green"; case "draft": return "gray"; case "scheduled": return "blue"; case "review": return "orange"; default: return "gray"; } }; export function ContentTable() { const { data: session } = useSession(); const [selectedItem, setSelectedItem] = useState(null); const [isPreviewOpen, setIsPreviewOpen] = useState(false); const [contentList, setContentList] = useState([]); const [isLoading, setIsLoading] = useState(false); const fetchContent = useCallback(async () => { setIsLoading(true); try { const headers: HeadersInit = {}; if (session?.accessToken) { headers['Authorization'] = `Bearer ${session.accessToken}`; } const res = await fetch('/api/backend/content', { headers, }); if (res.ok) { const responseData = await res.json(); // Handle wrapped response from global interceptor: { success, data, message } const items = responseData?.data || responseData; setContentList(Array.isArray(items) ? items : []); } } catch (error) { console.error("Failed to fetch content:", error); } finally { setIsLoading(false); } }, [session]); useEffect(() => { fetchContent(); }, [fetchContent]); const handleDelete = async (item: any) => { if (!session?.accessToken) return; try { const res = await fetch(`/api/backend/content/${item.id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${session.accessToken}` } }); if (res.ok) { toaster.create({ title: "Deleted", description: `"${item.title || 'Content'}" removed.`, type: "success" }); fetchContent(); } else { toaster.create({ title: "Delete failed", type: "error" }); } } catch { toaster.create({ title: "Delete failed", type: "error" }); } }; const handleAction = (action: string, item: any) => { if (action === 'View') { setSelectedItem(item); setIsPreviewOpen(true); return; } if (action === 'Edit') { // Open the preview in edit mode setSelectedItem(item); setIsPreviewOpen(true); return; } if (action === 'Delete') { handleDelete(item); return; } }; return ( <> Title Platform Status Date Actions {isLoading ? ( Loading content... ) : contentList.length === 0 ? ( No content found. Start by generating some! ) : contentList.map((item) => ( {item.title || item.body?.substring(0, 60) + '...' || 'Untitled'} {item.type || item.platform} {item.status} {new Date(item.createdAt || item.date).toLocaleDateString()} handleAction('View', item)} > handleAction('Edit', item)} > handleAction('Delete', item)} > ))} setIsPreviewOpen(e.open)} onContentUpdated={fetchContent} /> ); }