Home / راهنماها / ادغام فرم تماس React (برنامه های Vite و تک صفحه ای)
راهنمای ادغام · REACT & SPA

ادغام فرم تماس React (برنامه های Vite و تک صفحه ای)

نحوه افزودن فرم‌های تماس و بازخورد به برنامه‌های تک‌صفحه‌ای React (SPA) که با برنامه Vite یا Create React ساخته شده‌اند که دارای دفاع از هرزنامه Honeypot و اعلان‌های فوری صندوق ورودی است.

1. کامپوننت فرم تماس استاندارد React با Vite

این جزء سبک وزن React از قلاب‌های استاندارد React (useState) و مرورگر Fetch API برای ارسال مستقیم به نقطه پایانی عمومی Lugatu شما استفاده می‌کند. هیچ کتابخانه فرم خارجی یا سرورهای باطن مورد نیاز نیست.

src/components/ContactForm.tsx tsx
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 ادغام می‌شود. مقادیر سریال شده را مستقیماً به فیلدهای فیلد ارسال کنید.

useLugatuForm.ts typescript
// 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_...) خود را در کد منبع یا مخازن سمت سرویس گیرنده قرار ندهید.

warning

کلیدهای Live API که با lug_live_ شروع می شوند کاملاً برای اجرای سرور به سرور رزرو شده اند. هر درخواست مرورگر ارسال شده با یک کلید API زنده با HTTP 403 رد می شود.

امنیت و احراز هویت ثابت

امنیت ثابت: هرگز کلیدهای API زنده را با VITE_ یا REACT_APP_ پیشوند نکنید. مشتریان مرورگر باید منحصراً به نقاط پایانی عمومی بدون کلیدهای API ارسال کنند.

عیب یابی و خطاهای رایج بلع

فرم ارسالی خطای CORS را در کنسول مرورگر برمی گرداند

مطمئن شوید که به نقطه پایانی عمومی ارسال می کنید (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 می تواند مقادیر خود را سریال کرده و به نقطه پایانی عمومی ارسال کند.

برای ایجاد نقطه پایانی فرم خود آماده هستید؟

در عرض چند ثانیه به صورت رایگان شروع کنید. بدون نیاز به کارت اعتباری

رایگان شروع کنید →