// Reusable contact form for all Aloha Smart System product pages.
// Submits to Web3Forms → info@alohasmartsystem.com
// Usage:
//
const AlohaContactForm = ({
accentColor = '#C8553D',
deepColor = '#7A2E1F',
productName = '',
defaultTopic = '',
isMobile = false,
variant = 'light', // 'light' (form on dark bg) or 'dark' (form on light bg)
}) => {
const [name, setName] = React.useState('');
const [phone, setPhone] = React.useState('');
const [email, setEmail] = React.useState('');
const [business, setBusiness] = React.useState('');
const [message, setMessage] = React.useState('');
const [touched, setTouched] = React.useState(false);
const [sent, setSent] = React.useState(false);
const [submitting, setSubmitting] = React.useState(false);
const [errorMsg, setErrorMsg] = React.useState('');
const emailValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim());
const valid = name.trim().length > 0 && emailValid && message.trim().length > 0;
const WEB3FORMS_KEY = 'adeb6c3b-2bf5-4dad-a49a-59875cbaf20d';
const handleSubmit = async (e) => {
e.preventDefault();
setTouched(true);
if (!valid || submitting) return;
setSubmitting(true);
setErrorMsg('');
const subjectPrefix = productName ? `[${productName}] ` : '';
const businessPart = business.trim() ? ' (' + business.trim() + ')' : '';
const payload = {
access_key: WEB3FORMS_KEY,
subject: `${subjectPrefix}New inquiry — ${name.trim()}${businessPart}`,
from_name: productName ? `${productName} page` : 'Aloha Smart System',
product: productName || '(general)',
topic: defaultTopic || productName || '(not specified)',
name: name.trim(),
phone: phone.trim() || '(not provided)',
email: email.trim(),
business: business.trim() || '(not provided)',
message: message.trim(),
replyto: email.trim(),
botcheck: '',
};
try {
const res = await fetch('https://api.web3forms.com/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
body: JSON.stringify(payload),
});
const data = await res.json();
if (data && data.success) {
setSent(true);
} else {
setErrorMsg((data && data.message) || 'Something went wrong. Please email info@alohasmartsystem.com directly.');
}
} catch (err) {
setErrorMsg('Network error. Please email info@alohasmartsystem.com directly.');
} finally {
setSubmitting(false);
}
};
// Form sits on a dark/colored background (most product CTA sections)
const onDark = variant === 'light';
const inputBase = {
width: '100%',
background: onDark ? 'rgba(255,255,255,0.08)' : 'rgba(0,0,0,0.04)',
border: `1px solid ${onDark ? 'rgba(255,255,255,0.18)' : 'rgba(0,0,0,0.12)'}`,
borderRadius: 10,
color: onDark ? '#fff' : '#1A1A1A',
fontSize: 15,
padding: '13px 15px',
outline: 'none',
fontFamily: 'inherit',
transition: 'border-color .15s, background .15s',
boxSizing: 'border-box',
};
const labelStyle = {
display: 'block', fontSize: 11, fontWeight: 700, letterSpacing: '0.06em',
color: onDark ? 'rgba(255,255,255,0.75)' : 'rgba(0,0,0,0.6)',
marginBottom: 7, textTransform: 'uppercase',
};
const fieldErr = (cond) => touched && cond
? { ...inputBase, borderColor: '#F87171' }
: inputBase;
const cardBg = onDark ? 'rgba(255,255,255,0.06)' : '#FFFFFF';
const cardBorder = onDark ? '1px solid rgba(255,255,255,0.12)' : '1px solid rgba(0,0,0,0.08)';
if (sent) {
return (
✓
Mahalo — we got it.
We’ll come back within 48 hours.
);
}
return (
);
};
window.AlohaContactForm = AlohaContactForm;