import React, { useState, useEffect } from 'react'; import { Home, User, LogIn, Users, PlusCircle, UserPlus, ListOrdered, Menu } from 'lucide-react'; // Menggunakan ikon dari lucide-react // Komponen Navbar const Navbar = ({ setCurrentPage, isOpen, toggleMenu }) => { return ( ); }; // Komponen Halaman Utama const HomePage = () => { return (

Selamat Datang di SSDG Korwil Banten

Platform ini dirancang untuk mempermudah pengelolaan anggota dan kegiatan SSDG Korwil Banten. Semoga keberadaan aplikasi ini dapat meningkatkan efisiensi dan koordinasi dalam organisasi kita.

); }; // Komponen Halaman Login const LoginPage = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [message, setMessage] = useState(''); const handleLogin = (e) => { e.preventDefault(); if (username === 'admin' && password === 'admin123') { setMessage(Login Berhasil! Selamat datang, Admin.); } else { setMessage(Username atau password salah.); } }; return (

Halaman Login

setUsername(e.target.value)} required />
setPassword(e.target.value)} required />
{message &&

{message}

}
); }; // Komponen Halaman Manajemen Anggota (Placeholder) const ManageMembersPage = () => { return (

Manajemen Anggota

Halaman ini akan menampilkan fungsionalitas untuk mengelola anggota, seperti mengedit informasi, menghapus anggota, atau mengubah status keanggotaan. Fitur-fitur ini akan diimplementasikan lebih lanjut saat terhubung ke backend.

); }; // Komponen Formulir Pendaftaran Anggota const RegisterMemberPage = ({ addMember }) => { const [name, setName] = useState(''); const [nikKtp, setNikKtp] = useState(''); const [gender, setGender] = useState(''); const [whatsapp, setWhatsapp] = useState(''); const [occupation, setOccupation] = useState(''); const [notes, setNotes] = useState(''); const [address, setAddress] = useState(''); const [district, setDistrict] = useState(''); // Kecamatan const [regency, setRegency] = useState(''); // Kabupaten const [profilePhoto, setProfilePhoto] = useState(null); const [profilePhotoPreview, setProfilePhotoPreview] = useState(null); // Untuk menampilkan pratinjau gambar const [message, setMessage] = useState(''); const handlePhotoChange = (e) => { const file = e.target.files[0]; if (file) { if (file.size > 480 * 480) { // Simple client-side size check (480*480 bytes as max size) setMessage(Ukuran file terlalu besar. Maksimal 480KB.); setProfilePhoto(null); setProfilePhotoPreview(null); return; } setProfilePhoto(file); // Create a preview for the image const reader = new FileReader(); reader.onloadend = () => { const img = new Image(); img.onload = () => { if (img.width > 480 || img.height > 480) { setMessage(Dimensi gambar terlalu besar. Maksimal 480x480 pixel.); setProfilePhoto(null); setProfilePhotoPreview(null); } else { setProfilePhotoPreview(reader.result); setMessage(''); // Clear any previous error messages } }; img.src = reader.result; }; reader.readAsDataURL(file); } else { setProfilePhoto(null); setProfilePhotoPreview(null); setMessage(''); } }; const handleSubmit = (e) => { e.preventDefault(); if (!name || !nikKtp || !gender || !whatsapp || !occupation || !address || !district || !regency) { setMessage(Mohon lengkapi semua bidang yang wajib (kecuali Keterangan & Photo Profile).); return; } // Perbaikan: Validasi ukuran file dan dimensi di sisi klien if (profilePhoto) { if (profilePhoto.size > 480 * 1024) { // 480KB in bytes setMessage(Ukuran file terlalu besar. Maksimal 480KB.); return; } if (profilePhotoPreview) { const img = new Image(); img.src = profilePhotoPreview; if (img.width > 480 || img.height > 480) { setMessage(Dimensi gambar terlalu besar. Maksimal 480x480 pixel.); return; } } } const newMember = { id: Date.now(), // ID unik sederhana name, nikKtp, gender, whatsapp, occupation, notes, address, district, regency, profilePhoto: profilePhotoPreview, // Store base64 string for preview/display registrationDate: new Date().toLocaleDateString('id-ID'), }; addMember(newMember); setMessage(Anggota berhasil didaftarkan!); // Reset form fields setName(''); setNikKtp(''); setGender(''); setWhatsapp(''); setOccupation(''); setNotes(''); setAddress(''); setDistrict(''); setRegency(''); setProfilePhoto(null); setProfilePhotoPreview(null); }; return (

Formulir Daftar Anggota

setName(e.target.value)} required />
setNikKtp(e.target.value)} required />
setWhatsapp(e.target.value)} required />
setOccupation(e.target.value)} required />
setDistrict(e.target.value)} required />
setRegency(e.target.value)} required />
{profilePhotoPreview && (

Pratinjau Foto:

Profile Preview
)}
{message &&

{message}

}
); }; // Komponen Halaman Anggota Terdaftar const RegisteredMembersPage = ({ members }) => { return (

Anggota Terdaftar

{members.length === 0 ? (

Belum ada anggota terdaftar. Silakan daftarkan anggota baru!

) : (
{members.map((member, index) => ( ))}
No. Nama NIK KTP Jenis Kelamin Nomor WA Pekerjaan Keterangan Alamat Kecamatan Kabupaten Photo Profile Tanggal Daftar
{index + 1} {member.name} {member.nikKtp} {member.gender} {member.whatsapp} {member.occupation} {member.notes} {member.address} {member.district} {member.regency} {member.profilePhoto ? ( Profile ) : ( Tidak ada foto )} {member.registrationDate}
)}
); }; // Komponen Utama Aplikasi const App = () => { const [currentPage, setCurrentPage] = useState('home'); const [members, setMembers] = useState([]); const [isMenuOpen, setIsMenuOpen] = useState(false); // Menambahkan anggota baru ke daftar const addMember = (newMember) => { setMembers((prevMembers) => [...prevMembers, newMember]); }; // Mengubah status menu navigasi (untuk mobile) const toggleMenu = () => { setIsMenuOpen(!isMenuOpen); }; // Tutup menu saat halaman berubah (untuk mobile) useEffect(() => { if (isMenuOpen) { setIsMenuOpen(false); } }, [currentPage]); // Render halaman berdasarkan currentPage const renderPage = () => { switch (currentPage) { case 'home': return ; case 'login': return ; case 'manageMembers': return ; case 'registerMember': return ; case 'registeredMembers': return ; default: return ; } }; return (
{/* Tailwind CSS Script (akan di-inject oleh lingkungan Canvas) */}
{renderPage()}
{/* Custom CSS for fade-in animations */}
); }; export default App;