66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
import { redirect } from "next/navigation"
|
|
import { getServerSession } from "next-auth/next"
|
|
import { authOptions } from "@/lib/auth"
|
|
import { UserRole } from "@/types/database"
|
|
import { AdminSidebar } from "@/components/admin/sidebar"
|
|
|
|
export default async function AdminLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
// Check authentication and authorization
|
|
const session = await getServerSession(authOptions)
|
|
|
|
if (!session) {
|
|
redirect("/auth/signin")
|
|
}
|
|
|
|
// Check if user has admin role
|
|
if (session.user.role !== UserRole.SHOP_ADMIN && session.user.role !== UserRole.SUPER_ADMIN) {
|
|
redirect("/unauthorized")
|
|
}
|
|
|
|
return (
|
|
<div className="flex h-screen bg-gray-100">
|
|
{/* Sidebar */}
|
|
<AdminSidebar user={session.user} />
|
|
|
|
{/* Main content */}
|
|
<div className="flex-1 flex flex-col overflow-hidden">
|
|
{/* Header */}
|
|
<header className="bg-white shadow-sm border-b border-gray-200">
|
|
<div className="flex items-center justify-between px-6 py-4">
|
|
<h1 className="text-2xl font-semibold text-gray-900">
|
|
Admin Dashboard
|
|
</h1>
|
|
<div className="flex items-center space-x-4">
|
|
<span className="text-sm text-gray-600">
|
|
Welcome, {session.user.name}
|
|
</span>
|
|
<div className="w-8 h-8 bg-gray-300 rounded-full flex items-center justify-center">
|
|
{session.user.image ? (
|
|
<img
|
|
src={session.user.image}
|
|
alt={session.user.name}
|
|
className="w-8 h-8 rounded-full"
|
|
/>
|
|
) : (
|
|
<span className="text-sm font-medium text-gray-600">
|
|
{session.user.name.charAt(0).toUpperCase()}
|
|
</span>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
{/* Page content */}
|
|
<main className="flex-1 overflow-y-auto p-6">
|
|
{children}
|
|
</main>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|