Files
clube67_newwhats.local/clube67/newwhats.local/frontend/components/Layout.tsx
T
VPS 4 Deploy Agent 0dc5eefa06
continuous-integration/webhook Falha no deploy de clube67_newwhats.local (VPS 4)
chore(ops): restore missing root files in newwhats.clube67.com
2026-05-18 03:27:25 +02:00

45 lines
1.7 KiB
TypeScript

import React, { useEffect, useState } from 'react'
import Sidebar from './Sidebar'
import { useRouter } from 'next/router'
import { useAuth } from '../context/AuthContext'
const PUBLIC_ROUTES = ['/login']
const NO_SIDEBAR_ROUTES = ['/login', '/inbox']
export default function Layout({ children }: { children: React.ReactNode }) {
const router = useRouter()
const { user, loading } = useAuth()
const [mounted, setMounted] = useState(false)
useEffect(() => { setMounted(true) }, [])
const isPublic = PUBLIC_ROUTES.some((r) => router.pathname.startsWith(r))
const hideSidebar = NO_SIDEBAR_ROUTES.some((r) => router.pathname === r || router.pathname.startsWith(r + '/'))
// Tela de carregamento inicial — evita flash de conteúdo não autorizado
if (!mounted || (loading && !isPublic)) {
return (
<div className="min-h-screen bg-[#070b14] flex items-center justify-center">
<div className="flex flex-col items-center gap-4">
<div className="w-10 h-10 border-4 border-brand-500 border-t-transparent rounded-full animate-spin" />
<span className="text-slate-500 text-sm">Carregando...</span>
</div>
</div>
)
}
// Rota privada sem usuário → AuthContext já redireciona, exibe blank para evitar flash
if (!user && !isPublic) {
return <div className="min-h-screen bg-[#070b14]" />
}
return (
<div className="flex h-screen bg-[#070b14] overflow-hidden text-white font-sans w-full max-w-full selection:bg-brand-500/30">
{!hideSidebar && <Sidebar />}
<main className="flex-1 h-full relative w-full max-w-full flex-col flex overflow-y-auto overflow-x-hidden pt-safe pb-safe">
{children}
</main>
</div>
)
}