"use client"; import { useState } from "react"; import { Card, CardHeader, CardTitle, CardDescription, CardContent, Button, FormField, FormInput, FormSelect, FormRow } from "../components/ui"; import { Settings, CacheStats, ClearCacheResponse } from "../../lib/api"; interface SettingsPageProps { initialSettings: Settings; initialCacheStats: CacheStats; } export default function SettingsPage({ initialSettings, initialCacheStats }: SettingsPageProps) { const [settings, setSettings] = useState(initialSettings); const [cacheStats, setCacheStats] = useState(initialCacheStats); const [isClearing, setIsClearing] = useState(false); const [clearResult, setClearResult] = useState(null); const [isSaving, setIsSaving] = useState(false); const [saveMessage, setSaveMessage] = useState(null); async function handleUpdateSetting(key: string, value: unknown) { setIsSaving(true); setSaveMessage(null); try { const response = await fetch(`/api/settings/${key}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ value }) }); if (response.ok) { setSaveMessage("Settings saved successfully"); setTimeout(() => setSaveMessage(null), 3000); } else { setSaveMessage("Failed to save settings"); } } catch (error) { setSaveMessage("Error saving settings"); } finally { setIsSaving(false); } } async function handleClearCache() { setIsClearing(true); setClearResult(null); try { const response = await fetch("/api/settings/cache/clear", { method: "POST" }); const result = await response.json(); setClearResult(result); // Refresh cache stats const statsResponse = await fetch("/api/settings/cache/stats"); if (statsResponse.ok) { const stats = await statsResponse.json(); setCacheStats(stats); } } catch (error) { setClearResult({ success: false, message: "Failed to clear cache" }); } finally { setIsClearing(false); } } return ( <>

Settings

{saveMessage && (

{saveMessage}

)} {/* Image Processing Settings */} Image Processing Configure how images are processed and compressed
{ const newSettings = { ...settings, image_processing: { ...settings.image_processing, format: e.target.value } }; setSettings(newSettings); handleUpdateSetting("image_processing", newSettings.image_processing); }} > { const quality = parseInt(e.target.value) || 85; const newSettings = { ...settings, image_processing: { ...settings.image_processing, quality } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("image_processing", settings.image_processing)} /> { const newSettings = { ...settings, image_processing: { ...settings.image_processing, filter: e.target.value } }; setSettings(newSettings); handleUpdateSetting("image_processing", newSettings.image_processing); }} > { const max_width = parseInt(e.target.value) || 2160; const newSettings = { ...settings, image_processing: { ...settings.image_processing, max_width } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("image_processing", settings.image_processing)} />
{/* Cache Settings */} Cache Manage the image cache and storage

Cache Size

{cacheStats.total_size_mb.toFixed(2)} MB

Files

{cacheStats.file_count}

Directory

{cacheStats.directory}

{clearResult && (
{clearResult.message}
)} { const newSettings = { ...settings, cache: { ...settings.cache, directory: e.target.value } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("cache", settings.cache)} /> { const max_size_mb = parseInt(e.target.value) || 10000; const newSettings = { ...settings, cache: { ...settings.cache, max_size_mb } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("cache", settings.cache)} />
{/* Limits Settings */} Performance Limits Configure API performance and rate limiting
{ const concurrent_renders = parseInt(e.target.value) || 4; const newSettings = { ...settings, limits: { ...settings.limits, concurrent_renders } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("limits", settings.limits)} /> { const timeout_seconds = parseInt(e.target.value) || 12; const newSettings = { ...settings, limits: { ...settings.limits, timeout_seconds } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("limits", settings.limits)} /> { const rate_limit_per_second = parseInt(e.target.value) || 120; const newSettings = { ...settings, limits: { ...settings.limits, rate_limit_per_second } }; setSettings(newSettings); }} onBlur={() => handleUpdateSetting("limits", settings.limits)} />

Note: Changes to limits require a server restart to take effect.

); }