From 252865f62651f1c337fdb155e953135c1dce9551 Mon Sep 17 00:00:00 2001 From: chris Date: Sun, 7 Jun 2026 00:32:10 -0400 Subject: [PATCH] Contact form: split name into first/last, add ntfy notification Co-Authored-By: Claude Sonnet 4.6 --- contact-form.js | 13 +++++++++---- contact/index.html | 23 ++++++++++++++++++----- index.html | 23 ++++++++++++++++++----- server.js | 22 ++++++++++++++++++++-- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/contact-form.js b/contact-form.js index 3230d45..5232b1c 100644 --- a/contact-form.js +++ b/contact-form.js @@ -47,9 +47,13 @@ function validate() { let ok = true; - const name = form.querySelector('[name="name"]'); - if (!name.value.trim()) { setErr(name, 'Please enter your name.'); ok = false; } - else clearErr(name); + const firstName = form.querySelector('[name="firstName"]'); + if (!firstName.value.trim()) { setErr(firstName, 'Please enter your first name.'); ok = false; } + else clearErr(firstName); + + const lastName = form.querySelector('[name="lastName"]'); + if (!lastName.value.trim()) { setErr(lastName, 'Please enter your last name.'); ok = false; } + else clearErr(lastName); const email = form.querySelector('[name="email"]'); if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.value.trim())) { @@ -131,7 +135,8 @@ } const fd = new FormData(); - fd.append('name', form.querySelector('[name="name"]').value.trim()); + fd.append('firstName', form.querySelector('[name="firstName"]').value.trim()); + fd.append('lastName', form.querySelector('[name="lastName"]').value.trim()); fd.append('email', form.querySelector('[name="email"]').value.trim()); fd.append('phone', form.querySelector('[name="phone"]').value.trim()); fd.append('message', form.querySelector('[name="message"]').value.trim()); diff --git a/contact/index.html b/contact/index.html index 9f991b9..ea1a996 100644 --- a/contact/index.html +++ b/contact/index.html @@ -90,12 +90,25 @@ -
- -
- +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
-
diff --git a/index.html b/index.html index 9f7d0c3..2c69a7a 100644 --- a/index.html +++ b/index.html @@ -129,12 +129,25 @@
-
- -
- +
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
-
diff --git a/server.js b/server.js index 8ddf7b5..a4ae418 100644 --- a/server.js +++ b/server.js @@ -108,9 +108,10 @@ apiRouter.post('/contact', upload.array('photos', 3), async (req, res) => { return res.json({ success: true }); } - const { name, email, phone, message, eventType, eventDate } = req.body; + const { firstName, lastName, email, phone, message, eventType, eventDate } = req.body; + const name = [firstName, lastName].filter(Boolean).join(' '); - if (!name || !email || !phone || !message) { + if (!firstName || !lastName || !email || !phone || !message) { return res.status(400).json({ success: false, message: 'Please fill in all required fields.' }); } @@ -173,6 +174,23 @@ apiRouter.post('/contact', upload.array('photos', 3), async (req, res) => { transporter.sendMail(autoReply).catch(err => console.error(`[${new Date().toISOString()}] Auto-reply failed:`, err) ); + if (process.env.NTFY_URL) { + const ntfyBody = [ + phone, + eventDateFormatted || null, + eventType || null, + message.slice(0, 100) + (message.length > 100 ? 'โ€ฆ' : ''), + ].filter(Boolean).join(' ยท '); + fetch(process.env.NTFY_URL, { + method: 'POST', + headers: { + 'Title': `๐ŸŽˆ New inquiry โ€” ${name}`, + 'Priority': 'default', + 'Content-Type': 'text/plain', + }, + body: ntfyBody, + }).catch(err => console.error(`[${new Date().toISOString()}] ntfy failed:`, err)); + } res.json({ success: true }); } catch (err) { console.error(`[${new Date().toISOString()}] Contact form mail error:`, err);