48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
'use client'
|
|
|
|
import { useEffect } from 'react'
|
|
import { useRouter } from 'next/navigation'
|
|
import { useAuth } from '@/lib/hooks/useAuth'
|
|
import { Sidebar } from '@/components/layout/Sidebar'
|
|
import { MobileNav } from '@/components/layout/MobileNav'
|
|
|
|
export default function AppLayout({
|
|
children,
|
|
}: {
|
|
children: React.ReactNode
|
|
}) {
|
|
const { isAuthenticated, isLoading } = useAuth()
|
|
const router = useRouter()
|
|
|
|
useEffect(() => {
|
|
if (!isLoading && !isAuthenticated) {
|
|
router.push('/login')
|
|
}
|
|
}, [isLoading, isAuthenticated, router])
|
|
|
|
if (isLoading) {
|
|
return (
|
|
<div className="flex items-center justify-center min-h-screen bg-gray-50">
|
|
<div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-primary-600"></div>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
if (!isAuthenticated) {
|
|
return null // Will redirect
|
|
}
|
|
|
|
return (
|
|
<div className="min-h-screen bg-gray-50">
|
|
<Sidebar />
|
|
<div className="md:pl-64 flex flex-col min-h-screen">
|
|
<main className="flex-1 pb-20 md:pb-0">
|
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
|
|
{children}
|
|
</div>
|
|
</main>
|
|
<MobileNav />
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|