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 (
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
| Waktu |
Nomor Tujuan |
Pesan |
Status |
{logs.length === 0 ? (
| Belum ada data pengiriman. |
) : (
logs.slice(0, 5).map((log) => (
| {log.time} |
{log.number} |
{log.message} |
{log.status === 'success' ? (
Terkirim
) : (
Gagal
)}
|
))
)}
);
const renderTemplates = () => (
{/* Form Buat Template */}
{/* 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' && renderDashboard()}
{activeTab === 'templates' && renderTemplates()}
{activeTab === 'device' && renderDevice()}
{activeTab === 'sender' && renderSender()}
);
}