Introduces new admin dashboard pages for alerts, bans, invites, orders, settings, status, and vendors under app/dashboard/admin/. Moves the main admin page to the new dashboard structure and adds a shared admin layout. Updates sidebar configuration and adds supporting components and hooks for admin features.
334 lines
12 KiB
TypeScript
334 lines
12 KiB
TypeScript
import React from "react";
|
|
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Input } from "@/components/ui/input";
|
|
import { Label } from "@/components/ui/label";
|
|
import { Switch } from "@/components/ui/switch";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
|
import { Textarea } from "@/components/ui/textarea";
|
|
import { Separator } from "@/components/ui/separator";
|
|
import { Settings, Shield, Bell, Database, Globe, Key, Save } from "lucide-react";
|
|
|
|
export default function AdminSettingsPage() {
|
|
return (
|
|
<div className="space-y-6">
|
|
<div>
|
|
<h1 className="text-2xl font-semibold tracking-tight">Admin Settings</h1>
|
|
<p className="text-sm text-muted-foreground mt-1">Configure system settings and preferences</p>
|
|
</div>
|
|
|
|
<div className="grid gap-6 lg:grid-cols-2">
|
|
{/* General Settings */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Settings className="h-5 w-5 mr-2" />
|
|
General Settings
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Basic platform configuration and preferences
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="siteName">Site Name</Label>
|
|
<Input id="siteName" defaultValue="Ember Market" />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="siteDescription">Site Description</Label>
|
|
<Textarea
|
|
id="siteDescription"
|
|
defaultValue="A secure cryptocurrency marketplace for vendors and customers"
|
|
rows={3}
|
|
/>
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="defaultCurrency">Default Currency</Label>
|
|
<Select defaultValue="btc">
|
|
<SelectTrigger>
|
|
<SelectValue />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="btc">Bitcoin (BTC)</SelectItem>
|
|
<SelectItem value="eth">Ethereum (ETH)</SelectItem>
|
|
<SelectItem value="ltc">Litecoin (LTC)</SelectItem>
|
|
<SelectItem value="usdt">Tether (USDT)</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Maintenance Mode</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Temporarily disable public access
|
|
</p>
|
|
</div>
|
|
<Switch />
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* Security Settings */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Shield className="h-5 w-5 mr-2" />
|
|
Security Settings
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Configure security policies and authentication
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Two-Factor Authentication</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Require 2FA for all admin accounts
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Session Timeout</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Auto-logout after inactivity
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="sessionDuration">Session Duration (minutes)</Label>
|
|
<Input id="sessionDuration" type="number" defaultValue="60" />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>IP Whitelist</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Restrict admin access to specific IPs
|
|
</p>
|
|
</div>
|
|
<Switch />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="allowedIPs">Allowed IP Addresses</Label>
|
|
<Textarea
|
|
id="allowedIPs"
|
|
placeholder="192.168.1.100 10.0.0.50"
|
|
rows={3}
|
|
/>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* Notification Settings */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Bell className="h-5 w-5 mr-2" />
|
|
Notification Settings
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Configure alert and notification preferences
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Email Notifications</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Send alerts via email
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="adminEmail">Admin Email</Label>
|
|
<Input id="adminEmail" type="email" defaultValue="admin@ember-market.com" />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Security Alerts</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Notify on security events
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>System Alerts</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Notify on system issues
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Order Alerts</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Notify on high-value orders
|
|
</p>
|
|
</div>
|
|
<Switch />
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* Database Settings */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Database className="h-5 w-5 mr-2" />
|
|
Database Settings
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Database configuration and maintenance
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="backupFrequency">Backup Frequency</Label>
|
|
<Select defaultValue="daily">
|
|
<SelectTrigger>
|
|
<SelectValue />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="hourly">Hourly</SelectItem>
|
|
<SelectItem value="daily">Daily</SelectItem>
|
|
<SelectItem value="weekly">Weekly</SelectItem>
|
|
<SelectItem value="monthly">Monthly</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>Auto Backup</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Automatically backup database
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="retentionPeriod">Backup Retention (days)</Label>
|
|
<Input id="retentionPeriod" type="number" defaultValue="30" />
|
|
</div>
|
|
|
|
<Separator />
|
|
|
|
<div className="space-y-2">
|
|
<Label>Database Actions</Label>
|
|
<div className="flex space-x-2">
|
|
<Button variant="outline" size="sm">
|
|
Create Backup
|
|
</Button>
|
|
<Button variant="outline" size="sm">
|
|
Optimize Database
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* API Settings */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Key className="h-5 w-5 mr-2" />
|
|
API Settings
|
|
</CardTitle>
|
|
<CardDescription>
|
|
API configuration and rate limiting
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-6">
|
|
<div className="space-y-2">
|
|
<Label htmlFor="apiVersion">API Version</Label>
|
|
<Input id="apiVersion" defaultValue="v1" />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="rateLimit">Rate Limit (requests/minute)</Label>
|
|
<Input id="rateLimit" type="number" defaultValue="1000" />
|
|
</div>
|
|
|
|
<div className="flex items-center justify-between">
|
|
<div className="space-y-0.5">
|
|
<Label>API Logging</Label>
|
|
<p className="text-sm text-muted-foreground">
|
|
Log all API requests
|
|
</p>
|
|
</div>
|
|
<Switch defaultChecked />
|
|
</div>
|
|
|
|
<div className="space-y-2">
|
|
<Label htmlFor="apiKey">Master API Key</Label>
|
|
<Input id="apiKey" type="password" defaultValue="••••••••••••••••" />
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
{/* System Information */}
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="flex items-center">
|
|
<Globe className="h-5 w-5 mr-2" />
|
|
System Information
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Platform version and system details
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent className="space-y-4">
|
|
<div className="flex justify-between">
|
|
<span className="text-sm font-medium">Platform Version</span>
|
|
<span className="text-sm text-muted-foreground">v2.1.0</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-sm font-medium">Database Version</span>
|
|
<span className="text-sm text-muted-foreground">MongoDB 6.0</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-sm font-medium">Node.js Version</span>
|
|
<span className="text-sm text-muted-foreground">v18.17.0</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-sm font-medium">Last Updated</span>
|
|
<span className="text-sm text-muted-foreground">2024-01-15</span>
|
|
</div>
|
|
<div className="flex justify-between">
|
|
<span className="text-sm font-medium">Uptime</span>
|
|
<span className="text-sm text-muted-foreground">15 days, 3 hours</span>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
|
|
{/* Save Button */}
|
|
<div className="flex justify-end">
|
|
<Button className="w-full sm:w-auto">
|
|
<Save className="h-4 w-4 mr-2" />
|
|
Save All Settings
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|