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.
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
{message &&
{message}
}
);
};
// Komponen Halaman Anggota Terdaftar
const RegisteredMembersPage = ({ members }) => {
return (
Anggota Terdaftar
{members.length === 0 ? (
Belum ada anggota terdaftar. Silakan daftarkan anggota baru!
) : (
No.
Nama
NIK KTP
Jenis Kelamin
Nomor WA
Pekerjaan
Keterangan
Alamat
Kecamatan
Kabupaten
Photo Profile
Tanggal Daftar
{members.map((member, index) => (
{index + 1}
{member.name}
{member.nikKtp}
{member.gender}
{member.whatsapp}
{member.occupation}
{member.notes}
{member.address}
{member.district}
{member.regency}
{member.profilePhoto ? (
) : (
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 */}