draupnir4all-web

git clone git://archive.git.mtrnord.blog/MTRNord/draupnir4all-web.git
Log | Files | Refs | README | LICENSE

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 }