page.tsx (8401B)
1 import { AlertTriangle, Ban, CheckCircle } from "lucide-react" 2 import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" 3 import AddProtectedRoom from "../../../components/modals/add-protected-room" 4 import ProtectedRomsList from "../../../components/dashboard/protected-rooms-list" 5 import { mockPolicyLists } from "../mockData" 6 import TabNavigation from "../../../components/dashboard/tab-navigation"; 7 import LayoutWrapper from "@/components/dashboard/layoutWrapper" 8 import { listBots } from "@/lib/api" 9 import { cookies } from "next/headers" 10 import { User } from "@/lib/auth" 11 12 export default async function OverviewPage({ 13 searchParams, 14 }: { 15 searchParams: Promise<{ [key: string]: string | string[] | undefined }> 16 }) { 17 const teamIdParam = (await searchParams).team as string | undefined; 18 const cookieStore = await cookies() 19 const session: User = JSON.parse(cookieStore.get("d4all_session")?.value || "{}") 20 if (!session.token) { 21 return <div className="flex h-screen w-full items-center justify-center">Loading...</div> 22 } 23 const listData = await listBots(session.matrixId, session.token); 24 25 if (!listData) { 26 return <div className="flex h-screen w-full items-center justify-center">Loading...</div> 27 } 28 29 const selectedBot = listData.bots.find((team) => team.id === teamIdParam) ?? listData.bots[0]; 30 if (!selectedBot) { 31 // TODO: Redirect to register page? 32 return <div className="flex h-screen w-full items-center justify-center">Loading...</div> 33 } 34 // TODO: get policy list details from the API 35 const policyLists = mockPolicyLists; 36 37 return ( 38 <LayoutWrapper listData={listData} activeTab="overview" teamIdParam={teamIdParam}> 39 <TabNavigation selectedBot={selectedBot} currentTab="overview" /> 40 <div className="space-y-8"> 41 <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4"> 42 <Card className="border-gray-800 bg-gray-950"> 43 <CardHeader className="pb-2"> 44 <CardTitle className="text-sm font-medium">Protected Rooms</CardTitle> 45 </CardHeader> 46 <CardContent> 47 <div className="text-2xl font-bold">{selectedBot.protectedRooms.length}</div> 48 <div className="flex justify-between items-center"> 49 <p className="text-xs text-gray-400">Monitored by this bot</p> 50 <AddProtectedRoom /> 51 </div> 52 </CardContent> 53 </Card> 54 {/* Disabled until Druapnir has storage for it 55 <Card className="border-gray-800 bg-gray-950"> 56 <CardHeader className="pb-2"> 57 <CardTitle className="text-sm font-medium">Active Reports</CardTitle> 58 </CardHeader> 59 <CardContent> 60 <div className="text-2xl font-bold">{reports.length}</div> 61 <p className="text-xs text-gray-400">{reports.filter((r) => r.priority === "high").length} high priority</p> 62 </CardContent> 63 </Card>*/} 64 <Card className="border-gray-800 bg-gray-950"> 65 <CardHeader className="pb-2"> 66 <CardTitle className="text-sm font-medium">Bans Issued</CardTitle> 67 </CardHeader> 68 <CardContent> 69 <div className="text-2xl font-bold"> 70 {policyLists.reduce((total, list) => total + list.entries.length, 0)} 71 </div> 72 <p className="text-xs text-gray-400">Across all policy lists</p> 73 </CardContent> 74 </Card> 75 <Card className="border-gray-800 bg-gray-950"> 76 <CardHeader className="pb-2"> 77 <CardTitle className="text-sm font-medium">Bot Status</CardTitle> 78 </CardHeader> 79 <CardContent> 80 <div className="flex items-center gap-2"> 81 <div className="h-3 w-3 rounded-full bg-green-500"></div> 82 <div className="text-sm font-medium">Online</div> 83 </div> 84 <p className="text-xs text-gray-400">Last restart: 7d ago</p> 85 </CardContent> 86 </Card> 87 </div> 88 89 <div className="grid gap-4 md:grid-cols-2"> 90 <Card className="border-gray-800 bg-gray-950"> 91 <CardHeader> 92 <CardTitle>Recent Activity</CardTitle> 93 <CardDescription className="text-gray-400">Latest moderation actions</CardDescription> 94 </CardHeader> 95 <CardContent> 96 <div className="space-y-4"> 97 <div className="flex items-start gap-4"> 98 <div className="rounded-full bg-red-500/20 p-2"> 99 <Ban className="h-4 w-4 text-red-500" /> 100 </div> 101 <div className="space-y-1"> 102 <p className="text-sm font-medium">User banned</p> 103 <p className="text-xs text-gray-400">@spammer:matrix.org was banned from all rooms</p> 104 <p className="text-xs text-gray-500">10 minutes ago</p> 105 </div> 106 </div> 107 <div className="flex items-start gap-4"> 108 <div className="rounded-full bg-yellow-500/20 p-2"> 109 <AlertTriangle className="h-4 w-4 text-yellow-500" /> 110 </div> 111 <div className="space-y-1"> 112 <p className="text-sm font-medium">Report created</p> 113 <p className="text-xs text-gray-400">Spam detected in #support</p> 114 <p className="text-xs text-gray-500">1 hour ago</p> 115 </div> 116 </div> 117 <div className="flex items-start gap-4"> 118 <div className="rounded-full bg-green-500/20 p-2"> 119 <CheckCircle className="h-4 w-4 text-green-500" /> 120 </div> 121 <div className="space-y-1"> 122 <p className="text-sm font-medium">Report resolved</p> 123 <p className="text-xs text-gray-400">Harassment report in #community resolved</p> 124 <p className="text-xs text-gray-500">3 hours ago</p> 125 </div> 126 </div> 127 </div> 128 </CardContent> 129 </Card> 130 131 <Card className="border-gray-800 bg-gray-950"> 132 <CardHeader> 133 <div className="flex items-center justify-between"> 134 <div> 135 <CardTitle>Protected Rooms</CardTitle> 136 <CardDescription className="text-gray-400">Rooms monitored by this bot</CardDescription> 137 </div> 138 <AddProtectedRoom filled /> 139 </div> 140 </CardHeader> 141 <CardContent> 142 <ProtectedRomsList selectedBot={selectedBot} /> 143 </CardContent> 144 </Card> 145 </div> 146 </div> 147 </LayoutWrapper> 148 ) 149 }