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 { Textarea } from '@/components/ui/textarea'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Switch } from '@/components/ui/switch'; 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; google_service_account_json?: string; integration_email_provider: string; integration_email_api_base_url: string; integration_privacy_url: string; integration_terms_url: string; integration_n8n_test_mode: boolean; // 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', integration_n8n_test_mode: false, 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 || '', google_service_account_json: platformData.google_service_account_json || '', 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', integration_n8n_test_mode: platformData.integration_n8n_test_mode || false, // 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, google_service_account_json: settings.google_service_account_json, 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, integration_n8n_test_mode: settings.integration_n8n_test_mode, }; if (settings.id) { const { error: platformError } = await supabase .from('platform_settings') .update(platformPayload) .eq('id', settings.id); if (platformError) { // If schema cache error, try saving service account JSON separately via raw SQL if (platformError.code === 'PGRST204' && settings.google_service_account_json) { console.log('Schema cache error, using fallback RPC method'); const { error: rpcError } = await supabase.rpc('exec_sql', { sql: `UPDATE platform_settings SET google_service_account_json = '${settings.google_service_account_json.replace(/'/g, "''")}'::jsonb WHERE id = '${settings.id}'` }); if (rpcError) { // Save other fields without the problematic column const { error: retryError } = await supabase .from('platform_settings') .update({ 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, integration_n8n_test_mode: settings.integration_n8n_test_mode, }) .eq('id', settings.id); if (retryError) throw retryError; toast({ title: 'Peringatan', description: 'Pengaturan disimpan tapi Service Account JSON perlu disimpan manual. Hubungi admin.' }); } else { toast({ title: 'Berhasil', description: 'Service Account JSON disimpan via RPC' }); } } else { 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.

Aktifkan untuk menggunakan webhook path /webhook-test/ instead of /webhook/

setSettings({ ...settings, integration_n8n_test_mode: checked })} />
{settings.integration_n8n_test_mode && ( Mode test aktif: Webhook akan menggunakan path /webhook-test/ )}
{/* 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 akan menggunakan ID ini untuk membuat event