import React, { useState, useEffect, Suspense, lazy } from "react"; import { toast } from 'react-toastify'; import { DataTable } from "primereact/datatable"; import { Column } from "primereact/column"; import { Dropdown } from "primereact/dropdown"; import { Button } from "@mui/joy"; import { Dialog } from "primereact/dialog"; import { confirmDialog, ConfirmDialog } from "primereact/confirmdialog"; import BreadcrumbNav from "./BreadcrumbNav"; const STATUS_OPTIONS = ["Pending", "Completed", "Failed"]; const TYPE_OPTIONS = ["Artist", "Album", "Track"]; const initialRequests = [ { id: 1, type: "Artist", artist: "Bring Me The Horizon", album: "", track: "", status: "Pending", details: { requestedBy: "codey", timestamp: "2025-07-01T12:00:00Z", comments: "", }, }, { id: 2, type: "Track", artist: "We Butter The Bread With Butter", album: "Das Album", track: "20 km/h", status: "Failed", details: { requestedBy: "codey", timestamp: "2025-06-11T09:00:00Z", comments: "Track not found in external database.", }, }, { id: 3, type: "Track", artist: "We Butter The Bread With Butter", album: "Das Album", track: "20 km/h", status: "Completed", details: { requestedBy: "codey", timestamp: "2025-06-11T09:00:00Z", comments: "Track retrieved successfully.", }, }, ]; export default function RequestManagement() { const [requests, setRequests] = useState(initialRequests); const [filterType, setFilterType] = useState(null); const [filterStatus, setFilterStatus] = useState(null); const [filteredRequests, setFilteredRequests] = useState(initialRequests); const [selectedRequest, setSelectedRequest] = useState(null); const [isDialogVisible, setIsDialogVisible] = useState(false); useEffect(() => { let filtered = [...requests]; if (filterType) { filtered = filtered.filter((r) => r.type === filterType); } if (filterStatus) { filtered = filtered.filter((r) => r.status === filterStatus); } setFilteredRequests(filtered); }, [filterType, filterStatus, requests]); const getStatusTextColor = (status) => { switch (status) { case "Pending": return "text-yellow-500"; case "Completed": return "text-green-500"; case "Failed": return "text-red-500"; default: return "text-neutral-500"; } }; const confirmDelete = (requestId) => { confirmDialog({ message: "Are you sure you want to delete this request?", header: "Confirm Delete", icon: "pi pi-exclamation-triangle", accept: () => deleteRequest(requestId), }); }; const deleteRequest = (requestId) => { setRequests((prev) => prev.filter((r) => r.id !== requestId)); toast.success("Request deleted"); }; const statusBodyTemplate = (rowData) => { let colorClass = ""; switch (rowData.status) { case "Pending": colorClass = "bg-yellow-300 text-yellow-900"; break; case "Completed": colorClass = "bg-green-300 text-green-900"; break; case "Failed": colorClass = "bg-red-300 text-red-900"; break; default: colorClass = "bg-gray-300 text-gray-900"; } return ( {rowData.status} ); }; const actionBodyTemplate = (rowData) => { return ( ); }; return (

Media Request Management

({ label: t, value: t })), ]} onChange={(e) => setFilterType(e.value)} placeholder="Filter by Type" className="min-w-[180px]" /> ({ label: s, value: s })), ]} onChange={(e) => setFilterStatus(e.value)} placeholder="Filter by Status" className="min-w-[180px]" />
{ setSelectedRequest(e.data); setIsDialogVisible(true); }} > setIsDialogVisible(false)} breakpoints={{ '960px': '95vw' }} modal dismissableMask > {selectedRequest && (

ID: {selectedRequest.id}

Type: {selectedRequest.type}

Artist: {selectedRequest.artist}

{selectedRequest.album &&

Album: {selectedRequest.album}

} {selectedRequest.track &&

Track: {selectedRequest.track}

}

Status: {selectedRequest.status}

{selectedRequest.details && ( <>

Requested By: {selectedRequest.details.requestedBy}

Timestamp: {new Date(selectedRequest.details.timestamp).toLocaleString()}

{selectedRequest.details.comments && (

Comments: {selectedRequest.details.comments}

)} )}
)}
); }