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 { getAdminInfoAndData, onSetBuildApprovalStatus, onSetComponentSuggestionStatus } from './adminDashboard.telefunc'; import BuildCard from '../../../components/BuildCard'; import BuildDetailsDialog from '../../../components/BuildDetailsDialog'; export default function AdminDashboard() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [selectedBuildId, setSelectedBuildId] = useState(null); const [suggestionDialog, setSuggestionDialog] = useState<{ open: boolean, id: number | null, action: 'approved' | 'rejected' }>({ open: false, id: null, action: 'approved' }); const [adminComment, setAdminComment] = useState(""); const loadData = () => { getAdminInfoAndData() .then(res => { setData(res); setLoading(false); }) .catch(err => { console.error(err); alert("Failed to load admin data. Are you an admin?"); }); }; useEffect(() => { loadData(); }, []); const handleBuildReview = async (buildId: number, isApproved: boolean) => { if (!confirm(`Are you sure you want to ${isApproved ? 'APPROVE' : 'REJECT'} this build?`)) return; try { await onSetBuildApprovalStatus({ buildId, isApproved }); loadData(); } catch (e) { alert("Action failed"); } }; const openSuggestionReview = (id: number, action: 'approved' | 'rejected') => { setSuggestionDialog({ open: true, id, action }); setAdminComment(action === 'approved' ? "Approved by admin." : "Rejected: "); }; const submitSuggestionReview = async () => { if (!suggestionDialog.id) return; try { await onSetComponentSuggestionStatus({ suggestionId: suggestionDialog.id, status: suggestionDialog.action, adminComment: adminComment }); // console.error("Test za admincomment: ", adminComment); setSuggestionDialog({ ...suggestionDialog, open: false }); loadData(); } catch (e) { alert("Failed to update suggestion"); } }; if (loading) return ; if (!data) return Access Denied; return ( {data.admin.username} {data.admin.email} {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} {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 Suggestion Status: {suggestionDialog.action.toUpperCase()} setAdminComment(e.target.value)} /> setSelectedBuildId(null)} onClone={() => alert("Clone disabled in admin view")} />
); }