ادغام فرم تماس React (برنامه های Vite و تک صفحه ای)
نحوه افزودن فرمهای تماس و بازخورد به برنامههای تکصفحهای React (SPA) که با برنامه Vite یا Create React ساخته شدهاند که دارای دفاع از هرزنامه 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 و Formik
مدل ارسال 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. Environment Variables & Secret Separation در React
در Vite، متغیرهای عمومی با VITE_ پیشوند می شوند. برای شناسه فرم عمومی از VITE_LUGATU_FORM_ID استفاده کنید. هرگز کلید API سرور به سرور (lug_live_...) خود را در کد منبع یا مخازن سمت سرویس گیرنده قرار ندهید.
کلیدهای Live API که با lug_live_ شروع می شوند کاملاً برای اجرای سرور به سرور رزرو شده اند. هر درخواست مرورگر ارسال شده با یک کلید API زنده با HTTP 403 رد می شود.
امنیت و احراز هویت ثابت
امنیت ثابت: هرگز کلیدهای 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 استفاده کنم؟
بله. لوگاتو JSON استاندارد را با شی فیلد می پذیرد. هر کتابخانه فرم React می تواند مقادیر خود را سریال کرده و به نقطه پایانی عمومی ارسال کند.
برای ایجاد نقطه پایانی فرم خود آماده هستید؟
در عرض چند ثانیه به صورت رایگان شروع کنید. بدون نیاز به کارت اعتباری