/** * Settings & Maintenance Panel Component * * System settings management with: * - Maintenance mode toggle * - System configuration * - API rate limits */ import React, { useState, useEffect, useCallback } from 'react'; import { Settings, RefreshCw, Save, Wrench, AlertTriangle, Check, Clock, Shield, Zap, Power, MessageSquare, Edit3, XCircle, ChevronRight } from 'lucide-react'; import { getToken } from '../../services/api'; const API_BASE = import.meta.env.VITE_API_URL || ''; // Setting input component const SettingInput = ({ setting, onUpdate }) => { const [value, setValue] = useState(setting.value); const [editing, setEditing] = useState(false); const [saving, setSaving] = useState(false); const handleSave = async () => { setSaving(true); try { await onUpdate(setting.key, value); setEditing(false); } catch (err) { console.error('Error saving setting:', err); } finally { setSaving(false); } }; return (
{setting.description &&

{setting.description}

}
{editing ? (
setValue(e.target.value)} className="setting-input" />
) : (
{setting.is_sensitive ? '••••••••' : setting.value}
)}
); }; function SettingsMaintenancePanel() { const [settings, setSettings] = useState({}); const [maintenance, setMaintenance] = useState({ enabled: false, message: '' }); const [apiLimits, setApiLimits] = useState({}); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [saving, setSaving] = useState(false); const [maintenanceMessage, setMaintenanceMessage] = useState(''); // Fetch settings const fetchSettings = useCallback(async () => { setLoading(true); setError(null); try { const token = getToken(); // Fetch settings const settingsRes = await fetch(`${API_BASE}/api/admin/settings`, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); if (settingsRes.ok) { const data = await settingsRes.json(); if (data.success) { setSettings(data.settings); } } // Fetch maintenance status const maintenanceRes = await fetch(`${API_BASE}/api/admin/maintenance`, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); if (maintenanceRes.ok) { const data = await maintenanceRes.json(); if (data.success) { setMaintenance({ enabled: data.maintenance_mode, message: data.message || '' }); setMaintenanceMessage(data.message || ''); } } // Fetch API limits const limitsRes = await fetch(`${API_BASE}/api/admin/api-limits`, { headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); if (limitsRes.ok) { const data = await limitsRes.json(); if (data.success) { setApiLimits(data.limits); } } } catch (err) { setError(err.message); } finally { setLoading(false); } }, []); // Toggle maintenance mode const toggleMaintenance = async () => { setSaving(true); setError(null); try { const token = getToken(); if (!token) { setError('Not authenticated. Please log in again.'); return; } const response = await fetch(`${API_BASE}/api/admin/maintenance/toggle`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' } }); if (response.ok) { const data = await response.json(); if (data.success) { setMaintenance(prev => ({ ...prev, enabled: data.maintenance_mode })); } else { setError(data.detail || 'Failed to toggle maintenance mode'); } } else { const errorData = await response.json().catch(() => ({})); setError(errorData.detail || `Failed to toggle maintenance mode (${response.status})`); } } catch (err) { console.error('Error toggling maintenance:', err); setError('Network error: Could not connect to server'); } finally { setSaving(false); } }; // Update maintenance message const updateMaintenanceMessage = async () => { setSaving(true); try { const token = getToken(); const response = await fetch(`${API_BASE}/api/admin/maintenance/message`, { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ message: maintenanceMessage }) }); if (response.ok) { setMaintenance(prev => ({ ...prev, message: maintenanceMessage })); } } catch (err) { console.error('Error updating message:', err); } finally { setSaving(false); } }; // Update a setting const updateSetting = async (key, value) => { const token = getToken(); const response = await fetch(`${API_BASE}/api/admin/settings/${key}`, { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ value }) }); if (response.ok) { fetchSettings(); // Refresh settings } else { throw new Error('Failed to update setting'); } }; // Update API limits const updateApiLimits = async () => { setSaving(true); try { const token = getToken(); const response = await fetch(`${API_BASE}/api/admin/api-limits`, { method: 'PUT', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' }, body: JSON.stringify(apiLimits) }); if (response.ok) { console.log('API limits updated'); } } catch (err) { console.error('Error updating limits:', err); } finally { setSaving(false); } }; // Initial fetch useEffect(() => { fetchSettings(); }, [fetchSettings]); if (loading) { return (

Loading settings...

); } return (
{/* Error Display */} {error && (
{error}
)} {/* Header */}

Maintenance & Settings

Control system maintenance mode and API rate limits

{/* Maintenance Mode Card */}

{maintenance.enabled ? 'Maintenance Mode Active' : 'System Online'}

{maintenance.enabled ? 'Users will see a maintenance message when accessing the site.' : 'All users can access the system normally.'}

{/* Maintenance Message Editor */}