import { useEffect, useState } from "react"; import InputWithDropDown from "../../../../ui/inputs/InputWithDropDown"; import { AddIcon, RemoveIcon } from "../../../../icons/ExportCommonIcons"; // Texture Imports import wallTexture1 from "../../../../../assets/image/wallTextures/wallTexture.png"; import defaultTexture from "../../../../../assets/image/wallTextures/defaultTexture.jpg"; // Define Material type type Material = { texture: string; textureName: string; }; // Initial and default material const initialMaterial: Material = { texture: wallTexture1, textureName: "Grunge Concrete Wall", }; const defaultMaterial: Material = { texture: defaultTexture, textureName: "Default Material", }; const WallProperties = () => { const [wallProperties, setWallProperties] = useState({ height: "10", thickness: "10", length: "10", }); const [activeSide, setActiveSide] = useState<"side1" | "side2">("side1"); const [materials, setMaterials] = useState([initialMaterial]); const [selectedMaterials, setSelectedMaterials] = useState<{ side1: Material | null; side2: Material | null; }>({ side1: null, side2: null, }); // Select initial material for both sides on mount useEffect(() => { setSelectedMaterials({ side1: initialMaterial, side2: initialMaterial, }); }, []); const handleInputChange = ( key: keyof typeof wallProperties, newValue: string ) => { setWallProperties((prev) => ({ ...prev, [key]: newValue, })); }; const handleAddMaterial = () => { const newMaterial: Material = { texture: defaultMaterial.texture, textureName: `Material ${materials.length + 1}`, }; setMaterials([...materials, newMaterial]); }; const handleSelectMaterial = (material: Material) => { setSelectedMaterials((prev) => ({ ...prev, [activeSide]: material, })); }; const handleRemoveMaterial = (index: number) => { const updatedMaterials = materials.filter((_, i) => i !== index); // Ensure there's always at least one material const newMaterials = updatedMaterials.length === 0 ? [defaultMaterial] : updatedMaterials; setMaterials(newMaterials); // Deselect the material if it's the one removed setSelectedMaterials((prev) => { const updated = { ...prev }; ["side1", "side2"].forEach((side) => { if ( updated[side as "side1" | "side2"]?.texture === materials[index].texture ) { updated[side as "side1" | "side2"] = defaultMaterial; } }); return updated; }); }; return (
Wall
handleInputChange("height", val)} /> handleInputChange("thickness", val)} /> handleInputChange("length", val)} />
Materials
setActiveSide("side1")} >
Side 1
{selectedMaterials.side1 && ( {selectedMaterials.side1.textureName} )}
setActiveSide("side2")} >
Side 2
{selectedMaterials.side2 && ( {selectedMaterials.side2.textureName} )}
{selectedMaterials[activeSide] && ( {selectedMaterials[activeSide]!.textureName} )}
{materials.length === 0 ? (
No materials added yet.
) : (
{materials.map((material, index) => (
handleSelectMaterial(material)} >
{material.textureName}
{material.textureName}
{ e.stopPropagation(); handleRemoveMaterial(index); }} >
))}
)}
); }; export default WallProperties;