import React from 'react'; import { NavLink, useLocation } from 'react-router-dom'; import { LayoutDashboard, Calendar, Mail, Archive, BarChart3, Settings, X, Palette, FileText, HardDrive } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; import { useTranslation } from 'react-i18next'; import { settingsService } from '../../services/settings.service'; import { VersionInfo } from './VersionInfo'; interface AdminSidebarProps { isOpen: boolean; onClose: () => void; } interface NavItem { nameKey: string; href: string; icon: React.ComponentType<{ className?: string }>; } const navigation: NavItem[] = [ { nameKey: 'navigation.dashboard', href: '/admin/dashboard', icon: LayoutDashboard }, { nameKey: 'navigation.events', href: '/admin/events', icon: Calendar }, { nameKey: 'navigation.archives', href: '/admin/archives', icon: Archive }, { nameKey: 'admin.analytics', href: '/admin/analytics', icon: BarChart3 }, { nameKey: 'navigation.emailSettings', href: '/admin/email', icon: Mail }, { nameKey: 'navigation.branding', href: '/admin/branding', icon: Palette }, { nameKey: 'navigation.settings', href: '/admin/settings', icon: Settings }, { nameKey: 'navigation.backup', href: '/admin/backup', icon: HardDrive }, { nameKey: 'navigation.cmsPages', href: '/admin/cms', icon: FileText }, ]; export const AdminSidebar: React.FC = ({ isOpen, onClose }) => { const location = useLocation(); const { t } = useTranslation(); return (
{/* Brand */}
{t('admin.title')}
{/* Navigation */} {/* Bottom section - sticky to bottom */}
{/* Version Info */} {/* Storage Info */}
); }; const StorageInfo: React.FC = () => { const { t } = useTranslation(); const { data: storageInfo } = useQuery({ queryKey: ['storage-info'], queryFn: () => settingsService.getStorageInfo(), refetchInterval: 60000 // Refresh every minute }); if (!storageInfo) { return (
); } const limitInUse = storageInfo.storage_soft_limit || storageInfo.storage_limit || 1; const usagePercent = limitInUse ? Math.round((storageInfo.total_used / limitInUse) * 100) : 0; const isOverSoftLimit = limitInUse && storageInfo.total_used >= limitInUse; const progressBarClass = isOverSoftLimit ? 'bg-red-600' : 'bg-primary-600'; const containerClass = isOverSoftLimit ? 'bg-red-50 border border-red-200' : 'bg-neutral-100'; const softLimitDisplay = settingsService.formatBytes(limitInUse); return (
{t('admin.storageUsed')} {settingsService.formatBytes(storageInfo.total_used)}

{t('admin.storagePercent', { percent: usagePercent, limit: softLimitDisplay })}

); };