152 lines
4.7 KiB
TypeScript
152 lines
4.7 KiB
TypeScript
"use client";
|
||
// Admin Settings page – view & edit SMTP configuration and send test email
|
||
import { useEffect, useState } from 'react';
|
||
import { useRouter } from 'next/navigation';
|
||
|
||
interface Settings {
|
||
host: string;
|
||
port: number;
|
||
secure: boolean;
|
||
user: string;
|
||
pass: string;
|
||
}
|
||
|
||
export default function SettingsPage() {
|
||
const [settings, setSettings] = useState<Settings | null>(null);
|
||
const [loading, setLoading] = useState(true);
|
||
const [message, setMessage] = useState('');
|
||
const router = useRouter();
|
||
|
||
// Load current settings
|
||
useEffect(() => {
|
||
fetch('/api/admin/smtp-settings')
|
||
.then((res) => res.json())
|
||
.then((data) => {
|
||
if (data.settings) setSettings(data.settings as Settings);
|
||
else setMessage('Failed to load settings');
|
||
})
|
||
.catch(() => setMessage('Failed to load settings'))
|
||
.finally(() => setLoading(false));
|
||
}, []);
|
||
|
||
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||
const { name, value, type, checked } = e.target;
|
||
setSettings((prev) =>
|
||
prev && {
|
||
...prev,
|
||
[name]: type === 'checkbox' ? checked : name === 'port' ? Number(value) : value,
|
||
}
|
||
);
|
||
};
|
||
|
||
const handleSave = async (e: React.FormEvent) => {
|
||
e.preventDefault();
|
||
setMessage('');
|
||
const res = await fetch('/api/admin/smtp-settings', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify(settings),
|
||
});
|
||
const data = await res.json();
|
||
if (res.ok) setMessage('Settings saved');
|
||
else setMessage(data.error || 'Error saving settings');
|
||
};
|
||
|
||
const handleTestEmail = async () => {
|
||
setMessage('');
|
||
const testPayload = {
|
||
to: settings?.user || '', // send to the configured user address
|
||
subject: 'Test Email from Webshop Admin',
|
||
text: 'This is a test email to verify SMTP configuration.',
|
||
};
|
||
const res = await fetch('/api/admin/send-test-email', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify(testPayload),
|
||
});
|
||
const data = await res.json();
|
||
if (res.ok) setMessage('Test email sent successfully');
|
||
else setMessage(data.error || 'Failed to send test email');
|
||
};
|
||
|
||
if (loading) return <div className="p-8">Loading…</div>;
|
||
|
||
return (
|
||
<div className="max-w-2xl mx-auto p-8 bg-black/30 backdrop-blur-xl rounded-lg text-white">
|
||
<h1 className="text-2xl font-bold mb-6">SMTP‑Einstellungen</h1>
|
||
{message && <p className="mb-4 text-yellow-300">{message}</p>}
|
||
<form onSubmit={handleSave} className="space-y-4">
|
||
<label className="flex flex-col">
|
||
Host
|
||
<input
|
||
name="host"
|
||
type="text"
|
||
required
|
||
value={settings?.host ?? ''}
|
||
onChange={handleChange}
|
||
className="mt-1 p-2 rounded bg-black/20 border border-white/20"
|
||
/>
|
||
</label>
|
||
<label className="flex flex-col">
|
||
Port
|
||
<input
|
||
name="port"
|
||
type="number"
|
||
required
|
||
value={settings?.port ?? ''}
|
||
onChange={handleChange}
|
||
className="mt-1 p-2 rounded bg-black/20 border border-white/20"
|
||
/>
|
||
</label>
|
||
<label className="inline-flex items-center space-x-2">
|
||
<input
|
||
name="secure"
|
||
type="checkbox"
|
||
checked={settings?.secure ?? false}
|
||
onChange={handleChange}
|
||
className="rounded"
|
||
/>
|
||
<span>SSL / TLS (secure)</span>
|
||
</label>
|
||
<label className="flex flex-col">
|
||
Benutzer (SMTP‑User)
|
||
<input
|
||
name="user"
|
||
type="email"
|
||
required
|
||
value={settings?.user ?? ''}
|
||
onChange={handleChange}
|
||
className="mt-1 p-2 rounded bg-black/20 border border-white/20"
|
||
/>
|
||
</label>
|
||
<label className="flex flex-col">
|
||
Passwort
|
||
<input
|
||
name="pass"
|
||
type="password"
|
||
required
|
||
value={settings?.pass ?? ''}
|
||
onChange={handleChange}
|
||
className="mt-1 p-2 rounded bg-black/20 border border-white/20"
|
||
/>
|
||
</label>
|
||
<div className="flex space-x-4 mt-4">
|
||
<button
|
||
type="submit"
|
||
className="px-4 py-2 bg-primary rounded hover:bg-primary/80 transition"
|
||
>
|
||
Speichern
|
||
</button>
|
||
<button
|
||
type="button"
|
||
onClick={handleTestEmail}
|
||
className="px-4 py-2 bg-green-600 rounded hover:bg-green-500 transition"
|
||
>
|
||
Test‑Mail senden
|
||
</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
);
|
||
}
|