From 858d5d1d25a00c97655cf65cbf876c3fca0fac88 Mon Sep 17 00:00:00 2001 From: elpatron Date: Sat, 30 May 2026 13:24:43 +0200 Subject: [PATCH] feat(feedback): optionales E-Mail-Kontaktfeld im Formular MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nutzer können optional eine E-Mail hinterlassen; Validierung client-/serverseitig, Weitergabe in Ntfy-Benachrichtigungen. Co-authored-by: Cursor --- client/src/App.css | 2 ++ client/src/components/FeedbackModal.tsx | 26 ++++++++++++++++++++++++- client/src/i18n/locales/de.json | 3 +++ client/src/i18n/locales/en.json | 3 +++ client/src/services/feedback.ts | 20 +++++++++++++++++-- server/src/routes/feedback.ts | 26 ++++++++++++++++++++++++- server/src/services/ntfyNotify.ts | 5 +++++ 7 files changed, 81 insertions(+), 4 deletions(-) diff --git a/client/src/App.css b/client/src/App.css index dc433d6..30ced04 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -457,6 +457,7 @@ html.scheme-dark .themed-select-option.is-selected { } .feedback-form__field select, +.feedback-form__field input, .feedback-form__field textarea { width: 100%; padding: 10px 12px; @@ -469,6 +470,7 @@ html.scheme-dark .themed-select-option.is-selected { } .feedback-form__field select:focus, +.feedback-form__field input:focus, .feedback-form__field textarea:focus { outline: none; border-color: var(--app-accent, #38bdf8); diff --git a/client/src/components/FeedbackModal.tsx b/client/src/components/FeedbackModal.tsx index b55a3c3..826f34b 100644 --- a/client/src/components/FeedbackModal.tsx +++ b/client/src/components/FeedbackModal.tsx @@ -22,6 +22,7 @@ export default function FeedbackModal({ }: FeedbackModalProps) { const { t } = useTranslation() const [category, setCategory] = useState('general') + const [contactEmail, setContactEmail] = useState('') const [message, setMessage] = useState('') const [submitState, setSubmitState] = useState('idle') const [statusMessage, setStatusMessage] = useState(null) @@ -53,6 +54,7 @@ export default function FeedbackModal({ if (!open) { clearCloseTimer() setCategory('general') + setContactEmail('') setMessage('') setSubmitState('idle') setStatusMessage(null) @@ -70,6 +72,7 @@ export default function FeedbackModal({ await sendFeedback({ category, message: message.trim(), + contactEmail: contactEmail.trim() || undefined, logbookId, logbookTitle }) @@ -84,7 +87,9 @@ export default function FeedbackModal({ setStatusMessage( error instanceof FeedbackApiError && error.code === 'NOT_CONFIGURED' ? t('feedback.error_not_configured') - : t('feedback.error_send') + : error instanceof FeedbackApiError && error.code === 'INVALID_EMAIL' + ? t('feedback.error_invalid_email') + : t('feedback.error_send') ) } } @@ -139,6 +144,25 @@ export default function FeedbackModal({ + +