98 lines
3.9 KiB
TypeScript
98 lines
3.9 KiB
TypeScript
'use client'
|
||
|
||
import { signOut } from 'next-auth/react'
|
||
import Link from 'next/link'
|
||
import { usePathname } from 'next/navigation'
|
||
import { LayoutDashboard, Users, Settings, LogOut, Menu, X } from 'lucide-react'
|
||
import { useState } from 'react'
|
||
|
||
export default function AdminLayout({ children }: { children: React.ReactNode }) {
|
||
const pathname = usePathname()
|
||
const [sidebarOpen, setSidebarOpen] = useState(false)
|
||
|
||
const navigation = [
|
||
{ name: 'Dashboard', href: '/admin', icon: LayoutDashboard },
|
||
{ name: 'Kullanıcılar', href: '/admin/users', icon: Users },
|
||
{ name: 'Ayarlar', href: '/admin/settings', icon: Settings },
|
||
]
|
||
|
||
return (
|
||
<div className="min-h-screen bg-gray-50 dark:bg-gray-900 flex">
|
||
{/* Mobile sidebar backdrop */}
|
||
{sidebarOpen && (
|
||
<div
|
||
className="fixed inset-0 z-40 bg-gray-900/80 lg:hidden"
|
||
onClick={() => setSidebarOpen(false)}
|
||
/>
|
||
)}
|
||
|
||
{/* Sidebar */}
|
||
<div className={`
|
||
fixed inset-y-0 left-0 z-50 w-64 bg-white dark:bg-gray-950 border-r border-gray-200 dark:border-gray-800
|
||
transform transition-transform duration-200 ease-in-out lg:translate-x-0 lg:static lg:inset-0
|
||
${sidebarOpen ? 'translate-x-0' : '-translate-x-full'}
|
||
`}>
|
||
<div className="h-full flex flex-col">
|
||
<div className="h-16 flex items-center px-6 border-b border-gray-200 dark:border-gray-800">
|
||
<h1 className="text-lg font-bold text-gray-900 dark:text-white">Admin Paneli</h1>
|
||
<button
|
||
className="ml-auto lg:hidden text-gray-500"
|
||
onClick={() => setSidebarOpen(false)}
|
||
>
|
||
<X className="h-5 w-5" />
|
||
</button>
|
||
</div>
|
||
|
||
<nav className="flex-1 px-4 py-6 space-y-1 overflow-y-auto">
|
||
{navigation.map((item) => {
|
||
const isActive = pathname.endsWith(item.href)
|
||
return (
|
||
<Link
|
||
key={item.name}
|
||
href={item.href}
|
||
className={`
|
||
flex items-center px-3 py-2.5 text-sm font-medium rounded-md transition-colors
|
||
${isActive
|
||
? 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-white'
|
||
: 'text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-gray-900 dark:hover:text-white'}
|
||
`}
|
||
>
|
||
<item.icon className={`mr-3 flex-shrink-0 h-5 w-5 ${isActive ? 'text-gray-900 dark:text-white' : 'text-gray-400'}`} />
|
||
{item.name}
|
||
</Link>
|
||
)
|
||
})}
|
||
</nav>
|
||
|
||
<div className="p-4 border-t border-gray-200 dark:border-gray-800">
|
||
<button
|
||
onClick={() => signOut({ callbackUrl: '/' })}
|
||
className="flex w-full items-center px-3 py-2.5 text-sm font-medium text-red-600 dark:text-red-400 rounded-md hover:bg-red-50 dark:hover:bg-red-950/30 transition-colors"
|
||
>
|
||
<LogOut className="mr-3 h-5 w-5" />
|
||
Çıkış Yap
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Main content */}
|
||
<div className="flex-1 flex flex-col min-w-0 overflow-hidden">
|
||
<header className="h-16 flex items-center lg:hidden bg-white dark:bg-gray-950 border-b border-gray-200 dark:border-gray-800 px-4">
|
||
<button
|
||
onClick={() => setSidebarOpen(true)}
|
||
className="text-gray-500 hover:text-gray-900 dark:hover:text-white focus:outline-none"
|
||
>
|
||
<Menu className="h-6 w-6" />
|
||
</button>
|
||
<span className="ml-4 text-lg font-bold text-gray-900 dark:text-white">Admin Paneli</span>
|
||
</header>
|
||
|
||
<main className="flex-1 overflow-y-auto p-4 sm:p-6 lg:p-8">
|
||
{children}
|
||
</main>
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|