dramaling-vocab-learning/frontend/components/Navigation.tsx

144 lines
5.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use client'
import { useState } from 'react'
import Link from 'next/link'
import { usePathname } from 'next/navigation'
import { useAuth } from '@/contexts/AuthContext'
interface NavigationProps {
showExitLearning?: boolean
onExitLearning?: () => void
}
export function Navigation({ showExitLearning = false, onExitLearning }: NavigationProps = {}) {
const { user, logout } = useAuth()
const pathname = usePathname()
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false)
const navItems = [
{ href: '/dashboard', label: '儀表板' },
{ href: '/flashcards', label: '詞卡' },
{ href: '/learn', label: '學習' },
{ href: '/generate', label: 'AI 生成' }
]
return (
<nav className="bg-white shadow-sm border-b">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex justify-between h-16">
<div className="flex items-center space-x-8">
{/* 手機版漢堡選單按鈕 */}
<button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="md:hidden p-2 text-gray-600 hover:text-gray-900"
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
{isMobileMenuOpen ? (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
) : (
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 12h16M4 18h16" />
)}
</svg>
</button>
<Link href="/dashboard" className="text-2xl font-bold text-primary">
DramaLing
</Link>
<div className="hidden md:flex space-x-6">
{navItems.map((item) => (
<Link
key={item.href}
href={item.href}
className={`font-medium transition-colors ${
pathname === item.href
? 'text-primary'
: 'text-gray-600 hover:text-gray-900'
}`}
>
{item.label}
</Link>
))}
</div>
</div>
<div className="flex items-center space-x-4">
{/* 學習模式的結束學習按鈕 */}
{showExitLearning ? (
<button
onClick={onExitLearning}
className="text-gray-600 hover:text-gray-900"
>
×
</button>
) : (
<>
{/* 通知按鈕 - 桌面和手機都顯示 */}
<button className="p-2 text-gray-600 hover:text-gray-900">
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
</svg>
</button>
{/* 用戶資訊 - 只在桌面版顯示 */}
<div className="hidden md:flex items-center space-x-2">
<div className="w-8 h-8 bg-primary rounded-full flex items-center justify-center text-white font-semibold">
{user?.username?.[0]?.toUpperCase() || 'U'}
</div>
<span className="text-sm font-medium">{user?.displayName || user?.username}</span>
<button
onClick={logout}
className="ml-4 text-sm text-gray-600 hover:text-gray-900"
>
</button>
</div>
</>
)}
</div>
</div>
{/* 手機版下拉選單 */}
{isMobileMenuOpen && (
<div className="md:hidden border-t border-gray-200">
<div className="px-4 py-4 space-y-2">
{navItems.map((item) => (
<Link
key={item.href}
href={item.href}
onClick={() => setIsMobileMenuOpen(false)}
className={`block py-2 px-3 rounded-lg font-medium transition-colors ${
pathname === item.href
? 'bg-primary text-white'
: 'text-gray-600 hover:text-gray-900 hover:bg-gray-100'
}`}
>
{item.label}
</Link>
))}
{/* 手機版用戶區域 */}
<div className="pt-4 border-t border-gray-200 mt-4">
<div className="flex items-center space-x-3 px-3 py-2">
<div className="w-8 h-8 bg-primary rounded-full flex items-center justify-center text-white font-semibold">
{user?.username?.[0]?.toUpperCase() || 'U'}
</div>
<span className="text-sm font-medium">{user?.displayName || user?.username}</span>
</div>
<button
onClick={() => {
logout()
setIsMobileMenuOpen(false)
}}
className="w-full text-left py-2 px-3 text-gray-600 hover:text-gray-900 hover:bg-gray-100 rounded-lg"
>
</button>
</div>
</div>
</div>
)}
</div>
</nav>
)
}