import React, { useState, useEffect, useRef } from 'react'; import { LayoutDashboard, MessageSquare, Smartphone, Send, Plus, Trash2, CheckCircle, XCircle, Loader2, QrCode, LogOut, Save, Activity, Users } from 'lucide-react'; // --- Components --- // 1. Sidebar Component const Sidebar = ({ activeTab, setActiveTab }) => { const menus = [ { id: 'dashboard', label: 'Dashboard', icon: }, { id: 'templates', label: 'Template Pesan', icon: }, { id: 'device', label: 'Koneksi WhatsApp', icon: }, { id: 'sender', label: 'Kirim Pesan (Blast)', icon: }, ]; return (

WABlaster.pro

Status Server: Online

v1.0.5 Beta

); }; // 2. Dashboard Stats const DashboardStats = ({ templates, logs, isConnected }) => { return (

Status Perangkat

{isConnected ? 'Terhubung' : 'Terputus'}

Total Template

{templates.length}

Pesan Terkirim

{logs.filter(l => l.status === 'success').length}

Total Kontak

{logs.length > 0 ? new Set(logs.map(l => l.number)).size : 0}

); }; // 3. Main App Logic export default function App() { const [activeTab, setActiveTab] = useState('dashboard'); const [isConnected, setIsConnected] = useState(false); const [qrLoading, setQrLoading] = useState(false); const [showQr, setShowQr] = useState(false); // Data States const [templates, setTemplates] = useState([ { id: 1, title: 'Welcome Message', content: 'Halo, terima kasih telah menghubungi kami. Ada yang bisa dibantu?' }, { id: 2, title: 'Promo Diskon', content: 'Halo! Dapatkan diskon 50% khusus hari ini. Jangan lewatkan!' }, ]); const [logs, setLogs] = useState([]); // Form States const [newTemplateTitle, setNewTemplateTitle] = useState(''); const [newTemplateContent, setNewTemplateContent] = useState(''); const [targetNumbers, setTargetNumbers] = useState(''); const [selectedTemplate, setSelectedTemplate] = useState(''); const [isSending, setIsSending] = useState(false); const [progress, setProgress] = useState(0); // --- Handlers --- const handleConnect = () => { if (isConnected) { setIsConnected(false); setShowQr(false); return; } setQrLoading(true); // Simulasi loading QR Code setTimeout(() => { setQrLoading(false); setShowQr(true); // Simulasi scan otomatis setelah 3 detik (demo experience) setTimeout(() => { setShowQr(false); setIsConnected(true); }, 3000); }, 1500); }; const handleAddTemplate = () => { if (!newTemplateTitle || !newTemplateContent) return; const newTemp = { id: Date.now(), title: newTemplateTitle, content: newTemplateContent }; setTemplates([...templates, newTemp]); setNewTemplateTitle(''); setNewTemplateContent(''); }; const handleDeleteTemplate = (id) => { setTemplates(templates.filter(t => t.id !== id)); }; const handleSendMessages = async () => { if (!selectedTemplate) { alert("Pilih template terlebih dahulu!"); return; } if (!targetNumbers) { alert("Masukan nomor tujuan!"); return; } if (!isConnected) { alert("Mohon koneksikan WhatsApp terlebih dahulu di menu 'Koneksi Perangkat'."); setActiveTab('device'); return; } const numbers = targetNumbers.split('\n').filter(n => n.trim().length > 0); const template = templates.find(t => t.id === parseInt(selectedTemplate)); setIsSending(true); setProgress(0); // Simulasi Pengiriman for (let i = 0; i < numbers.length; i++) { const number = numbers[i].trim(); // Simulasi delay jaringan await new Promise(r => setTimeout(r, 1000)); const status = Math.random() > 0.1 ? 'success' : 'failed'; // 90% sukses simulasi const log = { id: Date.now() + i, number, message: template.content, time: new Date().toLocaleTimeString(), status }; setLogs(prev => [log, ...prev]); setProgress(((i + 1) / numbers.length) * 100); } setIsSending(false); alert("Proses pengiriman selesai!"); }; // --- Render Sections --- const renderDashboard = () => (

Dashboard Ringkasan

Riwayat Pengiriman Terakhir

{logs.length === 0 ? ( ) : ( logs.slice(0, 5).map((log) => ( )) )}
Waktu Nomor Tujuan Pesan Status
Belum ada data pengiriman.
{log.time} {log.number} {log.message} {log.status === 'success' ? ( Terkirim ) : ( Gagal )}
); const renderTemplates = () => (
{/* Form Buat Template */}

Buat Template Baru

setNewTemplateTitle(e.target.value)} placeholder="Misal: Promo Lebaran" className="w-full px-4 py-2 rounded-lg border border-slate-200 focus:border-green-500 focus:ring-2 focus:ring-green-200 outline-none transition-all" />

Tips: Pesan yang personal meningkatkan respon.

{/* List Template */}

Daftar Template Tersedia

{templates.map((t) => (

{t.title}

{t.content}
))} {templates.length === 0 && (

Belum ada template. Silahkan buat baru.

)}
); const renderDevice = () => (
{/* Header Device */}

Koneksi WhatsApp

Hubungkan nomor pengirim anda untuk mulai mengirim pesan.

{/* Left: Instructions */}
1

Buka WhatsApp di HP Anda.

2

Ketuk menu Titik Tiga (Android) atau Pengaturan (iPhone).

3

Pilih Perangkat Tertaut lalu Tautkan Perangkat.

4

Arahkan kamera ke QR Code di layar ini.

{/* Right: QR Display */}
{isConnected ? (

Terhubung!

Siap mengirim pesan

) : showQr ? (
{/* Fake QR Pattern */}
{[...Array(36)].map((_, i) => (
0.5 ? 'bg-black' : 'bg-transparent'}`}>
))}
{/* Logo Overlay */}
) : qrLoading ? (
Membuat sesi QR...
) : (

QR Code akan muncul disini

)}
); const renderSender = () => (
{/* Kolom Kiri: Konfigurasi */}

Konfigurasi Pengiriman

{/* Template Selector */}
{selectedTemplate && (
Preview: "{templates.find(t => t.id === parseInt(selectedTemplate))?.content}"
)}
{/* Numbers Input */}
Satu nomor per baris {targetNumbers ? targetNumbers.split('\n').filter(n => n.trim()).length : 0} Nomor terdeteksi
{/* Action Button */} {!isConnected && (

Perangkat belum terkoneksi. Silahkan scan QR Code di menu Koneksi.

)}
{/* Kolom Kanan: Live Log */}

TERMINAL LOG

Live Status
{logs.length === 0 && (
Menunggu perintah eksekusi...
)} {logs.map((log) => (
[{log.time}] Sending to {log.number}... {log.status === 'success' ? ( OK [200] ) : ( FAIL [TIMEOUT] )}
))} {isSending && (
Processing next queue...
)}
); return (

{activeTab === 'dashboard' && 'Ringkasan Aktivitas'} {activeTab === 'templates' && 'Manajemen Pesan'} {activeTab === 'device' && 'Status Perangkat'} {activeTab === 'sender' && 'Kirim Pesan Massal'}

Kelola kampanye WhatsApp marketing anda dengan mudah.

{isConnected ? '+62 812-XXXX-8899' : 'Offline'}
{activeTab === 'dashboard' && renderDashboard()} {activeTab === 'templates' && renderTemplates()} {activeTab === 'device' && renderDevice()} {activeTab === 'sender' && renderSender()}
); }