import React, { useState, useEffect, useRef } from 'react'; export default function Settings({ onClose }) { const [githubToken, setGithubToken] = useState(''); const [giteaToken, setGiteaToken] = useState(''); const [giteaURL, setGiteaURL] = useState(''); const [avatarB64, setAvatarB64] = useState(null); const [savedOk, setSavedOk] = useState(false); const [avatarUploading, setAvatarUploading] = useState(false); const fileInputRef = useRef(null); function normalizeAndValidateGiteaUrl(rawUrl) { const value = (rawUrl || '').trim(); if (!value) return { ok: true, value: '' }; let parsed; try { parsed = new URL(value); } catch (_) { return { ok: false, error: 'Ungültige Gitea-URL. Beispiel für IPv6: http://[2001:db8::1]:3000', }; } if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') { return { ok: false, error: 'Die Gitea-URL muss mit http:// oder https:// beginnen.', }; } return { ok: true, value: value.replace(/\/$/, '') }; } useEffect(() => { window.electronAPI.loadCredentials().then(data => { if (data) { setGithubToken(data.githubToken || ''); setGiteaToken(data.giteaToken || ''); setGiteaURL(data.giteaURL || ''); setAvatarB64(data.avatarB64 || null); } }); }, []); function handleAvatarFileChange(e) { const file = e.target.files[0]; if (!file) return; const reader = new FileReader(); reader.onload = (ev) => setAvatarB64(ev.target.result); reader.readAsDataURL(file); } async function save() { const checkedUrl = normalizeAndValidateGiteaUrl(giteaURL); if (!checkedUrl.ok) { alert(checkedUrl.error); return; } window.electronAPI.saveCredentials({ githubToken, giteaToken, giteaURL: checkedUrl.value, avatarB64: avatarB64 || null }); // Avatar automatisch zu Gitea pushen, wenn Token + URL vorhanden if (avatarB64 && giteaToken && checkedUrl.value) { setAvatarUploading(true); const result = await window.electronAPI.updateGiteaAvatar({ token: giteaToken, url: checkedUrl.value, imageBase64: avatarB64 }); setAvatarUploading(false); if (!result.ok) { console.warn('Avatar-Upload fehlgeschlagen:', result.error); } } setSavedOk(true); setTimeout(() => setSavedOk(false), 2500); } return (
Zugangsdaten für GitHub und Gitea hinterlegen.
API-Zugriffe für GitHub und Gitea konfigurieren.