Integrasi Formulir Kontak Sudut (Mandiri & Sinyal)
Hubungkan aplikasi Angular 17/18+ ke Lugatu menggunakan Komponen Mandiri, Sinyal reaktif, dan HttpClient untuk pengiriman formulir kontak yang andal tanpa memelihara server SMTP.
1. Komponen Formulir Kontak Mandiri dengan Sinyal Reaktif
Angular Modern lebih menyukai Komponen dan Sinyal yang Berdiri Sendiri dibandingkan NgModul yang berat. Implementasi ini menyediakan formulir kontak yang dapat diakses dengan pemuatan reaktif, kesalahan, dan status keberhasilan yang dikirimkan langsung ke Lugatu.
import { Component, signal, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-contact-form',
standalone: true,
imports: [CommonModule, FormsModule],
template: `
<form (ngSubmit)="onSubmit()" class="space-y-4 max-w-md">
<div>
<label for="name" class="block text-sm font-semibold mb-1">Your Name</label>
<input id="name" type="text" [(ngModel)]="name" name="name" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label for="email" class="block text-sm font-semibold mb-1">Email Address</label>
<input id="email" type="email" [(ngModel)]="email" name="email" required class="w-full border rounded-xl p-2.5" />
</div>
<div>
<label for="message" class="block text-sm font-semibold mb-1">Message</label>
<textarea id="message" rows="4" [(ngModel)]="message" name="message" required class="w-full border rounded-xl p-2.5"></textarea>
</div>
<!-- Honeypot spam defense -->
<input type="text" [(ngModel)]="gotcha" name="_gotcha" style="display:none !important" tabindex="-1" autocomplete="off" />
<button type="submit" [disabled]="isSubmitting()" class="btn-primary-editorial py-2.5 px-6">
{{ isSubmitting() ? 'Sending...' : 'Send Message' }}
</button>
<p *ngIf="isSuccess()" class="text-sm text-green-700 font-medium">Thank you! Your message has been received.</p>
<p *ngIf="errorMessage()" class="text-sm text-red-600">{{ errorMessage() }}</p>
</form>
`,
})
export class ContactFormComponent {
private http = inject(HttpClient);
name = signal('');
email = signal('');
message = signal('');
gotcha = signal('');
isSubmitting = signal(false);
isSuccess = signal(false);
errorMessage = signal('');
onSubmit() {
if (this.gotcha()) return; // Silent discard for automated bot submissions
this.isSubmitting.set(true);
this.errorMessage.set('');
const payload = {
fields: {
name: this.name(),
email: this.email(),
message: this.message(),
},
honeypot: this.gotcha(),
};
this.http.post('https://www.lugatu.com/api/v1/public/forms/YOUR_PUBLIC_FORM_ID/submissions', payload)
.subscribe({
next: () => {
this.isSubmitting.set(false);
this.isSuccess.set(true);
this.name.set('');
this.email.set('');
this.message.set('');
},
error: () => {
this.isSubmitting.set(false);
this.errorMessage.set('Submission failed. Please try again.');
},
});
}
}
2. SSR & Penerusan Server-ke-Server Universal Sudut
Jika aplikasi Angular Anda berjalan dengan Angular SSR (mesin Node / Express), Anda dapat melakukan proksi pertanyaan melalui pengendali rute sisi server untuk melindungi kunci API Lugatu Server-ke-Server Anda.
// Express / Node backend endpoint in Angular SSR
server.post('/api/contact', async (req, res) => {
const { name, email, message, _gotcha } = req.body;
if (_gotcha) return res.status(200).json({ ok: true });
try {
const response = await fetch(`https://www.lugatu.com/api/v1/forms/${process.env.LUGATU_FORM_ID}/submissions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.LUGATU_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ fields: { name, email, message } }),
});
res.status(response.status).json({ ok: response.ok });
} catch (error) {
res.status(500).json({ error: 'Failed to deliver message' });
}
});
3. Pertahanan Bot & Konfigurasi Honeypot
Lugatu memeriksa bidang _gotcha secara otomatis. Jaga agar tidak terlihat oleh pengunjung manusia menggunakan display:none dan tabindex="-1". Robot spam yang mengisi setiap masukan DOM memicu penindasan senyap.
Jangan pernah menggunakan label formulir untuk masukan honeypot. Biarkan pelengkapan otomatis nonaktif dan kecualikan bidang tersebut dari nama yang dapat diakses pembaca layar.
Keamanan & Otentikasi Invarian
Invarian Keamanan: Kunci API server-ke-server (lug_live_...) tidak boleh digabungkan ke dalam aset Angular sisi klien atau file environment.ts. Gunakan titik akhir publik untuk pengiriman klien langsung atau teruskan melalui titik akhir server.
Pemecahan Masalah & Kesalahan Penyerapan Umum
Titik akhir formulir publik mengizinkan pengiriman lintas asal dari browser apa pun. Jika Anda memanggil titik akhir server-ke-server (POST /api/v1/forms/{id}/submissions) langsung dari Angular, beralihlah ke titik akhir publik (POST /api/v1/public/forms/{id}/submissions) atau teruskan melalui backend.
Pertanyaan yang Sering Diajukan
Apakah Lugatu mendukung Angular SSR dengan hidrasi klien?
Ya. Pengiriman formulir publik Lugatu dilakukan melalui pengambilan sisi klien atau HttpClient setelah interaksi pengguna, yang sepenuhnya kompatibel dengan Angular SSR dan hidrasi klien.
Siap membuat titik akhir formulir Anda?
Mulailah secara gratis dalam hitungan detik. Tidak diperlukan kartu kredit.