import React, { useState, useEffect } from "react"; import API_BASE_URL from "../config.js"; import { getMaterials, createMaterial, deleteMaterial, } from "../helpers/materialHelpers"; import { createMaterialMutation, getMaterialMutations, } from "../helpers/materialMutationHelpers"; const MaterialList = ({ cafeId }) => { const [materials, setMaterials] = useState([]); const [mutations, setMutations] = useState([]); const [newMaterialName, setNewMaterialName] = useState(""); const [newMaterialUnit, setNewMaterialUnit] = useState("kilogram"); const [newMaterialImage, setNewMaterialImage] = useState(null); const [deleting, setDeleting] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); const [selectedMaterialId, setSelectedMaterialId] = useState(null); const [currentQuantity, setCurrentQuantity] = useState(0); const [quantityChange, setQuantityChange] = useState(0); useEffect(() => { const fetchMaterials = async () => { setLoading(true); try { const data = await getMaterials(cafeId); setMaterials(data); setError(null); if (data.length > 0 && !selectedMaterialId) { setSelectedMaterialId(data[0].materialId); } } catch (error) { console.error("Error fetching materials:", error); setError("Failed to fetch materials."); } }; const fetchMutations = async () => { try { const data = await getMaterialMutations(cafeId); setMutations(data); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchMaterials(); fetchMutations(); }, [cafeId]); useEffect(() => { if (selectedMaterialId) { const materialMutations = mutations.filter( (mutation) => mutation.materialId === selectedMaterialId ); if (materialMutations.length > 0) { const latestMutation = materialMutations.reduce( (latest, current) => new Date(current.timestamp) > new Date(latest.timestamp) ? current : latest, materialMutations[0] ); setCurrentQuantity(latestMutation.newStock); } else { setCurrentQuantity(0); // Default value if no mutations exist } } }, [selectedMaterialId, mutations]); const filteredMutations = selectedMaterialId ? mutations.filter((mutation) => mutation.materialId === selectedMaterialId) : []; const handleCreateMaterial = async (e) => { e.preventDefault(); setLoading(true); const formData = new FormData(); formData.append("name", newMaterialName); formData.append("unit", newMaterialUnit); if (newMaterialImage) { formData.append("image", newMaterialImage); } try { await createMaterial(cafeId, formData); setNewMaterialName(""); setNewMaterialUnit("kilogram"); setNewMaterialImage(null); setShowForm(false); const data = await getMaterials(cafeId); setMaterials(data); setError(null); if (data.length > 0) { setSelectedMaterialId(data[0].materialId); } } catch (error) { console.error("Error creating material:", error); setError("Failed to create material."); } finally { setLoading(false); } }; const handleDeleteMaterial = async (materialId) => { setDeleting(materialId); try { await deleteMaterial(materialId); const updatedMaterials = materials.filter( (material) => material.materialId !== materialId ); setMaterials(updatedMaterials); setError(null); if (selectedMaterialId === materialId) { setSelectedMaterialId( updatedMaterials.length > 0 ? updatedMaterials[0].materialId : null ); } } catch (error) { console.error("Error deleting material:", error); setError("Failed to delete material."); } finally { setDeleting(null); } }; const handlePrevious = () => { if (selectedMaterialId) { setQuantityChange(0); const currentIndex = materials.findIndex( (material) => material.materialId === selectedMaterialId ); if (currentIndex > 0) { setSelectedMaterialId(materials[currentIndex - 1].materialId); } } }; const handleNext = () => { if (selectedMaterialId) { setQuantityChange(0); const currentIndex = materials.findIndex( (material) => material.materialId === selectedMaterialId ); if (currentIndex < materials.length - 1) { setSelectedMaterialId(materials[currentIndex + 1].materialId); } } }; const handleQuantityChange = (change) => { setQuantityChange((prev) => prev + change); }; const handleUpdateStock = async () => { if (selectedMaterialId) { setLoading(true); try { const newStock = currentQuantity + quantityChange; const formData = new FormData(); formData.append("materialId", selectedMaterialId); formData.append("newStock", newStock); formData.append("reason", "Stock update"); await createMaterialMutation(cafeId, formData); setQuantityChange(0); const updatedMutations = await getMaterialMutations(cafeId); setMutations(updatedMutations); setCurrentQuantity(newStock); setError(null); } catch (error) { console.error("Error updating stock:", error); setError("Failed to update stock."); } finally { setLoading(false); } } }; const currentMaterial = materials.find( (material) => material.materialId === selectedMaterialId ); return (
{error}
} {loading &&Loading materials and mutations...
} {!loading && ( )}{currentMaterial.unit}
No materials available.
)}Details: {mutation.reason}
dari {mutation.oldStock}
ke {mutation.newStock}
No mutations available.
)}