eretrrefvdsfd / client /src /pages /AdminPage.tsx
cnmksjs's picture
Upload 60 files
590318c verified
import { useState, useEffect } from 'react'
import { Routes, Route, Link, useLocation } from 'react-router-dom'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
import {
Users,
MessageSquare,
Settings,
BarChart3,
Shield,
Activity,
Database,
Server
} from 'lucide-react'
// Mock data - replace with real API calls
const mockStats = {
totalUsers: 1234,
activeUsers: 567,
totalChats: 890,
totalMessages: 12345,
storageUsed: 2.5, // GB
serverUptime: 99.9 // %
}
export default function AdminPage() {
const [stats] = useState(mockStats)
const location = useLocation()
useEffect(() => {
// Load admin stats
// TODO: Implement API call
}, [])
return (
<div className="min-h-screen bg-background">
<div className="border-b">
<div className="flex h-16 items-center px-6">
<Shield className="w-6 h-6 mr-2" />
<h1 className="text-xl font-semibold">Admin Panel</h1>
</div>
</div>
<div className="flex">
{/* Sidebar */}
<div className="w-64 border-r min-h-screen p-4">
<nav className="space-y-2">
<Link
to="/admin"
className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium ${
location.pathname === '/admin'
? 'bg-primary text-primary-foreground'
: 'text-muted-foreground hover:text-foreground hover:bg-muted'
}`}
>
<BarChart3 className="w-4 h-4" />
<span>Dashboard</span>
</Link>
<Link
to="/admin/users"
className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium ${
location.pathname === '/admin/users'
? 'bg-primary text-primary-foreground'
: 'text-muted-foreground hover:text-foreground hover:bg-muted'
}`}
>
<Users className="w-4 h-4" />
<span>Users</span>
</Link>
<Link
to="/admin/chats"
className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium ${
location.pathname === '/admin/chats'
? 'bg-primary text-primary-foreground'
: 'text-muted-foreground hover:text-foreground hover:bg-muted'
}`}
>
<MessageSquare className="w-4 h-4" />
<span>Chats</span>
</Link>
<Link
to="/admin/settings"
className={`flex items-center space-x-2 px-3 py-2 rounded-md text-sm font-medium ${
location.pathname === '/admin/settings'
? 'bg-primary text-primary-foreground'
: 'text-muted-foreground hover:text-foreground hover:bg-muted'
}`}
>
<Settings className="w-4 h-4" />
<span>Settings</span>
</Link>
</nav>
</div>
{/* Main content */}
<div className="flex-1 p-6">
<Routes>
<Route path="/" element={<AdminDashboard stats={stats} />} />
<Route path="/users" element={<AdminUsers />} />
<Route path="/chats" element={<AdminChats />} />
<Route path="/settings" element={<AdminSettings />} />
</Routes>
</div>
</div>
</div>
)
}
function AdminDashboard({ stats }: { stats: typeof mockStats }) {
return (
<div className="space-y-6">
<div>
<h2 className="text-2xl font-bold">Dashboard</h2>
<p className="text-muted-foreground">
Overview of your ChatApp instance
</p>
</div>
{/* Stats Cards */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Total Users</CardTitle>
<Users className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.totalUsers.toLocaleString()}</div>
<p className="text-xs text-muted-foreground">
+12% from last month
</p>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Active Users</CardTitle>
<Activity className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.activeUsers.toLocaleString()}</div>
<p className="text-xs text-muted-foreground">
Currently online
</p>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Total Messages</CardTitle>
<MessageSquare className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.totalMessages.toLocaleString()}</div>
<p className="text-xs text-muted-foreground">
+5% from last week
</p>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Storage Used</CardTitle>
<Database className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.storageUsed} GB</div>
<p className="text-xs text-muted-foreground">
Of 10 GB available
</p>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Server Uptime</CardTitle>
<Server className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.serverUptime}%</div>
<p className="text-xs text-muted-foreground">
Last 30 days
</p>
</CardContent>
</Card>
<Card>
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle className="text-sm font-medium">Total Chats</CardTitle>
<MessageSquare className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{stats.totalChats.toLocaleString()}</div>
<p className="text-xs text-muted-foreground">
Groups and direct messages
</p>
</CardContent>
</Card>
</div>
{/* Recent Activity */}
<Card>
<CardHeader>
<CardTitle>Recent Activity</CardTitle>
<CardDescription>
Latest events in your ChatApp instance
</CardDescription>
</CardHeader>
<CardContent>
<div className="space-y-4">
<div className="flex items-center space-x-4">
<div className="w-2 h-2 bg-green-500 rounded-full"></div>
<div className="flex-1">
<p className="text-sm">New user registered: john_doe</p>
<p className="text-xs text-muted-foreground">2 minutes ago</p>
</div>
</div>
<div className="flex items-center space-x-4">
<div className="w-2 h-2 bg-blue-500 rounded-full"></div>
<div className="flex-1">
<p className="text-sm">New group created: "Project Team"</p>
<p className="text-xs text-muted-foreground">5 minutes ago</p>
</div>
</div>
<div className="flex items-center space-x-4">
<div className="w-2 h-2 bg-yellow-500 rounded-full"></div>
<div className="flex-1">
<p className="text-sm">Server maintenance completed</p>
<p className="text-xs text-muted-foreground">1 hour ago</p>
</div>
</div>
</div>
</CardContent>
</Card>
</div>
)
}
function AdminUsers() {
return (
<div className="space-y-6">
<div>
<h2 className="text-2xl font-bold">User Management</h2>
<p className="text-muted-foreground">
Manage users and their permissions
</p>
</div>
<Card>
<CardContent className="p-6">
<p className="text-center text-muted-foreground">
User management interface coming soon...
</p>
</CardContent>
</Card>
</div>
)
}
function AdminChats() {
return (
<div className="space-y-6">
<div>
<h2 className="text-2xl font-bold">Chat Management</h2>
<p className="text-muted-foreground">
Monitor and manage chats and groups
</p>
</div>
<Card>
<CardContent className="p-6">
<p className="text-center text-muted-foreground">
Chat management interface coming soon...
</p>
</CardContent>
</Card>
</div>
)
}
function AdminSettings() {
return (
<div className="space-y-6">
<div>
<h2 className="text-2xl font-bold">System Settings</h2>
<p className="text-muted-foreground">
Configure your ChatApp instance
</p>
</div>
<Card>
<CardContent className="p-6">
<p className="text-center text-muted-foreground">
Settings interface coming soon...
</p>
</CardContent>
</Card>
</div>
)
}