import React, { useState, useEffect, useRef } from 'react';
import {
Activity,
Cpu,
Zap,
Bot,
Settings,
Download,
Wifi,
WifiOff,
Terminal,
Plus,
Trash2,
Play,
CheckCircle,
Send,
Code,
FileCode,
Sparkles,
Server,
RefreshCw,
Layers,
Check,
Smartphone,
Info,
Sun,
Moon
} from 'lucide-react';
// Mock initial nodes for workflow builder
const INITIAL_WORKFLOW_STEPS = [
{ id: '1', type: 'trigger', label: 'Webhook Diterima', icon: 'zap', desc: 'Menerima payload dari external API' },
{ id: '2', type: 'action', label: 'Ekstraksi Cerdas AI', icon: 'bot', desc: 'AIRA AI menganalisis isi pesan' },
{ id: '3', type: 'action', label: 'Simpan ke Database', icon: 'server', desc: 'Menyimpan log & analytics' }
];
const PRESET_STEPS = [
{ id: 'p1', type: 'action', label: 'Kirim Pesan WhatsApp', icon: 'send', desc: 'Mengirimkan notifikasi instan' },
{ id: 'p2', type: 'action', label: 'Kirim Email Notifikasi', icon: 'mail', desc: 'Kirim via SMTP server AIRA' },
{ id: 'p3', type: 'action', label: 'Format Payload JSON', icon: 'code', desc: 'Transformasi struktur data' },
{ id: 'p4', type: 'action', label: 'Filter Kondisi', icon: 'layers', desc: 'Logika IF/ELSE instan' },
];
export default function App() {
const [activeTab, setActiveTab] = useState('dashboard');
const [offlineMode, setOfflineMode] = useState(false);
const [isInstalled, setIsInstalled] = useState(false);
const [showNotification, setShowNotification] = useState(false);
const [notificationMsg, setNotificationMsg] = useState('');
const [isDarkMode, setIsDarkMode] = useState(false); // Default false = Light Mode
// Dashboard states
const [cpuUsage, setCpuUsage] = useState(32);
const [ramUsage, setRamUsage] = useState(48);
const [tasksCompleted, setTasksCompleted] = useState(1420);
const [activeAgents, setActiveAgents] = useState(12);
// Workflow Builder states
const [workflow, setWorkflow] = useState(INITIAL_WORKFLOW_STEPS);
const [isRunning, setIsRunning] = useState(false);
const [runningStepIdx, setRunningStepIdx] = useState(-1);
// Chatbot states
const [chatInput, setChatInput] = useState('');
const [chatMessages, setChatMessages] = useState([
{ id: '1', sender: 'aira', text: 'Halo! Saya AIRA (Aplikasi Pintar, Responsif, dan Adaptif). Ada alur otomatisasi yang bisa saya bantu buat hari ini?' }
]);
const [isTyping, setIsTyping] = useState(false);
const chatEndRef = useRef(null);
// Copy States for Dev Center
const [copiedFile, setCopiedFile] = useState(null);
useEffect(() => {
const interval = setInterval(() => {
if (!offlineMode) {
setCpuUsage(prev => {
const delta = Math.floor(Math.random() * 15) - 7;
return Math.max(10, Math.min(95, prev + delta));
});
setRamUsage(prev => {
const delta = Math.floor(Math.random() * 5) - 2;
return Math.max(30, Math.min(85, prev + delta));
});
if (Math.random() > 0.6) {
setTasksCompleted(prev => prev + 1);
}
}
}, 2000);
return () => clearInterval(interval);
}, [offlineMode]);
useEffect(() => {
chatEndRef.current?.scrollIntoView({ behavior: 'smooth' });
}, [chatMessages]);
const triggerToast = (msg) => {
setNotificationMsg(msg);
setShowNotification(true);
setTimeout(() => setShowNotification(false), 3000);
};
// Workflow runner simulation
const runWorkflowSimulation = async () => {
if (workflow.length === 0) {
triggerToast('Tambahkan minimal 1 langkah otomatisasi!');
return;
}
setIsRunning(true);
for (let i = 0; i < workflow.length; i++) {
setRunningStepIdx(i);
await new Promise(resolve => setTimeout(resolve, 1500));
}
setRunningStepIdx(-1);
setIsRunning(false);
setTasksCompleted(prev => prev + 1);
triggerToast('Otomatisasi Alur Berhasil Dieksekusi!');
};
const addWorkflowStep = (preset) => {
const newStep = {
id: Date.now().toString(),
type: preset.type,
label: preset.label,
icon: preset.icon,
desc: preset.desc
};
setWorkflow([...workflow, newStep]);
triggerToast(`Ditambahkan: ${preset.label}`);
};
const removeWorkflowStep = (id) => {
setWorkflow(workflow.filter(step => step.id !== id));
};
// AI Assistant trigger response
const handleSendMessage = () => {
if (!chatInput.trim()) return;
const userMsg = { id: Date.now().toString(), sender: 'user', text: chatInput };
setChatMessages(prev => [...prev, userMsg]);
setChatInput('');
setIsTyping(true);
setTimeout(() => {
let aiResponseText = 'Maaf, saya sedang mempelajari modul itu. Coba tanyakan tentang "buat otomatisasi WhatsApp" atau "cek status sistem".';
const prompt = userMsg.text.toLowerCase();
if (prompt.includes('status') || prompt.includes('sistem') || prompt.includes('health')) {
aiResponseText = `Kondisi AIRA saat ini sangat prima: CPU ${cpuUsage}%, Memori ${ramUsage}%, dan total ${tasksCompleted} tugas automasi telah diproses dengan lancar.`;
} else if (prompt.includes('whatsapp') || prompt.includes('wa') || prompt.includes('otomatisasi')) {
aiResponseText = 'Tentu! Saya bisa mengintegrasikan pemicu (trigger) Webhook ke aksi pengiriman WhatsApp instan. Anda bisa menambahkan preset "Kirim Pesan WhatsApp" pada tab Otomatisasi.';
} else if (prompt.includes('pwa') || prompt.includes('install')) {
aiResponseText = 'AIRA mendukung PWA secara penuh! Aplikasi ini dapat diinstal di Google Chrome Anda, responsif di handphone, dan bisa bekerja secara offline berkat Service Worker pintar kami.';
}
setChatMessages(prev => [...prev, {
id: (Date.now() + 1).toString(),
sender: 'aira',
text: aiResponseText
}]);
setIsTyping(false);
}, 1200);
};
// PWA Mock install
const handleMockInstall = () => {
setIsInstalled(true);
triggerToast('AIRA Terinstal Sukses di Desktop Anda!');
};
// Code copier helper
const copyToClipboard = (text, fileName) => {
navigator.clipboard.writeText(text);
setCopiedFile(fileName);
triggerToast(`${fileName} berhasil disalin!`);
setTimeout(() => setCopiedFile(null), 2000);
};
const manifestCode = `{
"short_name": "AIRA",
"name": "AIRA - Aplikasi Pintar, Responsif, Adaptif",
"icons": [
{
"src": "icons/icon-192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "icons/icon-512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": "/",
"background_color": "#f8fafc",
"theme_color": "#4f46e5",
"display": "standalone",
"orientation": "portrait-primary"
}`;
const serviceWorkerCode = `const CACHE_NAME = 'aira-v1';
const ASSETS = [
'/',
'/index.html',
'/styles.css',
'/app.js',
'/icons/icon-192.png'
];
self.addEventListener('install', (e) => {
e.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(ASSETS);
})
);
});
self.addEventListener('fetch', (e) => {
e.respondWith(
caches.match(e.request).then((cachedResponse) => {
return cachedResponse || fetch(e.request);
})
);
});`;
const themeStyles = {
wrapper: isDarkMode ? "bg-slate-950 text-slate-100" : "bg-slate-50 text-slate-800",
sidebar: isDarkMode ? "bg-slate-900 border-slate-800" : "bg-white border-slate-200",
header: isDarkMode ? "border-slate-900 bg-slate-900/40" : "border-slate-200 bg-white/80",
card: isDarkMode ? "bg-slate-900/80 border-slate-800/80" : "bg-white border-slate-200 shadow-sm",
nestedBg: isDarkMode ? "bg-slate-950/40 border-slate-800/50" : "bg-slate-100/80 border-slate-200/60",
subtleText: isDarkMode ? "text-slate-400" : "text-slate-600",
brandText: isDarkMode ? "from-white to-slate-400" : "from-slate-900 to-slate-600",
badge: isDarkMode ? "bg-slate-800 border-slate-700 text-slate-400" : "bg-slate-100 border-slate-200 text-slate-600",
buttonSec: isDarkMode ? "bg-slate-800 hover:bg-slate-700 text-slate-100 border-slate-700/60" : "bg-slate-100 hover:bg-slate-200 text-slate-700 border-slate-300/60",
inputBg: isDarkMode ? "bg-slate-900 border-slate-800 text-slate-100" : "bg-white border-slate-200 text-slate-800",
codeBox: isDarkMode ? "bg-slate-950" : "bg-slate-900 text-slate-100"
};
return (
{/* Toast Notification */}
{showNotification && (
{notificationMsg}
)}
{/* Sidebar Navigation */}
{/* Main Content Area */}
{/* Header bar */}
{/* Content Tabs Switcher */}
{/* TAB: DASHBOARD */}
{activeTab === 'dashboard' && (
{/* Promo Banner / Overview */}
Profil Platform
AIRA: Aplikasi Pintar, Responsif, dan Adaptif
Sistem otomatisasi performa tinggi yang memadukan keunggulan kecerdasan buatan (*Application Intelligence*) dengan proses integrasi alur kerja super cepat (*Rapid Automation*).
{/* Stats Cards */}
CPU Core Load
{cpuUsage}%
Job Otomatisasi
{tasksCompleted}
Seluruh alur berjalan lancar
Agen Cerdas Aktif
{activeAgents}
Model: AIRA GPT-v4
Online
{/* Interactive Telemetry & Feature Grid */}
{/* Real-time Graph Box */}
Performa Node Transmisi
Statistik muatan pesan & pemrosesan otomasi
Node Utama
{/* Simulated SVG Graphic Bar */}
{[40, 52, 38, 65, 80, 48, 70, 60, 55, 90, 85, 62, 77, 88, 95].map((val, idx) => (
))}
Responsivitas Rata-rata: 12ms
Kepatuhan SLA: 99.98%
{/* Quick Info Box */}
Arsitektur Responsif
Mengapa menggunakan PWA? Aplikasi berbasis PWA menjamin AIRA selalu berjalan dalam performa puncak di segala sistem operasi, ringan, dan mandiri tanpa perlu resource besar.
✔
Instalasi Instan & Ringan (<5 MB)
✔
Dukungan Kerja Offline Tanpa Koneksi
✔
Push Notifications & Integrasi Sistem
setActiveTab('pwa-dev')}
className={`w-full font-semibold text-xs py-2.5 rounded-xl transition border mt-4 ${themeStyles.buttonSec}`}
>
Buka Konfigurasi PWA
)}
{/* TAB: WORKFLOW */}
{activeTab === 'workflow' && (
Rapid Automation Builder
Eksperimen menyusun langkah otomatisasi secara cepat dan lihat rantai eksekusi berjalan.
{/* Node Presets Picker */}
Preset Aksi Otomatisasi
Klik salah satu preset di bawah untuk menambahkan ke alur eksekusi AIRA:
{PRESET_STEPS.map((preset) => (
addWorkflowStep(preset)}
className={`w-full text-left border p-3 rounded-xl flex items-center space-x-3 transition group ${isDarkMode ? 'bg-slate-950 hover:bg-slate-800/80 border-slate-800/80' : 'bg-slate-50 hover:bg-indigo-50/50 border-slate-200'}`}
>
{preset.icon === 'send' && }
{preset.icon === 'code' && }
{preset.icon === 'layers' && }
{preset.icon === 'mail' && }
{preset.label}
{preset.desc}
))}
{/* Workflow Workspace */}
Rantai Otomatisasi Terpasang
{isRunning ? "Menjalankan..." : "Uji Alur Kerja"}
{/* Nodes Visual List */}
{workflow.map((step, idx) => (
{/* Connection Line */}
{idx < workflow.length - 1 && (
)}
{/* Icon Indicator */}
{step.icon === 'zap' && }
{step.icon === 'bot' && }
{step.icon === 'server' && }
{step.icon === 'send' && }
{step.icon === 'code' && }
{step.icon === 'layers' && }
{step.icon === 'mail' && }
STEP 0{idx + 1}
{step.type}
{step.label}
{step.desc}
{/* Remove / Status Button */}
{runningStepIdx === idx ? (
Memproses...
) : (
removeWorkflowStep(step.id)}
className={`p-1.5 rounded-lg transition disabled:opacity-30 ${isDarkMode ? 'text-slate-500 hover:text-rose-400 hover:bg-slate-900' : 'text-slate-400 hover:text-rose-500 hover:bg-slate-100'}`}
>
)}
))}
{workflow.length === 0 && (
Rantai otomatisasi kosong.
Gunakan preset aksi di samping kiri untuk merancang alur kerja.
)}
AIRA Rapid Builder mengotomatisasi API, database, & pesan dengan penanganan cerdas.
)}
{/* TAB: AI CHAT */}
{activeTab === 'ai-chat' && (
{/* Chat Header */}
AIRA Artificial Intelligence
Sistem Cerdas Aktif
Model: GPT-v4
{/* Chat Messages */}
{chatMessages.map((msg) => (
))}
{isTyping && (
)}
{/* Chat Input */}
setChatInput(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSendMessage()}
placeholder="Tanya AIRA: 'status sistem' atau 'bantu buat otomatisasi whatsapp'..."
className={`flex-1 px-4 py-3 rounded-xl text-xs placeholder-slate-400 focus:outline-none focus:border-indigo-500 transition-all ${themeStyles.inputBg}`}
/>
)}
{/* TAB: PWA DEV CENTER */}
{activeTab === 'pwa-dev' && (
PWA Configuration Center
Semua dokumen konfigurasi esensial untuk mengaktifkan instalasi PWA AIRA di Google Chrome.
{/* PWA Best Practices Guides & Config Files */}
{/* Manifest Codebox */}
manifest.json
copyToClipboard(manifestCode, 'manifest.json')}
className={`text-xs py-1 px-2.5 rounded border transition ${isDarkMode ? 'bg-slate-900 hover:bg-slate-800 text-slate-300 border-slate-800 hover:border-indigo-500/40' : 'bg-white hover:bg-slate-100 text-slate-600 border-slate-200 hover:border-indigo-500/40'}`}
>
{copiedFile === 'manifest.json' ? 'Tersalin!' : 'Salin Kode'}
Menyediakan metadata konfigurasi sehingga browser Chrome mengenali website AIRA sebagai aplikasi desktop mandiri.
{/* Service Worker Codebox */}
service-worker.js
copyToClipboard(serviceWorkerCode, 'service-worker.js')}
className={`text-xs py-1 px-2.5 rounded border transition ${isDarkMode ? 'bg-slate-900 hover:bg-slate-800 text-slate-300 border-slate-800 hover:border-indigo-500/40' : 'bg-white hover:bg-slate-100 text-slate-600 border-slate-200 hover:border-indigo-500/40'}`}
>
{copiedFile === 'service-worker.js' ? 'Tersalin!' : 'Salin Kode'}
Service Worker pintar yang mengamankan caching aset statis agar aplikasi AIRA termuat secepat kilat (Rapid) meski koneksi offline.
{/* Register Script & Best Practices Instruction */}
Cara Registrasi di File Utama (index.html / app.js)
Salin dan masukkan potongan kode javascript ini di bagian akhir tag <script> index.html Anda untuk menyalakan mode PWA secara resmi:
{`if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js')
.then(reg => console.log('AIRA Service Worker Sukses Terdaftar!', reg))
.catch(err => console.log('Registrasi SW gagal: ', err));
});
}`}
)}
);
}