import { useEffect, useState } from 'react'; import { supabase } from '@/integrations/supabase/client'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { toast } from '@/hooks/use-toast'; import { Puzzle, Webhook, MessageSquare, Calendar, Mail, Link as LinkIcon, Key, Send, AlertTriangle } from 'lucide-react'; interface IntegrationSettings { id?: string; integration_n8n_base_url: string; integration_whatsapp_number: string; integration_whatsapp_url: string; integration_google_calendar_id: string; integration_email_provider: string; integration_email_api_base_url: string; integration_privacy_url: string; integration_terms_url: string; // Mailketing specific settings provider: 'mailketing' | 'smtp'; api_token: string; from_name: string; from_email: string; } const emptySettings: IntegrationSettings = { integration_n8n_base_url: '', integration_whatsapp_number: '', integration_whatsapp_url: '', integration_google_calendar_id: '', integration_email_provider: 'mailketing', integration_email_api_base_url: '', integration_privacy_url: '/privacy', integration_terms_url: '/terms', provider: 'mailketing', api_token: '', from_name: '', from_email: '', }; export function IntegrasiTab() { const [settings, setSettings] = useState(emptySettings); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [testEmail, setTestEmail] = useState(''); const [sendingTest, setSendingTest] = useState(false); useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { const { data: platformData } = await supabase .from('platform_settings') .select('*') .single(); // Fetch email provider settings from notification_settings const { data: emailData } = await supabase .from('notification_settings') .select('*') .single(); if (platformData) { setSettings({ id: platformData.id, integration_n8n_base_url: platformData.integration_n8n_base_url || '', integration_whatsapp_number: platformData.integration_whatsapp_number || '', integration_whatsapp_url: platformData.integration_whatsapp_url || '', integration_google_calendar_id: platformData.integration_google_calendar_id || '', integration_email_provider: platformData.integration_email_provider || 'mailketing', integration_email_api_base_url: platformData.integration_email_api_base_url || '', integration_privacy_url: platformData.integration_privacy_url || '/privacy', integration_terms_url: platformData.integration_terms_url || '/terms', // Email settings from notification_settings provider: emailData?.provider || 'mailketing', api_token: emailData?.api_token || '', from_name: emailData?.from_name || platformData.brand_email_from_name || '', from_email: emailData?.from_email || '', }); } setLoading(false); }; const saveSettings = async () => { setSaving(true); try { // Save platform settings const platformPayload = { integration_n8n_base_url: settings.integration_n8n_base_url, integration_whatsapp_number: settings.integration_whatsapp_number, integration_whatsapp_url: settings.integration_whatsapp_url, integration_google_calendar_id: settings.integration_google_calendar_id, integration_email_provider: settings.integration_email_provider, integration_email_api_base_url: settings.integration_email_api_base_url, integration_privacy_url: settings.integration_privacy_url, integration_terms_url: settings.integration_terms_url, }; if (settings.id) { const { error: platformError } = await supabase .from('platform_settings') .update(platformPayload) .eq('id', settings.id); if (platformError) throw platformError; } // Save email provider settings to notification_settings const emailPayload = { provider: settings.provider, api_token: settings.api_token, from_name: settings.from_name, from_email: settings.from_email, }; const { data: existingEmailSettings } = await supabase .from('notification_settings') .select('id') .maybeSingle(); if (existingEmailSettings?.id) { const { error: emailError } = await supabase .from('notification_settings') .update(emailPayload) .eq('id', existingEmailSettings.id); if (emailError) throw emailError; } else { const { error: emailError } = await supabase .from('notification_settings') .insert(emailPayload); if (emailError) throw emailError; } toast({ title: 'Berhasil', description: 'Pengaturan integrasi disimpan' }); } catch (error: any) { toast({ title: 'Error', description: error.message, variant: 'destructive' }); } setSaving(false); }; const sendTestEmail = async () => { if (!testEmail) return toast({ title: 'Error', description: 'Masukkan email tujuan', variant: 'destructive' }); if (!isEmailConfigured) return toast({ title: 'Error', description: 'Lengkapi konfigurasi email provider terlebih dahulu', variant: 'destructive' }); setSendingTest(true); try { const { data, error } = await supabase.functions.invoke('send-email-v2', { body: { to: testEmail, api_token: settings.api_token, from_name: settings.from_name, from_email: settings.from_email, subject: 'Test Email dari Access Hub', html_body: `

Test Email

Ini adalah email uji coba dari aplikasi Access Hub Anda.

Jika Anda menerima email ini, konfigurasi Mailketing API sudah berfungsi dengan baik!

Kirim ke: ${testEmail}


Best regards,
Access Hub Team

`, }, }); if (error) throw error; if (data?.success) { toast({ title: 'Berhasil', description: data.message }); } else { throw new Error(data?.message || 'Failed to send test email'); } } catch (error: any) { console.error('Test email error:', error); toast({ title: 'Error', description: error.message || 'Gagal mengirim email uji coba', variant: 'destructive' }); } finally { setSendingTest(false); } }; const isEmailConfigured = settings.api_token && settings.from_email; if (loading) return
; return (
{/* n8n / Webhook */} n8n / Webhook Konfigurasi URL untuk integrasi otomatisasi
setSettings({ ...settings, integration_n8n_base_url: e.target.value })} placeholder="https://automation.domain.com" className="border-2" />

Digunakan sebagai target default untuk webhook lanjutan. webhook_url per template tetap harus URL lengkap.

{/* WhatsApp */} WhatsApp Nomor kontak untuk dukungan dan notifikasi
setSettings({ ...settings, integration_whatsapp_number: e.target.value })} placeholder="+62812xxxx" className="border-2" />

Ditampilkan di konfirmasi konsultasi

setSettings({ ...settings, integration_whatsapp_url: e.target.value })} placeholder="https://wa.me/62812..." className="border-2" />
{/* Google Calendar */} Google Calendar Untuk pembuatan event konsultasi otomatis
setSettings({ ...settings, integration_google_calendar_id: e.target.value })} placeholder="your-calendar@gmail.com" className="border-2" />

Backend/n8n akan menggunakan ID ini untuk membuat event

{/* Email Provider */} Provider Email Konfigurasi provider email untuk pengiriman notifikasi {!isEmailConfigured && ( Konfigurasi email provider belum lengkap. Email tidak akan terkirim. )}
{settings.provider === 'mailketing' && ( <>
setSettings({ ...settings, api_token: e.target.value })} placeholder="Masukkan API token dari Mailketing" className="border-2" />

Dapatkan API token dari menu Integration di dashboard Mailketing

setSettings({ ...settings, from_name: e.target.value })} placeholder="Nama Bisnis" className="border-2" />
setSettings({ ...settings, from_email: e.target.value })} placeholder="info@domain.com" className="border-2" />

Pastikan email sudah terdaftar di Mailketing

setTestEmail(e.target.value)} placeholder="Email uji coba" className="border-2 max-w-xs" />
)} {settings.provider === 'smtp' && (
setSettings({ ...settings, integration_email_api_base_url: e.target.value })} placeholder="https://api.resend.com" className="border-2" />

Konfigurasi SMTP masih di bagian Notifikasi

)}
{/* Public Links */} Link Publik URL untuk halaman legal
setSettings({ ...settings, integration_privacy_url: e.target.value })} placeholder="/privacy" className="border-2" />
setSettings({ ...settings, integration_terms_url: e.target.value })} placeholder="/terms" className="border-2" />

Default: halaman internal. Bisa diganti dengan URL eksternal.

); }