import React, {useEffect, useState} from 'react'; import { Container, Grid, Paper, Typography, Box, Avatar, Divider, Button, CircularProgress, Table, TableBody, TableCell, TableHead, TableRow, Chip, IconButton, TextField, Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; import AdminPanelSettingsIcon from '@mui/icons-material/AdminPanelSettings'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import CancelIcon from '@mui/icons-material/Cancel'; import BuildIcon from '@mui/icons-material/Build'; import MemoryIcon from '@mui/icons-material/Memory'; import AddIcon from '@mui/icons-material/Add'; import DeleteIcon from '@mui/icons-material/Delete'; import { getAdminInfoAndData, onSetBuildApprovalStatus, onSetComponentSuggestionStatus } from './adminDashboard.telefunc'; import BuildCard from '../../../components/BuildCard'; import BuildDetailsDialog from '../../../components/BuildDetailsDialog'; import {onDeleteBuild} from "../user/userDashboard.telefunc"; import AddComponentDialog from "../../../components/AddComponentDialog"; export default function AdminDashboard() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [selectedBuildId, setSelectedBuildId] = useState(null); const [deleteDialog, setDeleteDialog] = useState<{ open: boolean, buildId: number | null, buildName: string }>({open: false, buildId: null, buildName: ''}); const [deleteLoading, setDeleteLoading] = useState(false); const [addDialogOpen, setAddDialogOpen] = useState(false); const [buildApprovalDialog, setBuildApprovalDialog] = useState<{ open: boolean, buildId: number | null, buildName: string }>({open: false, buildId: null, buildName: ''}); const [rejectReason, setRejectReason] = useState(''); const [approvalLoading, setApprovalLoading] = useState(false); const [suggestionDialog, setSuggestionDialog] = useState<{ open: boolean, id: number | null, action: 'approved' | 'rejected' }>({open: false, id: null, action: 'approved'}); const [adminComment, setAdminComment] = useState(""); const loadData = () => { setLoading(true); getAdminInfoAndData() .then(res => { setData(res); setLoading(false); }) .catch(err => { console.error(err); alert("Failed to load admin data. Are you an admin?"); setLoading(false); }); }; useEffect(() => { loadData(); }, []); const openBuildApproval = (buildId: number, buildName: string) => { setBuildApprovalDialog({open: true, buildId, buildName}); setRejectReason(''); }; const handleApproveBuild = async () => { if (!buildApprovalDialog.buildId) return; setApprovalLoading(true); try { await onSetBuildApprovalStatus({buildId: buildApprovalDialog.buildId, isApproved: true}); setBuildApprovalDialog({open: false, buildId: null, buildName: ''}); loadData(); } catch (e) { alert("Approve failed"); } finally { setApprovalLoading(false); } }; const handleRejectBuild = async () => { if (!buildApprovalDialog.buildId || !rejectReason.trim()) return; setApprovalLoading(true); try { await onSetBuildApprovalStatus({buildId: buildApprovalDialog.buildId, isApproved: false}); setBuildApprovalDialog({open: false, buildId: null, buildName: ''}); loadData(); } catch (e) { alert("Reject failed"); } finally { setApprovalLoading(false); } }; const openSuggestionReview = (id: number, action: 'approved' | 'rejected') => { setSuggestionDialog({open: true, id, action}); setAdminComment(action === 'approved' ? "" : ""); }; const submitSuggestionReview = async () => { if (!suggestionDialog.id) return; try { await onSetComponentSuggestionStatus({ suggestionId: suggestionDialog.id, status: suggestionDialog.action, adminComment: adminComment }); setSuggestionDialog({...suggestionDialog, open: false}); loadData(); } catch (e) { alert("Failed to update suggestion"); } }; const openDeleteDialog = (buildId: number, buildName: string) => { setDeleteDialog({open: true, buildId, buildName}); }; const handleDelete = async () => { if (!deleteDialog.buildId) return; setDeleteLoading(true); try { await onDeleteBuild({buildId: deleteDialog.buildId}); setDeleteDialog({open: false, buildId: null, buildName: ''}); loadData(); setSelectedBuildId(null); } catch (e) { alert("Failed to delete build"); } finally { setDeleteLoading(false); } }; if (loading) { return ( ); } if (!data) { return ( Access Denied - Admin privileges required ); } return ( {data.admin?.username || 'Admin'} {data.admin?.email || 'admin@example.com'} {data.pendingBuilds?.length || 0} Pending Builds Suggested Components ({data.componentSuggestions?.length || 0}) {data.componentSuggestions?.length === 0 ? ( No pending suggestions. ) : ( Link/Description Type User Actions {data.componentSuggestions?.map((sug: any) => ( {sug.description || sug.link} {sug.componentType?.toUpperCase()} {sug.userId} openSuggestionReview(sug.id, 'approved')} > openSuggestionReview(sug.id, 'rejected')} > ))}
)}
Builds Waiting for Approval ({data.pendingBuilds?.length || 0}) {data.pendingBuilds?.length === 0 ? ( No pending builds. ) : ( {data.pendingBuilds.map((build: any) => ( setSelectedBuildId(build.id)} /> ))} )} My Builds / Sandbox {data.userBuilds?.length === 0 ? ( No builds created by admin. ) : ( {data.userBuilds.slice(0, 4).map((build: any) => ( setSelectedBuildId(build.id)} /> ))} )}
setSuggestionDialog({...suggestionDialog, open: false})}> Review Component Suggestion Status: {suggestionDialog.action.toUpperCase()} setAdminComment(e.target.value)} sx={{ mt: 2 }} /> setBuildApprovalDialog({open: false, buildId: null, buildName: ''})} > Review Build {buildApprovalDialog.buildName} Build ID: {buildApprovalDialog.buildId} setRejectReason(e.target.value)} placeholder="Why reject this build?" sx={{mt: 1}} /> setDeleteDialog({open: false, buildId: null, buildName: ''})} > Delete Build {deleteDialog.buildName} Are you sure you want to permanently delete this build? This action cannot be undone. setSelectedBuildId(null)} isDashboardView={true} /> setAddDialogOpen(false)} onSuccess={() => { loadData(); setAddDialogOpen(false); }} />
); }