Files
biblical-guide.com/components/layout/navigation.tsx
andupetcu a0969e88df Implement complete multi-language support with Romanian/English
- Added next-intl for internationalization with Romanian as default locale
- Restructured app directory with [locale] routing (/ro, /en)
- Created comprehensive translation files for both languages
- Fixed Next.js 15 async params compatibility in layout components
- Updated all components to use proper i18n hooks and translations
- Configured middleware for locale routing and fallbacks
- Fixed FloatingChat component translation array handling
- Restored complete home page with internationalized content
- Fixed Material-UI Slide component prop error (mountOnExit → unmountOnExit)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-20 15:43:51 +03:00

237 lines
6.7 KiB
TypeScript

'use client'
import React, { useState } from 'react'
import {
AppBar,
Box,
Toolbar,
IconButton,
Typography,
Menu,
Container,
Avatar,
Button,
Tooltip,
MenuItem,
Drawer,
List,
ListItem,
ListItemButton,
ListItemIcon,
ListItemText,
useMediaQuery,
useTheme,
} from '@mui/material'
import {
Menu as MenuIcon,
MenuBook,
Favorite as Prayer,
Search,
AccountCircle,
Home,
Settings,
Logout,
} from '@mui/icons-material'
import { useRouter } from 'next/navigation'
import { useTranslations, useLocale } from 'next-intl'
import { LanguageSwitcher } from './language-switcher'
export function Navigation() {
const [anchorElNav, setAnchorElNav] = useState<null | HTMLElement>(null)
const [anchorElUser, setAnchorElUser] = useState<null | HTMLElement>(null)
const [drawerOpen, setDrawerOpen] = useState(false)
const router = useRouter()
const theme = useTheme()
const isMobile = useMediaQuery(theme.breakpoints.down('md'))
const t = useTranslations('navigation')
const locale = useLocale()
const pages = [
{ name: t('home'), path: '/', icon: <Home /> },
{ name: t('bible'), path: '/bible', icon: <MenuBook /> },
{ name: t('prayers'), path: '/prayers', icon: <Prayer /> },
{ name: t('search'), path: '/search', icon: <Search /> },
]
const settings = [
{ name: t('profile'), icon: <AccountCircle /> },
{ name: t('settings'), icon: <Settings /> },
{ name: t('logout'), icon: <Logout /> },
]
const handleOpenNavMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElNav(event.currentTarget)
}
const handleOpenUserMenu = (event: React.MouseEvent<HTMLElement>) => {
setAnchorElUser(event.currentTarget)
}
const handleCloseNavMenu = () => {
setAnchorElNav(null)
}
const handleCloseUserMenu = () => {
setAnchorElUser(null)
}
const handleNavigate = (path: string) => {
const localizedPath = `/${locale}${path === '/' ? '' : path}`
router.push(localizedPath)
handleCloseNavMenu()
setDrawerOpen(false)
}
const toggleDrawer = (open: boolean) => {
setDrawerOpen(open)
}
const DrawerList = (
<Box sx={{ width: 250 }} role="presentation">
<List>
{pages.map((page) => (
<ListItem key={page.name} disablePadding>
<ListItemButton onClick={() => handleNavigate(page.path)}>
<ListItemIcon sx={{ color: 'primary.main' }}>
{page.icon}
</ListItemIcon>
<ListItemText primary={page.name} />
</ListItemButton>
</ListItem>
))}
</List>
</Box>
)
return (
<>
<AppBar position="static" sx={{ bgcolor: 'primary.main' }}>
<Container maxWidth="xl">
<Toolbar disableGutters>
{/* Desktop Logo */}
<MenuBook sx={{ display: { xs: 'none', md: 'flex' }, mr: 1 }} />
<Typography
variant="h6"
noWrap
component="a"
href={`/${locale}`}
sx={{
mr: 2,
display: { xs: 'none', md: 'flex' },
fontFamily: 'monospace',
fontWeight: 700,
letterSpacing: '.3rem',
color: 'inherit',
textDecoration: 'none',
}}
>
GHID BIBLIC
</Typography>
{/* Mobile Menu */}
<Box sx={{ flexGrow: 1, display: { xs: 'flex', md: 'none' } }}>
<IconButton
size="large"
aria-label="meniu principal"
aria-controls="menu-appbar"
aria-haspopup="true"
onClick={() => toggleDrawer(true)}
color="inherit"
>
<MenuIcon />
</IconButton>
</Box>
{/* Mobile Logo */}
<MenuBook sx={{ display: { xs: 'flex', md: 'none' }, mr: 1 }} />
<Typography
variant="h5"
noWrap
component="a"
href={`/${locale}`}
sx={{
mr: 2,
display: { xs: 'flex', md: 'none' },
flexGrow: 1,
fontFamily: 'monospace',
fontWeight: 700,
letterSpacing: '.3rem',
color: 'inherit',
textDecoration: 'none',
}}
>
BIBLIC
</Typography>
{/* Desktop Menu */}
<Box sx={{ flexGrow: 1, display: { xs: 'none', md: 'flex' } }}>
{pages.map((page) => (
<Button
key={page.name}
onClick={() => handleNavigate(page.path)}
sx={{
my: 2,
color: 'white',
display: 'flex',
alignItems: 'center',
gap: 1,
mx: 1,
'&:hover': {
bgcolor: 'primary.dark',
},
}}
startIcon={page.icon}
>
{page.name}
</Button>
))}
</Box>
{/* Language Switcher */}
<LanguageSwitcher />
{/* User Menu */}
<Box sx={{ flexGrow: 0 }}>
<Tooltip title={t('settings')}>
<IconButton onClick={handleOpenUserMenu} sx={{ p: 0 }}>
<Avatar sx={{ bgcolor: 'secondary.main' }}>
<AccountCircle />
</Avatar>
</IconButton>
</Tooltip>
<Menu
sx={{ mt: '45px' }}
id="menu-appbar"
anchorEl={anchorElUser}
anchorOrigin={{
vertical: 'top',
horizontal: 'right',
}}
keepMounted
transformOrigin={{
vertical: 'top',
horizontal: 'right',
}}
open={Boolean(anchorElUser)}
onClose={handleCloseUserMenu}
>
{settings.map((setting) => (
<MenuItem key={setting.name} onClick={handleCloseUserMenu}>
<ListItemIcon>
{setting.icon}
</ListItemIcon>
<Typography textAlign="center">{setting.name}</Typography>
</MenuItem>
))}
</Menu>
</Box>
</Toolbar>
</Container>
</AppBar>
{/* Mobile Drawer */}
<Drawer anchor="left" open={drawerOpen} onClose={() => toggleDrawer(false)}>
{DrawerList}
</Drawer>
</>
)
}