// web/js/pages/manager/ManagerManualClaimModal.js // Modal untuk manager input klaim manual ketika user datang langsung (offline) const ManagerManualClaimModal = ({ isOpen, onClose, onSubmit, loading, item, }) => { const [users, setUsers] = React.useState([]); const [loadingUsers, setLoadingUsers] = React.useState(false); const [selectedUser, setSelectedUser] = React.useState(null); // State untuk input manual const [claimerName, setClaimerName] = React.useState(""); const [claimerContact, setClaimerContact] = React.useState(""); const [description, setDescription] = React.useState(""); const [managerNotes, setManagerNotes] = React.useState(""); // Load users when modal opens React.useEffect(() => { if (isOpen) { loadUsers(); resetForm(); } }, [isOpen]); const resetForm = () => { setSelectedUser(null); setClaimerName(""); setClaimerContact(""); setDescription(""); setManagerNotes(""); }; const loadUsers = async () => { try { setLoadingUsers(true); const token = localStorage.getItem("token"); const response = await fetch( `http://localhost:8080/api/manager/users?page=1&limit=1000`, { headers: { Authorization: `Bearer ${token}`, }, } ); if (response.ok) { const data = await response.json(); setUsers(data.data || []); } } catch (error) { console.error("Failed to load users:", error); } finally { setLoadingUsers(false); } }; const handleUserSelect = (e) => { const userId = e.target.value; if (!userId) { setSelectedUser(null); setClaimerName(""); setClaimerContact(""); return; } const user = users.find((u) => u.id === parseInt(userId)); if (user) { setSelectedUser(user); setClaimerName(user.name); setClaimerContact(user.phone || ""); } }; const handleSubmit = () => { // Validasi if (!claimerName || !claimerContact || !description) { alert("Nama pengklaim, kontak, dan deskripsi wajib diisi!"); return; } // Prepare data const formData = { item_id: item?.id, user_id: selectedUser?.id || null, claimer_name: claimerName, contact: claimerContact, description: description, manager_notes: managerNotes, }; onSubmit(formData); }; if (!isOpen) return null; return (
e.stopPropagation()} > {/* Header */}

🤝 Input Klaim Manual (Offline)

{/* Body */}
{/* Info Box */}
â„šī¸
Klaim Offline

Fitur ini untuk mencatat klaim yang disampaikan langsung oleh user kepada manager. Jika pengklaim memiliki akun, pilih di bawah. Jika tidak, isi data manual.

{/* Item Info */} {item && (
đŸ“Ļ Barang yang Diklaim:
Nama: {item.name}
Lokasi:{" "} {item.location}
Tanggal:{" "} {new Date(item.date_found).toLocaleDateString("id-ID")}
Status:{" "} {item.status}
)} {/* User Selection */}

Pilih jika pengklaim sudah punya akun. Jika belum, biarkan kosong dan isi manual.

{/* Selected User Info */} {selectedUser && (
✅ User Terpilih:
Nama:{" "} {selectedUser.name}
Email:{" "} {selectedUser.email}
NRP:{" "} {selectedUser.nrp}
Telepon:{" "} {selectedUser.phone || "-"}
)}

Detail Klaim

{/* Claimer Name */}
setClaimerName(e.target.value)} className="w-full px-4 py-3 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none" placeholder="Nama lengkap pengklaim" />

Otomatis terisi jika memilih user, atau isi manual

{/* Contact */}
setClaimerContact(e.target.value)} className="w-full px-4 py-3 bg-slate-700 border-2 border-slate-600 rounded-xl text-white placeholder-slate-400 focus:border-blue-500 focus:outline-none" placeholder="08123456789" />
{/* Description */}