This commit is contained in:
gpt-engineer-app[bot]
2026-01-28 00:26:48 +00:00
parent 80a60bf8d4
commit 3ce5a730d5
9 changed files with 787 additions and 1 deletions
+120
View File
@@ -0,0 +1,120 @@
import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import { supabase } from "@/integrations/supabase/client";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Button } from "@/components/ui/button";
import { AdminStats } from "@/components/admin/AdminStats";
import { OrdersTable } from "@/components/admin/OrdersTable";
import { CustomersTable } from "@/components/admin/CustomersTable";
import { PaymentsTable } from "@/components/admin/PaymentsTable";
import { Package, Users, CreditCard, LogOut, ArrowLeft } from "lucide-react";
import { Skeleton } from "@/components/ui/skeleton";
export default function Admin() {
const navigate = useNavigate();
const [loading, setLoading] = useState(true);
const [isAuthenticated, setIsAuthenticated] = useState(false);
useEffect(() => {
const checkAuth = async () => {
const { data: { session } } = await supabase.auth.getSession();
if (!session) {
navigate("/");
return;
}
setIsAuthenticated(true);
setLoading(false);
};
const { data: { subscription } } = supabase.auth.onAuthStateChange((event, session) => {
if (!session) {
navigate("/");
}
});
checkAuth();
return () => subscription.unsubscribe();
}, [navigate]);
const handleLogout = async () => {
await supabase.auth.signOut();
navigate("/");
};
if (loading) {
return (
<div className="min-h-screen bg-background p-8">
<div className="max-w-7xl mx-auto space-y-8">
<Skeleton className="h-10 w-48" />
<div className="grid gap-4 md:grid-cols-2 lg:grid-cols-4">
{[...Array(4)].map((_, i) => (
<Skeleton key={i} className="h-32" />
))}
</div>
<Skeleton className="h-96" />
</div>
</div>
);
}
if (!isAuthenticated) {
return null;
}
return (
<div className="min-h-screen bg-background">
<header className="border-b">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
<div className="flex items-center justify-between">
<div className="flex items-center gap-4">
<Button variant="ghost" size="icon" onClick={() => navigate("/")}>
<ArrowLeft className="h-5 w-5" />
</Button>
<h1 className="text-2xl font-bold">Admin Dashboard</h1>
</div>
<Button variant="outline" onClick={handleLogout}>
<LogOut className="h-4 w-4 mr-2" />
Logga ut
</Button>
</div>
</div>
</header>
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
<div className="space-y-8">
<AdminStats />
<Tabs defaultValue="orders" className="space-y-6">
<TabsList>
<TabsTrigger value="orders" className="gap-2">
<Package className="h-4 w-4" />
Ordrar
</TabsTrigger>
<TabsTrigger value="customers" className="gap-2">
<Users className="h-4 w-4" />
Kunder
</TabsTrigger>
<TabsTrigger value="payments" className="gap-2">
<CreditCard className="h-4 w-4" />
Betalningar
</TabsTrigger>
</TabsList>
<TabsContent value="orders">
<OrdersTable />
</TabsContent>
<TabsContent value="customers">
<CustomersTable />
</TabsContent>
<TabsContent value="payments">
<PaymentsTable />
</TabsContent>
</Tabs>
</div>
</main>
</div>
);
}