165 lines
6.8 KiB
TypeScript
165 lines
6.8 KiB
TypeScript
import Layout from "@/components/Layout";
|
||
import LoadingScreen from "@/components/LoadingScreen";
|
||
import { useAuth } from "@/contexts/AuthContext";
|
||
import { useEffect } from "react";
|
||
import { useNavigate } from "react-router-dom";
|
||
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
|
||
import { Badge } from "@/components/ui/badge";
|
||
import { Button } from "@/components/ui/button";
|
||
import { Shield, UserCog, Rocket, Settings, Users, Activity } from "lucide-react";
|
||
|
||
export default function Admin() {
|
||
const { user, loading, roles } = useAuth();
|
||
const navigate = useNavigate();
|
||
const isOwner = Array.isArray(roles) && roles.includes("owner");
|
||
|
||
useEffect(() => {
|
||
if (!loading) {
|
||
if (!user) {
|
||
navigate("/login", { replace: true });
|
||
}
|
||
}
|
||
}, [user, loading, navigate]);
|
||
|
||
if (loading || !user) {
|
||
return (
|
||
<LoadingScreen message="Verifying admin access..." showProgress duration={1000} />
|
||
);
|
||
}
|
||
|
||
if (!isOwner) {
|
||
return (
|
||
<Layout>
|
||
<div className="min-h-screen bg-aethex-gradient py-12">
|
||
<div className="container mx-auto px-4 max-w-3xl">
|
||
<Card className="bg-red-500/10 border-red-500/30">
|
||
<CardHeader>
|
||
<CardTitle className="text-red-400">Access Denied</CardTitle>
|
||
<CardDescription>You dont have permission to access the admin panel.</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<Button onClick={() => navigate("/dashboard")}>Go to Dashboard</Button>
|
||
</CardContent>
|
||
</Card>
|
||
</div>
|
||
</div>
|
||
</Layout>
|
||
);
|
||
}
|
||
|
||
return (
|
||
<Layout>
|
||
<div className="min-h-screen bg-aethex-gradient py-12">
|
||
<div className="container mx-auto px-4 max-w-6xl space-y-8">
|
||
<div className="flex items-center justify-between">
|
||
<div>
|
||
<h1 className="text-3xl font-bold text-gradient">Admin Panel</h1>
|
||
<p className="text-muted-foreground">Site Owner • Admin • Founder</p>
|
||
<div className="flex gap-2 mt-2">
|
||
<Badge variant="outline" className="border-green-500/50 text-green-400">Site Owner</Badge>
|
||
<Badge variant="outline" className="border-blue-500/50 text-blue-400">Admin</Badge>
|
||
<Badge variant="outline" className="border-purple-500/50 text-purple-400">Founder</Badge>
|
||
</div>
|
||
</div>
|
||
<div className="flex gap-2">
|
||
<Button variant="outline" onClick={() => navigate("/dashboard")}>Dashboard</Button>
|
||
<Button variant="outline" onClick={() => navigate("/profile")}>Profile</Button>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<Shield className="h-5 w-5 text-green-400" />
|
||
<CardTitle className="text-lg">Access Control</CardTitle>
|
||
</div>
|
||
<CardDescription>Owner-only access is enforced by email</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<ul className="text-sm space-y-1 text-muted-foreground">
|
||
<li>
|
||
Owner: <span className="text-foreground">mrpiglr@gmail.com</span>
|
||
</li>
|
||
<li>All other users are denied access</li>
|
||
</ul>
|
||
</CardContent>
|
||
</Card>
|
||
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<Users className="h-5 w-5 text-blue-400" />
|
||
<CardTitle className="text-lg">Users & Roles</CardTitle>
|
||
</div>
|
||
<CardDescription>Future: manage roles, invitations, and status</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<p className="text-sm text-muted-foreground">Coming soon</p>
|
||
</CardContent>
|
||
</Card>
|
||
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<Settings className="h-5 w-5 text-yellow-400" />
|
||
<CardTitle className="text-lg">Site Settings</CardTitle>
|
||
</div>
|
||
<CardDescription>Branding, legal, integrations</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<Button variant="outline" onClick={() => navigate("/get-started")}>Open Settings</Button>
|
||
</CardContent>
|
||
</Card>
|
||
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<Activity className="h-5 w-5 text-orange-400" />
|
||
<CardTitle className="text-lg">System Status</CardTitle>
|
||
</div>
|
||
<CardDescription>Auth, database, and services</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<ul className="text-sm text-muted-foreground space-y-1">
|
||
<li>Auth: Operational</li>
|
||
<li>Database: Operational (mock fallback available)</li>
|
||
<li>Realtime: Operational</li>
|
||
</ul>
|
||
</CardContent>
|
||
</Card>
|
||
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<Rocket className="h-5 w-5 text-purple-400" />
|
||
<CardTitle className="text-lg">Quick Actions</CardTitle>
|
||
</div>
|
||
<CardDescription>Common admin operations</CardDescription>
|
||
</CardHeader>
|
||
<CardContent className="flex flex-wrap gap-2">
|
||
<Button size="sm" onClick={() => navigate("/dashboard")}>View Dashboard</Button>
|
||
<Button size="sm" variant="outline" onClick={() => navigate("/onboarding")}>Run Onboarding</Button>
|
||
</CardContent>
|
||
</Card>
|
||
|
||
<Card className="bg-card/50 border-border/50">
|
||
<CardHeader>
|
||
<div className="flex items-center gap-2">
|
||
<UserCog className="h-5 w-5 text-teal-400" />
|
||
<CardTitle className="text-lg">Your Account</CardTitle>
|
||
</div>
|
||
<CardDescription>Signed in as {user.email}</CardDescription>
|
||
</CardHeader>
|
||
<CardContent>
|
||
<div className="text-sm text-muted-foreground">
|
||
You have full administrative access.
|
||
</div>
|
||
</CardContent>
|
||
</Card>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</Layout>
|
||
);
|
||
}
|