'use client'; import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/button'; import { Switch } from '@/components/ui/switch'; import { Download, Upload, Loader2, Sliders, ShieldAlert, FileArchive } from 'lucide-react'; import { createClient } from '@/lib/supabase/client'; import { useRouter } from 'next/navigation'; export default function SystemPage() { const [loading, setLoading] = useState(true); const [demoActive, setDemoActive] = useState(true); const [exporting, setExporting] = useState(false); const [importing, setImporting] = useState(false); const [statusMsg, setStatusMsg] = useState(''); const [statusType, setStatusType] = useState<'success' | 'error' | 'info' | ''>(''); const [selectedFile, setSelectedFile] = useState(null); const router = useRouter(); useEffect(() => { async function loadData() { try { const supabase = createClient(); const { data: { user } } = await supabase.auth.getUser(); if (!user) { router.push('/auth/login'); return; } const state = localStorage.getItem('demo_banner_disabled') !== 'true'; setDemoActive(state); } catch (e) { console.error(e); } finally { setLoading(false); } } loadData(); }, [router]); const toggleDemo = (checked: boolean) => { setDemoActive(checked); localStorage.setItem('demo_banner_disabled', (!checked).toString()); window.dispatchEvent(new Event('storage_demo_changed')); }; const handleExport = async () => { setExporting(true); setStatusMsg('Export läuft...'); setStatusType('info'); try { const res = await fetch('/api/admin/db-backup'); if (!res.ok) throw new Error('Export fehlgeschlagen'); const blob = await res.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `webshop_backup_${new Date().toISOString().split('T')[0]}.zip`; document.body.appendChild(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); setStatusMsg('Export erfolgreich abgeschlossen.'); setStatusType('success'); } catch (err: any) { console.error(err); setStatusMsg(`Fehler beim Export: ${err.message}`); setStatusType('error'); } finally { setExporting(false); } }; const handleImport = async () => { if (!selectedFile) return; if (!confirm('ACHTUNG: Dies löscht und überschreibt alle aktuellen Datenbankinhalte in dieser Instanz. Möchten Sie wirklich fortfahren?')) { return; } setImporting(true); setStatusMsg('Import läuft...'); setStatusType('info'); try { const formData = new FormData(); formData.append('file', selectedFile); const res = await fetch('/api/admin/db-backup', { method: 'POST', body: formData, }); const data = await res.json(); if (!res.ok) throw new Error(data.error || 'Import fehlgeschlagen'); setStatusMsg('Datenbank erfolgreich importiert!'); setStatusType('success'); setSelectedFile(null); } catch (err: any) { console.error(err); setStatusMsg(`Fehler beim Import: ${err.message}`); setStatusType('error'); } finally { setImporting(false); } }; if (loading) { return
; } return (

System & Backup

Verwaltung von System-Bannern, Datenbank-Sicherungen und Wiederherstellungen.

{statusMsg && (
{statusMsg}
)}

System Banner

Gelbe Demo-Warnmeldungen im gesamten Shop aktivieren oder stummschalten.

Banner aktiv

DB Backup

Lädt alle Produkte, Firmen, Lizenzen & Einstellungen als ZIP-Archiv herunter.

Überschreibt DB

Daten Wiederherstellung

Spielen Sie eine gesicherte ZIP-Sicherungsdatei ein. Warnung: Überschreibt aktuelle Datenbankinhalte.

setSelectedFile(e.target.files?.[0] || null)} disabled={exporting || importing} className="absolute inset-0 w-full h-full opacity-0 cursor-pointer disabled:cursor-not-allowed" /> {selectedFile ? selectedFile.name : 'ZIP-Datei auswählen'}
); }