diff --git a/.env.example b/.env.example index 8b86c78..cde4f73 100644 --- a/.env.example +++ b/.env.example @@ -6,8 +6,8 @@ PUBLIC_SITE_URL=http://localhost:4321 CONTACT_FORM_MODE=dev CONTACT_FORM_FROM_EMAIL=no-reply@nexstudio.ai -CONTACT_FORM_TO_EMAIL=javaxman69@gmail.com -CONTACT_FORM_TO_EMAIL_INFO=javaxman69@gmail.com +CONTACT_FORM_TO_EMAIL=pro@nexstudio.ai +CONTACT_FORM_TO_EMAIL_INFO= CONTACT_FORM_TO_EMAIL_PRIVACY= CONTACT_FORM_TO_EMAIL_CAREERS= CONTACT_TURNSTILE_SECRET_KEY= @@ -16,6 +16,6 @@ CONTACT_TURNSTILE_SECRET_KEY= # In produzione: NEWSLETTER_MODE=live (oppure CONTACT_FORM_MODE=live come fallback) NEWSLETTER_MODE=dev NEWSLETTER_FROM_EMAIL=no-reply@nexstudio.ai -NEWSLETTER_NOTIFY_TO_EMAIL=javaxman69@gmail.com +NEWSLETTER_NOTIFY_TO_EMAIL=pro@nexstudio.ai NEWSLETTER_ADMIN_TOKEN= NEWSLETTER_TURNSTILE_SECRET_KEY= diff --git a/src/components/ContactFormInline.astro b/src/components/ContactFormInline.astro index 76a9f53..2021c60 100644 --- a/src/components/ContactFormInline.astro +++ b/src/components/ContactFormInline.astro @@ -19,6 +19,7 @@ const model = { fieldDepartment: cf.fieldDepartment, fieldEmail: cf.fieldEmail, fieldMessage: cf.fieldMessage, + successMessage: cf.successMessage, turnstileError: cf.errors.turnstile, configError: cf.errors.config, mailtoFallbackSubject: cf.mailtoFallbackSubject, @@ -112,18 +113,6 @@ const fieldClass = ) : null } - { - hasFormspree ? ( - - ) : null - }
+
+ {
const turnstileSecret = readEnv('CONTACT_TURNSTILE_SECRET_KEY', runtimeEnv);
const form = await request.formData();
- if (required(form.get('_gotcha'))) {
- const redirectTarget =
- sanitizeRedirect(required(form.get('_next')), url) ||
- sanitizeRedirect(request.headers.get('referer') ?? '/', url) ||
- new URL('/#contatti', url).toString();
- return succeed(request, redirectTarget);
- }
-
+ // Honeypot rimosso dal form (Turnstile basta). Se un client legacy lo manda, ignoralo.
const redirectTarget =
sanitizeRedirect(required(form.get('_next')), url) ||
sanitizeRedirect(readEnv('PUBLIC_CONTACT_FORM_SUCCESS_REDIRECT', runtimeEnv), url) ||
@@ -239,6 +232,14 @@ export const POST: APIRoute = async ({ request, url }) => {
}
}
} else {
+ const isProdHost =
+ url.hostname === 'nexstudio.ai' ||
+ url.hostname.endsWith('.nexstudio.ai') ||
+ url.hostname.endsWith('.workers.dev');
+ console.warn('[contact] CONTACT_FORM_MODE is not live', { mode, host: url.hostname });
+ if (isProdHost) {
+ return fail(request, USER_SEND_ERROR, 503);
+ }
console.info('[contact:dev] Contact payload received', {
name,
company,
diff --git a/src/scripts/nx-contact-form.ts b/src/scripts/nx-contact-form.ts
index cfa2808..c64b2c3 100644
--- a/src/scripts/nx-contact-form.ts
+++ b/src/scripts/nx-contact-form.ts
@@ -5,6 +5,7 @@ interface ContactFormCfg {
turnstileSiteKey: string;
notifySubject: string;
successRedirect: string;
+ successMessage: string;
fieldName: string;
fieldCompany: string;
fieldCountry: string;
@@ -32,6 +33,7 @@ function readCfg(): ContactFormCfg {
turnstileSiteKey: '',
notifySubject: '',
successRedirect: '',
+ successMessage: 'Message sent.',
fieldName: 'name',
fieldCompany: 'company',
fieldCountry: 'country',
@@ -53,12 +55,23 @@ function readCfg(): ContactFormCfg {
}
function showError(message: string): void {
+ const ok = document.getElementById('nx-contact-form-success');
+ if (ok) ok.classList.add('hidden');
const err = document.getElementById('nx-contact-form-error');
if (!err) return;
err.textContent = message;
err.classList.remove('hidden');
}
+function showSuccess(message: string): void {
+ const err = document.getElementById('nx-contact-form-error');
+ if (err) err.classList.add('hidden');
+ const ok = document.getElementById('nx-contact-form-success');
+ if (!ok) return;
+ ok.textContent = message;
+ ok.classList.remove('hidden');
+}
+
/** Dopo un POST fallito il token Turnstile è già consumato: ne serve uno nuovo. */
function resetTurnstile(form: HTMLFormElement): void {
const widget = form.querySelector