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_oauth_config?: string; integration_email_provider: string; integration_email_api_base_url: string; integration_email_api_token: string; integration_email_from_name: string; integration_email_from_email: string; integration_privacy_url: string; integration_terms_url: string; integration_n8n_test_mode: boolean; } 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_email_api_token: '', integration_email_from_name: '', integration_email_from_email: '', integration_privacy_url: '/privacy', integration_terms_url: '/terms', integration_n8n_test_mode: false, }; 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); const [isTestRunning, setIsTestRunning] = useState(false); useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { const { data: platformData } = await supabase .from('platform_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_oauth_config: platformData.google_oauth_config || '', integration_email_provider: platformData.integration_email_provider || 'mailketing', integration_email_api_base_url: platformData.integration_email_api_base_url || '', integration_email_api_token: platformData.integration_email_api_token || '', integration_email_from_name: platformData.integration_email_from_name || platformData.brand_email_from_name || '', integration_email_from_email: platformData.integration_email_from_email || '', 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, }); } setLoading(false); }; const saveSettings = async () => { setSaving(true); try { // Save platform settings (includes email 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_oauth_config: settings.google_oauth_config, integration_email_provider: settings.integration_email_provider, integration_email_api_base_url: settings.integration_email_api_base_url, integration_email_api_token: settings.integration_email_api_token, integration_email_from_name: settings.integration_email_from_name, integration_email_from_email: settings.integration_email_from_email, 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 OAuth config separately via raw SQL if (platformError.code === 'PGRST204' && settings.google_oauth_config) { console.log('Schema cache error, using fallback RPC method'); const { error: rpcError } = await supabase.rpc('exec_sql', { sql: `UPDATE platform_settings SET google_oauth_config = '${settings.google_oauth_config.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_email_api_token: settings.integration_email_api_token, integration_email_from_name: settings.integration_email_from_name, integration_email_from_email: settings.integration_email_from_email, 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; } } } 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 { // Get brand name for test email const { data: platformData } = await supabase .from('platform_settings') .select('brand_name') .single(); const brandName = platformData?.brand_name || 'ACCESS HUB'; // Test email content using proper HTML template const testEmailContent = `

Email Test - ${brandName}

Halo,

Ini adalah email tes dari sistem ${brandName}.

✓ Konfigurasi email berhasil!
Email Anda telah terkirim dengan benar menggunakan provider: Mailketing

Jika Anda menerima email ini, berarti konfigurasi email sudah benar.

Terima kasih,
Tim ${brandName}

`; const { data, error } = await supabase.functions.invoke('send-notification', { body: { template_key: 'test_email', recipient_email: testEmail, recipient_name: 'Admin', variables: { brand_name: brandName, test_email: testEmail } }, }); 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.integration_email_api_token && settings.integration_email_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