From ed4a9b7efaedc2d528df01aa7bef7233cfc1df61 Mon Sep 17 00:00:00 2001 From: Tyler Hoang Date: Tue, 26 May 2026 00:56:58 -0700 Subject: contact: wire send button to tylerhoang.xyz/api/contact adds name + email inputs (api requires them) and POSTs json to the portfolio's existing contact endpoint. surfaces server errors. Co-Authored-By: Claude Opus 4.7 --- index.html | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/index.html b/index.html index 287fef9..aa284e8 100755 --- a/index.html +++ b/index.html @@ -247,7 +247,9 @@
— leave a quick note —
- + + +
— takes ~2 days for a reply — @@ -425,13 +427,35 @@ // guestbook send (fake but cute) const gbBtn = document.getElementById('gb-send'); if (gbBtn) { - gbBtn.addEventListener('click', () => { - const msg = document.getElementById('gb-msg').value.trim(); + gbBtn.addEventListener('click', async () => { + const name = document.getElementById('gb-name').value.trim(); + const email = document.getElementById('gb-email').value.trim(); + const message = document.getElementById('gb-msg').value.trim(); const status = document.getElementById('gb-status'); - if (!msg) { status.textContent = '— type something first —'; return; } - status.textContent = '✓ sent! talk soon'; - document.getElementById('gb-msg').value = ''; - setTimeout(() => { status.textContent = '— takes ~2 days for a reply —'; }, 4000); + if (!name || !email || !message) { status.textContent = '— fill in all three fields —'; return; } + status.textContent = 'sending…'; + gbBtn.disabled = true; + try { + const res = await fetch('https://tylerhoang.xyz/api/contact', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name, email, message }), + }); + const data = await res.json().catch(() => ({})); + if (res.ok) { + status.textContent = '✓ sent! talk soon'; + document.getElementById('gb-name').value = ''; + document.getElementById('gb-email').value = ''; + document.getElementById('gb-msg').value = ''; + } else { + status.textContent = data.error || '✗ something went wrong'; + } + } catch { + status.textContent = '✗ could not reach server'; + } finally { + gbBtn.disabled = false; + setTimeout(() => { status.textContent = '— takes ~2 days for a reply —'; }, 5000); + } }); } -- cgit v1.3-2-g0d8e