'use client'; import { useState, useEffect } from 'react'; import PageBuilder from './PageBuilder'; import SettingsEditor from './SettingsEditor'; import AnalyticsView from './AnalyticsView'; import BackupManagerModal from './BackupManagerModal'; import * as Icons from './Icons'; interface Props { onLogout: () => void; } type Tab = 'pages' | 'settings' | 'analytics'; export default function AdminDashboard({ onLogout }: Props) { const [activeTab, setActiveTab] = useState('pages'); const [saving, setSaving] = useState(false); // Diagnostics & Backup state const [showStatus, setShowStatus] = useState(false); const [showBackupModal, setShowBackupModal] = useState(false); const [status, setStatus] = useState(null); const [statusLoading, setStatusLoading] = useState(false); async function handleLogout() { await fetch('/api/admin/auth', { method: 'DELETE' }); onLogout(); } async function handleReload() { setSaving(true); try { await fetch('/api/admin/reload', { method: 'POST' }); // Refresh status after reload await fetchStatus(); } finally { setSaving(false); } } const fetchStatus = async () => { setStatusLoading(true); try { const res = await fetch('/api/admin/status'); if (res.ok) { const data = await res.json(); setStatus(data); } else { setStatus(null); } } catch { setStatus(null); } finally { setStatusLoading(false); } }; useEffect(() => { fetchStatus(); }, []); return (

Immich Folio

{/* Diagnostics Badge */}
{showStatus && ( <>
setShowStatus(false)} />

System Diagnostics

Immich Connection {status?.immich?.status === 'connected' ? 'Connected' : 'Disconnected'}
Config Integrity {status?.config?.status === 'valid' ? 'Valid' : 'Degraded'}
Config Backups {status?.backups?.count ?? 0} Backups
Latest Backup {status?.backups?.lastBackup ? new Date(status.backups.lastBackup).toLocaleDateString() : 'None'}
In-Memory Cache {status?.cache?.size ?? 0} items
)}
Site
{activeTab === 'pages' && } {activeTab === 'settings' && } {activeTab === 'analytics' && }
setShowBackupModal(false)} onRestoreSuccess={() => { fetchStatus(); }} />
); }