Home / گائیڈز / ری ایکٹ رابطہ فارم انٹیگریشن (وائٹ اور سنگل پیج ایپس)
انٹیگریشن گائیڈ · رد عمل اور SPA

ری ایکٹ رابطہ فارم انٹیگریشن (وائٹ اور سنگل پیج ایپس)

وائٹ یا تخلیق ری ایکٹ ایپ کے ساتھ بنائی گئی ری ایکٹ سنگل پیج ایپلیکیشنز (SPA) میں رابطہ اور فیڈ بیک فارمز کیسے شامل کیے جائیں، جس میں ہنی پاٹ اسپام ڈیفنس اور فوری ان باکس اطلاعات شامل ہوں۔

1. وائٹ کے ساتھ معیاری رد عمل کا رابطہ فارم کا جزو

یہ ہلکا پھلکا 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. ری ایکٹ ہک فارم اور فارمک کے ساتھ انضمام

Lugatu معیاری JSON جمع کرانے کا ماڈل فارم کی توثیق کی لائبریریوں جیسے 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. رد عمل میں ماحولیاتی متغیرات اور خفیہ علیحدگی

Vite میں، عوامی متغیرات VITE_ کے ساتھ پریفکس ہوتے ہیں۔ عوامی فارم ID کے لیے VITE_LUGATU_FORM_ID استعمال کریں۔ اپنی سرور ٹو سرور API کلید (lug_live_...) کو کلائنٹ سائڈ سورس کوڈ یا ریپوزٹری کے اندر کبھی بھی ظاہر نہ کریں۔

warning

lug_live_ سے شروع ہونے والی لائیو API کیز سختی سے سرور سے سرور کے عمل کے لیے محفوظ ہیں۔ لائیو 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) واضح طور پر براؤزر کی اصلیت کو مسدود کرتے ہیں۔

اکثر پوچھے گئے سوالات

کیا میں Lugatu کے ساتھ React Hook Form یا Formik استعمال کر سکتا ہوں؟

جی ہاں Lugatu ایک فیلڈ آبجیکٹ کے ساتھ معیاری JSON کو قبول کرتا ہے۔ کوئی بھی React فارم لائبریری اپنی اقدار کو سیریلائز کر سکتی ہے اور پبلک اینڈ پوائنٹ پر جمع کر سکتی ہے۔

اپنا فارم اینڈ پوائنٹ بنانے کے لیے تیار ہیں؟

سیکنڈوں میں مفت شروع کریں۔ کریڈٹ کارڈ کی ضرورت نہیں ہے۔

مفت شروع کریں۔ →