Files
Dwinzo_Demo/app/src/components/layout/sidebarRight/properties/WallProperties.tsx

173 lines
5.1 KiB
TypeScript
Raw Normal View History

2025-06-10 15:28:23 +05:30
import { useEffect, useState } from "react";
import InputWithDropDown from "../../../ui/inputs/InputWithDropDown";
2025-06-10 15:28:23 +05:30
// Texture Imports
import defaultTexture from '../../../../assets/textures/floor/wall-tex.png';
import wallTexture1 from '../../../../assets/textures/floor/factory wall texture.jpg';
import { useBuilderStore } from "../../../../store/builder/useBuilderStore";
2025-06-10 15:28:23 +05:30
// Define Material type
type Material = {
texture: string;
textureName: string;
};
2025-06-23 09:37:53 +05:30
// Default and initial materials
2025-06-10 15:28:23 +05:30
const defaultMaterial: Material = {
texture: defaultTexture,
textureName: "Default Material",
};
2025-06-23 09:37:53 +05:30
const initialMaterial: Material = {
texture: wallTexture1,
textureName: "Grunge Concrete Wall",
};
2025-06-10 15:28:23 +05:30
const WallProperties = () => {
const { wallHeight, wallThickness, setWallHeight, setWallThickness } = useBuilderStore();
const [activeSide, setActiveSide] = useState<"side1" | "side2">("side1");
2025-06-23 09:37:53 +05:30
const [materials, setMaterials] = useState<Material[]>([
defaultMaterial,
initialMaterial,
]);
2025-06-10 15:28:23 +05:30
const [selectedMaterials, setSelectedMaterials] = useState<{
side1: Material | null;
side2: Material | null;
}>({
side1: null,
side2: null,
});
2025-06-23 09:37:53 +05:30
// Set default material initially for both sides
2025-06-10 15:28:23 +05:30
useEffect(() => {
setSelectedMaterials({
2025-06-23 09:37:53 +05:30
side1: defaultMaterial,
side2: defaultMaterial,
2025-06-10 15:28:23 +05:30
});
}, []);
const handleHeightChange = (newValue: string) => {
setWallHeight(parseFloat(newValue));
};
const handleThicknessChange = (newValue: string) => {
setWallThickness(parseFloat(newValue));
};
const handleSelectMaterial = (material: Material) => {
setSelectedMaterials((prev) => ({
...prev,
[activeSide]: material,
}));
};
return (
<div className="wall-properties-container">
<section className="wall-properties-section">
<div className="header">Wall</div>
<div className="wall-properties">
<InputWithDropDown
label="Height"
value={`${wallHeight}`}
onChange={(val) => handleHeightChange(val)}
/>
<InputWithDropDown
label="Thickness"
value={`${wallThickness}`}
onChange={(val) => handleThicknessChange(val)}
/>
</div>
</section>
2025-06-10 15:28:23 +05:30
<section>
<div className="header-wrapper">
<div className="header">Materials</div>
</div>
<div className="material-preview">
<div className="sides-wrapper">
2025-06-23 09:37:53 +05:30
<button
className={`side-wrapper ${activeSide === "side1" ? "active" : ""}`}
2025-06-10 15:28:23 +05:30
onClick={() => setActiveSide("side1")}
>
<div className="label">Side 1</div>
<div className="texture-image">
{selectedMaterials.side1 && (
<img
2025-06-23 09:37:53 +05:30
draggable={false}
2025-06-10 15:28:23 +05:30
src={selectedMaterials.side1.texture}
alt={selectedMaterials.side1.textureName}
/>
)}
</div>
2025-06-23 09:37:53 +05:30
</button>
2025-06-10 15:28:23 +05:30
2025-06-23 09:37:53 +05:30
<button
className={`side-wrapper ${activeSide === "side2" ? "active" : ""}`}
2025-06-10 15:28:23 +05:30
onClick={() => setActiveSide("side2")}
>
<div className="label">Side 2</div>
<div className="texture-image">
{selectedMaterials.side2 && (
<img
2025-06-23 09:37:53 +05:30
draggable={false}
2025-06-10 15:28:23 +05:30
src={selectedMaterials.side2.texture}
alt={selectedMaterials.side2.textureName}
/>
)}
</div>
2025-06-23 09:37:53 +05:30
</button>
2025-06-10 15:28:23 +05:30
</div>
<div className="preview">
{selectedMaterials[activeSide] && (
<img
2025-06-23 09:37:53 +05:30
draggable={false}
2025-06-10 15:28:23 +05:30
src={selectedMaterials[activeSide]!.texture}
alt={selectedMaterials[activeSide]!.textureName}
/>
)}
</div>
</div>
<div className="materials">
{materials.length === 0 ? (
<div className="no-materials">No materials added yet.</div>
) : (
<div className="material-container">
2025-06-23 09:37:53 +05:30
{materials.map((material, index) => {
const isSelected = selectedMaterials[activeSide]?.texture === material.texture;
return (
<button
className={`material-wrapper ${isSelected ? "selectedMaterial" : ""}`}
key={`${material.textureName}_${index}`}
onClick={() => handleSelectMaterial(material)}
2025-06-10 15:28:23 +05:30
>
2025-06-23 09:37:53 +05:30
<div className="material-property">
<div className="material-image">
<img
draggable={false}
src={material.texture}
alt={material.textureName}
/>
</div>
<div className="material-name">{material.textureName}</div>
</div>
</button>
);
})}
2025-06-10 15:28:23 +05:30
</div>
)}
</div>
</section>
</div>
);
};
export default WallProperties;