// src/components/LayoutWrapper.tsx 'use client' import React, { ReactNode, useEffect, useState } from 'react' import { usePathname, useRouter } from 'next/navigation' import Link from 'next/link' import Image from 'next/image' import Script from 'next/script' import { useLocale } from '../contexts/LocaleContext' import { useTheme } from '../contexts/ThemeContext' import ThemeToggle from './ThemeToggle' import LanguageSelector from './LanguageSelector' import '../layout.css' interface User { id: number username: string email: string full_name: string avatar: string | null } export function LayoutWrapper({ children }: { children: ReactNode }) { const pathname = usePathname() || '' const isPublicUserPage = /^\/[^\/]+$/.test(pathname) const [user, setUser] = useState(null) const [isLoading, setIsLoading] = useState(true) const router = useRouter() const { t } = useLocale() // При монтировании пробуем загрузить профиль useEffect(() => { const checkAuth = async () => { const token = localStorage.getItem('token') if (token) { try { const response = await fetch('/api/auth/user', { headers: { Authorization: `Bearer ${token}` }, }) if (response.ok) { const data = await response.json() setUser({ id: data.id, username: data.username, email: data.email, full_name: data.full_name || '', avatar: data.avatar }) } else { // Токен недействителен localStorage.removeItem('token') setUser(null) } } catch (error) { console.error('Auth check failed:', error) localStorage.removeItem('token') setUser(null) } } setIsLoading(false) } checkAuth() }, []) const handleLogout = () => { if (typeof window !== 'undefined') { localStorage.removeItem('token') } setUser(null) router.push('/') } return ( <> {/* Шапка отображается на всех страницах кроме публичных /[username] */} {!isPublicUserPage && ( )} {/* Отступ для фиксированного навбара */} {!isPublicUserPage &&
} aria-expanded="false" > Avatar {user.full_name?.trim() || user.username}
)} )} {/* отступ, чтобы контент не прятался под фиксированным хедером */} {!isPublicUserPage &&
} {children} {/* Подвал не выводим на публичных страницах */} {!isPublicUserPage && (
  • About
  • Contact
  • Terms of Use
  • Privacy Policy

© CatLink 2025

)} {/* Bootstrap JS */} {/* Bootstrap JS: load after React hydrates to avoid DOM mutations during hydration */}