שילוב טופס יצירת קשר של React (אפליקציות Vite ועמוד יחיד)
כיצד להוסיף טפסי יצירת קשר ומשוב לאפליקציות React-Page Single (SPA) שנבנו עם Vite או Create React App, הכוללות הגנה מפני ספאם של Honeypot והודעות תיבת דואר נכנס מיידיות.
1. רכיב טופס יצירת קשר סטנדרטי של React עם Vite
רכיב React קל משקל זה משתמש ב-React רגילים (useState) וב-Fetch API של הדפדפן כדי לשלוח ישירות לנקודת הקצה הציבורית שלך Lugatu. אין צורך בספריות טפסים חיצוניות או שרתי אחורי.
import React, { useState } from 'react';
export function ContactForm() {
const [formData, setFormData] = useState({ name: '', email: '', message: '', _gotcha: '' });
const [status, setStatus] = useState<'idle' | 'submitting' | 'success' | 'error'>('idle');
const [errorMessage, setErrorMessage] = useState('');
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
if (formData._gotcha) return; // Silent discard for automated bot traps
setStatus('submitting');
setErrorMessage('');
try {
const response = await fetch('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
fields: {
name: formData.name,
email: formData.email,
message: formData.message,
},
honeypot: formData._gotcha,
}),
});
if (!response.ok) {
throw new Error('Failed to deliver message');
}
setStatus('success');
setFormData({ name: '', email: '', message: '', _gotcha: '' });
} catch (err: any) {
setStatus('error');
setErrorMessage(err.message || 'Submission error. Please try again.');
}
};
return (
<form onSubmit={handleSubmit} className="space-y-4 max-w-md">
<div>
<label htmlFor="react-name" className="block text-sm font-semibold mb-1">Your Name</label>
<input
id="react-name"
type="text"
required
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<div>
<label htmlFor="react-email" className="block text-sm font-semibold mb-1">Email Address</label>
<input
id="react-email"
type="email"
required
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<div>
<label htmlFor="react-message" className="block text-sm font-semibold mb-1">Message</label>
<textarea
id="react-message"
rows={4}
required
value={formData.message}
onChange={(e) => setFormData({ ...formData, message: e.target.value })}
className="w-full border rounded-xl p-2.5"
/>
</div>
<!-- Honeypot spam defense -->
<input
type="text"
name="_gotcha"
value={formData._gotcha}
onChange={(e) => setFormData({ ...formData, _gotcha: e.target.value })}
style={{ display: 'none' }}
tabIndex={-1}
autoComplete="off"
/>
<button
type="submit"
disabled={status === 'submitting'}
className="btn-primary-editorial py-2.5 px-6"
>
{status === 'submitting' ? 'Sending...' : 'Send Message'}
</button>
{status === 'success' && (
<p className="text-sm text-green-700 font-medium">Thank you! Your message was delivered.</p>
)}
{status === 'error' && (
<p className="text-sm text-red-600">{errorMessage}</p>
)}
</form>
);
}
2. אינטגרציה עם React Hook Form ופורמיק
מודל הגשת JSON הסטנדרטי של Lugatu משתלב ללא מאמץ עם ספריות אימות טפסים כמו React Hook Form, Formik או Zod. העבירו את הערכים בסידרה ישירות לאובייקט המטען של השדות.
// React Hook Form submission handler
const onSubmit = async (data: FormValues) => {
const res = await fetch(`https://www.lugatu.com/api/v1/public/forms/${import.meta.env.VITE_LUGATU_FORM_ID}/submissions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ fields: data }),
});
return res.ok;
};
3. משתני סביבה והפרדה סודית ב-React
ב-Vite, משתנים ציבוריים מקבלים קידומת VITE_. השתמש ב-VITE_LUGATU_FORM_ID עבור מזהה הטופס הציבורי. לעולם אל תחשוף את מפתח ה-API של שרת לשרת (lug_live_...) בתוך קוד מקור או מאגרים בצד הלקוח.
מפתחות API חיים שמתחילים ב-lug_live_ שמורים אך ורק לביצוע שרת לשרת. כל בקשת דפדפן שנשלחת עם מפתח API חי נדחית עם HTTP 403.
אבטחה ואימות בלתי משתנה
Invariant אבטחה: לעולם אל תכניס מפתחות API חיים עם VITE_ או REACT_APP_. לקוחות דפדפן חייבים להגיש באופן בלעדי לנקודות קצה ציבוריות ללא מפתחות API.
פתרון בעיות ושגיאות בליעה נפוצות
ודא שאתה שולח לנקודת הקצה הציבורית (https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions). נקודות קצה של שרת לשרת (POST /api/v1/forms/{id}/submissions) חוסמות באופן מפורש את מקורות הדפדפן.
שאלות נפוצות
האם אני יכול להשתמש ב-React Hook Form או Formik עם Lugatu?
כֵּן. Lugatu מקבל JSON סטנדרטי עם אובייקט fields. כל ספריית טפסים של React יכולה לעשות סדרה של ערכיה ולהגיש לנקודת הקצה הציבורית.
מוכן ליצור את נקודת הקצה של הטופס שלך?
התחל בחינם תוך שניות. אין צורך בכרטיס אשראי.