Some checks failed
Deploy to Production / Build and Deploy (push) Failing after 1m7s
Replaced ~100+ hardcoded French and English text strings across 30+ components with proper i18n t() calls. Added 57 new translation keys to all 15 locale files (ar, de, en, es, fa, fr, hi, it, ja, ko, nl, pl, pt, ru, zh). Key changes: - contextual-ai-chat.tsx: 30 French strings → t() (actions, toasts, labels, placeholders) - ai-chat.tsx: 15 French/English strings → t() (header, tabs, welcome, insights, history) - note-inline-editor.tsx: 20 French fallbacks removed (toolbar, save status, checklist) - lab-skeleton.tsx: French loading text → t() - admin-header.tsx, header.tsx, editor-connections-section.tsx: French fallbacks removed - New AI chat component, agent cards, sidebar, settings panel i18n cleanup Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
'use client'
|
|
|
|
import { usePathname } from 'next/navigation'
|
|
import { LayoutDashboard, Users, Brain, Settings } from 'lucide-react'
|
|
import { cn } from '@/lib/utils'
|
|
import { useLanguage } from '@/lib/i18n'
|
|
|
|
export interface AdminSidebarProps {
|
|
className?: string
|
|
}
|
|
|
|
export interface NavItem {
|
|
titleKey: string
|
|
href: string
|
|
icon: React.ReactNode
|
|
}
|
|
|
|
const navItems: NavItem[] = [
|
|
{
|
|
titleKey: 'admin.sidebar.dashboard',
|
|
href: '/admin',
|
|
icon: <LayoutDashboard className="h-5 w-5" />,
|
|
},
|
|
{
|
|
titleKey: 'admin.sidebar.users',
|
|
href: '/admin/users',
|
|
icon: <Users className="h-5 w-5" />,
|
|
},
|
|
{
|
|
titleKey: 'admin.sidebar.aiManagement',
|
|
href: '/admin/ai',
|
|
icon: <Brain className="h-5 w-5" />,
|
|
},
|
|
{
|
|
titleKey: 'admin.sidebar.settings',
|
|
href: '/admin/settings',
|
|
icon: <Settings className="h-5 w-5" />,
|
|
},
|
|
]
|
|
|
|
export function AdminSidebar({ className }: AdminSidebarProps) {
|
|
const pathname = usePathname()
|
|
const { t } = useLanguage()
|
|
|
|
return (
|
|
<aside
|
|
className={cn(
|
|
'w-64 bg-white dark:bg-zinc-900 border-r border-gray-200 dark:border-gray-800 p-4',
|
|
className
|
|
)}
|
|
>
|
|
<nav className="space-y-1">
|
|
{navItems.map((item) => {
|
|
const isActive = pathname === item.href || (item.href !== '/admin' && pathname?.startsWith(item.href + '/'))
|
|
|
|
return (
|
|
// <a> instead of <Link>: avoids Next.js RSC navigation transitions
|
|
// that trigger React Error #310 (React bug #33580) in production.
|
|
// Full-page reloads are acceptable for admin navigation.
|
|
<a
|
|
key={item.href}
|
|
href={item.href}
|
|
className={cn(
|
|
'flex items-center gap-3 px-4 py-3 rounded-lg text-sm font-medium transition-colors',
|
|
'hover:bg-gray-100 dark:hover:bg-zinc-800',
|
|
isActive
|
|
? 'bg-gray-100 dark:bg-zinc-800 text-gray-900 dark:text-white font-semibold'
|
|
: 'text-gray-600 dark:text-gray-400'
|
|
)}
|
|
>
|
|
{item.icon}
|
|
<span>{t(item.titleKey)}</span>
|
|
</a>
|
|
)
|
|
})}
|
|
</nav>
|
|
</aside>
|
|
)
|
|
}
|