diff --git a/app/src/assets/floor/concreteFloorWorn001Diff2k.jpg b/app/src/assets/floor/concreteFloorWorn001Diff2k.jpg deleted file mode 100644 index f8ffbd3..0000000 Binary files a/app/src/assets/floor/concreteFloorWorn001Diff2k.jpg and /dev/null differ diff --git a/app/src/assets/floor/concreteFloorWorn001NorGl2k.jpg b/app/src/assets/floor/concreteFloorWorn001NorGl2k.jpg deleted file mode 100644 index 896b67f..0000000 Binary files a/app/src/assets/floor/concreteFloorWorn001NorGl2k.jpg and /dev/null differ diff --git a/app/src/assets/gltf-glb/arch.glb b/app/src/assets/gltf-glb/arch.glb deleted file mode 100644 index 52f44ef..0000000 Binary files a/app/src/assets/gltf-glb/arch.glb and /dev/null differ diff --git a/app/src/assets/gltf-glb/box.glb b/app/src/assets/gltf-glb/box.glb deleted file mode 100644 index 92ef9d8..0000000 Binary files a/app/src/assets/gltf-glb/box.glb and /dev/null differ diff --git a/app/src/assets/gltf-glb/crate_box.glb b/app/src/assets/gltf-glb/crate_box.glb deleted file mode 100644 index df4175b..0000000 Binary files a/app/src/assets/gltf-glb/crate_box.glb and /dev/null differ diff --git a/app/src/assets/gltf-glb/door.glb b/app/src/assets/gltf-glb/door.glb deleted file mode 100644 index f2a73e1..0000000 Binary files a/app/src/assets/gltf-glb/door.glb and /dev/null differ diff --git a/app/src/assets/gltf-glb/default.glb b/app/src/assets/gltf-glb/materials/default.glb similarity index 100% rename from app/src/assets/gltf-glb/default.glb rename to app/src/assets/gltf-glb/materials/default.glb diff --git a/app/src/assets/gltf-glb/material1.glb b/app/src/assets/gltf-glb/materials/material1.glb similarity index 100% rename from app/src/assets/gltf-glb/material1.glb rename to app/src/assets/gltf-glb/materials/material1.glb diff --git a/app/src/assets/gltf-glb/material2.glb b/app/src/assets/gltf-glb/materials/material2.glb similarity index 100% rename from app/src/assets/gltf-glb/material2.glb rename to app/src/assets/gltf-glb/materials/material2.glb diff --git a/app/src/assets/gltf-glb/material3.glb b/app/src/assets/gltf-glb/materials/material3.glb similarity index 100% rename from app/src/assets/gltf-glb/material3.glb rename to app/src/assets/gltf-glb/materials/material3.glb diff --git a/app/src/assets/gltf-glb/arm_ui_drop.glb b/app/src/assets/gltf-glb/ui/arm_ui_drop.glb similarity index 100% rename from app/src/assets/gltf-glb/arm_ui_drop.glb rename to app/src/assets/gltf-glb/ui/arm_ui_drop.glb diff --git a/app/src/assets/gltf-glb/arm_ui_pick.glb b/app/src/assets/gltf-glb/ui/arm_ui_pick.glb similarity index 100% rename from app/src/assets/gltf-glb/arm_ui_pick.glb rename to app/src/assets/gltf-glb/ui/arm_ui_pick.glb diff --git a/app/src/assets/gltf-glb/arrow_green.glb b/app/src/assets/gltf-glb/ui/arrow_green.glb similarity index 100% rename from app/src/assets/gltf-glb/arrow_green.glb rename to app/src/assets/gltf-glb/ui/arrow_green.glb diff --git a/app/src/assets/gltf-glb/arrow_red.glb b/app/src/assets/gltf-glb/ui/arrow_red.glb similarity index 100% rename from app/src/assets/gltf-glb/arrow_red.glb rename to app/src/assets/gltf-glb/ui/arrow_red.glb diff --git a/app/src/assets/gltf-glb/window.glb b/app/src/assets/gltf-glb/window.glb deleted file mode 100644 index 27ea80e..0000000 Binary files a/app/src/assets/gltf-glb/window.glb and /dev/null differ diff --git a/app/src/assets/hdr/mudroadpuresky2k.hdr b/app/src/assets/hdr/mudroadpuresky2k.hdr deleted file mode 100644 index 0a03764..0000000 Binary files a/app/src/assets/hdr/mudroadpuresky2k.hdr and /dev/null differ diff --git a/app/src/assets/orgTemp.png b/app/src/assets/image/orgTemp.png similarity index 100% rename from app/src/assets/orgTemp.png rename to app/src/assets/image/orgTemp.png diff --git a/app/src/components/layout/sidebarLeft/Assets.tsx b/app/src/components/layout/sidebarLeft/Assets.tsx index f9e4bb5..b23ce58 100644 --- a/app/src/components/layout/sidebarLeft/Assets.tsx +++ b/app/src/components/layout/sidebarLeft/Assets.tsx @@ -230,7 +230,7 @@ const Assets: React.FC = () => { (asset) => asset.category === category ); return ( - + ); })} diff --git a/app/src/components/layout/sidebarRight/Header.tsx b/app/src/components/layout/sidebarRight/Header.tsx index c7c3070..9bfa4df 100644 --- a/app/src/components/layout/sidebarRight/Header.tsx +++ b/app/src/components/layout/sidebarRight/Header.tsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import orgImg from "../../../assets/orgTemp.png"; +import orgImg from "../../../assets/image/orgTemp.png"; import { useActiveUsers, useCamMode } from "../../../store/store"; import { ActiveUser } from "../../../types/users"; import CollaborationPopup from "../../templates/CollaborationPopup"; diff --git a/app/src/components/ui/Tools.tsx b/app/src/components/ui/Tools.tsx index c90edcf..b9d98f4 100644 --- a/app/src/components/ui/Tools.tsx +++ b/app/src/components/ui/Tools.tsx @@ -38,450 +38,360 @@ import { useFloatingWidget, } from "../../store/visualization/useDroppedObjectsStore"; -const Tools: React.FC = () => { - const { templates } = useTemplateStore(); - const { activeSubTool, setActiveSubTool } = useActiveSubTool(); - const { toggleThreeD, setToggleThreeD } = useThreeDStore(); - const { setToggleUI } = useToggleStore(); +// Utility component +const ToolButton = ({ icon: Icon, active, onClick, tooltip }: any) => ( + +); - const dropdownRef = useRef(null); - const [openDrop, setOpenDrop] = useState(false); - const { visualizationSocket } = useSocketStore(); +const Tools: React.FC = () => { const { activeModule } = useModuleStore(); + const { toggleThreeD, setToggleThreeD } = useThreeDStore(); const { isPlaying, setIsPlaying } = usePlayButtonStore(); - const { addTemplate } = useTemplateStore(); + + const { + activeTool, + setActiveTool, + setToolMode, + setAddAction, + setDeleteTool, + setDeletePointOrLine, + setTransformMode, + } = useStoreHooks(); + + const { setActiveSubTool, activeSubTool } = useActiveSubTool(); + const { setSelectedWallItem } = useSelectedWallItem(); + const { setRefTextUpdate } = useRefTextUpdate(); + const { setToggleUI } = useToggleStore(); + const { setToggleView, toggleView } = useToggleView(); + + const { addTemplate, templates } = useTemplateStore(); const { selectedZone } = useSelectedZoneStore(); const { floatingWidget } = useFloatingWidget(); - const { widgets3D } = use3DWidget(); + const { visualizationSocket } = useSocketStore(); - // wall options - const { toggleView, setToggleView } = useToggleView(); - const { setDeleteTool } = useDeleteTool(); - const { setAddAction } = useAddAction(); - const { setSelectedWallItem } = useSelectedWallItem(); + const dropdownRef = useRef(null); + const [openDrop, setOpenDrop] = useState(false); - const { setTransformMode } = useTransformMode(); - const { setDeletePointOrLine } = useDeletePointOrLine(); - const { setToolMode } = useToolMode(); - const { activeTool, setActiveTool } = useActiveTool(); - const { setRefTextUpdate } = useRefTextUpdate(); - - // Reset activeTool whenever activeModule changes + // 1. Set UI toggles on initial render useEffect(() => { setToggleUI( - localStorage.getItem("navBarUiLeft") - ? localStorage.getItem("navBarUiLeft") === "true" - : true, - localStorage.getItem("navBarUiRight") - ? localStorage.getItem("navBarUiRight") === "true" - : true + localStorage.getItem("navBarUiLeft") !== "false", + localStorage.getItem("navBarUiRight") !== "false" ); + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // 2. Update tool based on subtool and module useEffect(() => { setActiveTool(activeSubTool); setActiveSubTool(activeSubTool); + // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeModule]); - const toggleSwitch = () => { - if (toggleThreeD) { - setSelectedWallItem(null); - setDeleteTool(false); - setAddAction(null); - setToggleView(true); - // localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD)); - } else { - setToggleView(false); - } - setToggleUI( - localStorage.getItem("navBarUiLeft") - ? localStorage.getItem("navBarUiLeft") === "true" - : true, - localStorage.getItem("navBarUiRight") - ? localStorage.getItem("navBarUiRight") === "true" - : true - ); - setToggleThreeD(!toggleThreeD); - setActiveSubTool("cursor"); - setActiveTool("cursor"); - }; - + // 3. Update tools behavior based on selected tool and view mode useEffect(() => { - const handleOutsideClick = (event: MouseEvent) => { + resetTools(); + updateToolBehavior(activeTool, toggleView); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [activeTool, toggleView]); + + // 4. Dropdown auto-close + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { if ( dropdownRef.current && - !dropdownRef.current.contains(event.target as Node) + !dropdownRef.current.contains(e.target as Node) ) { - setOpenDrop(false); // Close the dropdown + setOpenDrop(false); } }; - document.addEventListener("mousedown", handleOutsideClick); - - return () => { - document.removeEventListener("mousedown", handleOutsideClick); - }; + document.addEventListener("mousedown", handleClickOutside); + return () => document.removeEventListener("mousedown", handleClickOutside); }, []); - useEffect(() => { - if (!toggleThreeD) { - setToggleUI(false, false); - } - }, [toggleThreeD]); - useEffect(() => { + const resetTools = () => { setToolMode(null); setDeleteTool(false); setAddAction(null); setTransformMode(null); setDeletePointOrLine(false); - setRefTextUpdate((prevUpdate) => prevUpdate - 1); + setRefTextUpdate((prev) => prev - 1); + }; - switch (activeTool) { + const updateToolBehavior = (tool: string, is2D: boolean) => { + switch (tool) { case "cursor": - if (toggleView) { - setToolMode("move"); - } else { - setTransformMode("translate"); - } + is2D ? setToolMode("move") : setTransformMode("translate"); break; - case "Rotate": - if (!toggleView) { - setTransformMode("rotate"); - } + if (!is2D) setTransformMode("rotate"); break; - case "Scale": - if (!toggleView) { - setTransformMode("scale"); - } + if (!is2D) setTransformMode("scale"); break; - case "draw-wall": - if (toggleView) { - setToolMode("Wall"); - } + is2D && setToolMode("Wall"); break; - case "draw-aisle": - if (toggleView) { - setToolMode("Aisle"); - } + is2D && setToolMode("Aisle"); break; - case "draw-zone": - if (toggleView) { - setToolMode("Zone"); - } + is2D && setToolMode("Zone"); break; - case "draw-floor": - if (toggleView) { - setToolMode("Floor"); - } + is2D && setToolMode("Floor"); break; - case "measure": setToolMode("MeasurementScale"); break; - case "Add pillar": - if (!toggleView) { - setAddAction("pillar"); - } + if (!is2D) setAddAction("pillar"); break; - case "delete": - if (toggleView) { - setDeletePointOrLine(true); - } else { - setDeleteTool(true); - } - break; - - default: + is2D ? setDeletePointOrLine(true) : setDeleteTool(true); break; } + }; - setActiveTool(activeTool); - }, [activeTool, toggleView]); + const toggle2D3D = () => { + setToggleThreeD(!toggleThreeD); + setToggleUI( + localStorage.getItem("navBarUiLeft") !== "false", + localStorage.getItem("navBarUiRight") !== "false" + ); + setSelectedWallItem(null); + setActiveSubTool("cursor"); + setActiveTool("cursor"); + setToggleView(!toggleThreeD); + }; + + if (isPlaying && activeModule !== "simulation") { + return ( + + ); + } + + const renderBuilderTools = () => ( + <> + {!toggleThreeD && ( +
+ setActiveTool("draw-wall")} + /> + setActiveTool("draw-zone")} + /> + setActiveTool("draw-aisle")} + /> + setActiveTool("draw-floor")} + /> +
+ )} +
+ setActiveTool("measure")} + /> +
+ + ); + + const renderSimulationTools = () => ( +
+ setActiveTool("pen")} + /> +
+ ); + + const renderVisualizationTools = () => ( +
+ + handleSaveTemplate({ + addTemplate, + floatingWidget, + widgets3D, + selectedZone, + templates, + visualizationSocket, + }) + } + /> +
+ ); + + const renderModeSwitcher = () => ( + + ); + + const getIconByTool = (tool: string) => { + switch (tool) { + case "cursor": + return CursorIcon; + case "free-hand": + return FreeMoveIcon; + case "delete": + return DeleteIcon; + default: + return CursorIcon; + } + }; + + const getTooltipShortcut = (tool: string) => { + switch (tool) { + case "cursor": + return "v"; + case "free-hand": + return "h"; + case "delete": + return "x"; + default: + return ""; + } + }; + + const getIconComponent = (option: string) => { + switch (option) { + case "cursor": + return ; + case "free-hand": + return ; + case "delete": + return ; + default: + return null; + } + }; return ( - <> - {!isPlaying ? ( -
-
-
- {activeSubTool == "cursor" && ( -
{ - setActiveTool("cursor"); - }} - > -
cursor (v)
- -
- )} - {activeSubTool == "free-hand" && ( -
{ - setActiveTool("free-hand"); - }} - > -
free hand (h)
- -
- )} - {activeSubTool == "delete" && ( -
{ - setActiveTool("delete"); - }} - > -
delete (x)
- -
- )} - {activeModule !== "visualization" && ( -
{ - setOpenDrop(!openDrop); - }} - > - - {openDrop && ( -
-
{ - setOpenDrop(false); - setActiveTool("cursor"); - setActiveSubTool("cursor"); - }} - > -
- {activeSubTool === "cursor" && } -
- -
Cursor
-
-
{ - setOpenDrop(false); - setActiveTool("free-hand"); - setActiveSubTool("free-hand"); - }} - > -
- {activeSubTool === "free-hand" && } -
- -
Free Hand
-
-
{ - setOpenDrop(false); - setActiveTool("delete"); - setActiveSubTool("delete"); - }} - > -
- {activeSubTool === "delete" && } -
- -
Delete
-
+
+
+ {/* Tool Picker (cursor, delete, etc.) */} + {["cursor", "free-hand", "delete"].map( + (tool) => + activeSubTool === tool && ( + setActiveTool(tool)} + /> + ) + )} + {/* Dropdown Menu */} + {activeModule !== "visualization" && ( +
- )} -
-
- {!toggleThreeD && activeModule === "builder" && ( - <> -
-
-
{ - setActiveTool("draw-wall"); - }} - > -
draw wall (q)
- -
-
{ - setActiveTool("draw-zone"); - }} - > -
draw zone (e)
- -
-
{ - setActiveTool("draw-aisle"); - }} - > -
draw asile (r)
- -
-
{ - setActiveTool("draw-floor"); - }} - > -
draw floor (t)
- -
-
- - )} - {activeModule === "builder" && ( - <> -
-
-
{ - setActiveTool("measure"); - }} - > -
measure scale (m)
- -
-
- - )} - {activeModule === "simulation" && ( - <> -
-
-
{ - setActiveTool("pen"); - }} - > -
pen
- -
-
- - )} - {activeModule === "visualization" && ( - <> -
-
-
{ - handleSaveTemplate({ - addTemplate, - floatingWidget, - widgets3D, - selectedZone, - templates, - visualizationSocket, - }); - }} - > -
save template
- -
-
- - )} -
-
-
{ - setActiveTool("comment"); - }} - > -
comment
- -
- {toggleThreeD && ( -
{ - setIsPlaying(!isPlaying); - }} - > -
play (ctrl + p)
- + {getIconComponent(option)} +
{option}
+ + ))}
)} -
- {activeModule === "builder" && ( - <> -
-
-
toggle view (tab)
-
- 2d -
-
- 3d -
-
- - )} -
- ) : ( + + )} +
+ +
+ {activeModule === "builder" && renderBuilderTools()} + {activeModule === "simulation" && renderSimulationTools()} + {activeModule === "visualization" && renderVisualizationTools()} + +
+
+ setActiveTool("comment")} + /> + {toggleThreeD && ( + setIsPlaying(!isPlaying)} + /> + )} +
+ + {activeModule === "builder" && ( <> - {activeModule !== "simulation" && ( - - )} +
+ {renderModeSwitcher()} )} - +
); }; +// Extracted common store logic +const useStoreHooks = () => { + return { + ...useActiveTool(), + ...useToolMode(), + ...useDeleteTool(), + ...useAddAction(), + ...useTransformMode(), + ...useDeletePointOrLine(), + ...useRefTextUpdate(), + }; +}; + export default Tools; diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx index dfae129..4c8b1d7 100644 --- a/app/src/modules/builder/builder.tsx +++ b/app/src/modules/builder/builder.tsx @@ -11,9 +11,9 @@ import ReferenceDistanceText from "./geomentries/lines/distanceText/referenceDis ////////// Assests Imports ////////// -import arch from "../../assets/gltf-glb/arch.glb"; -import door from "../../assets/gltf-glb/door.glb"; -import Window from "../../assets/gltf-glb/window.glb"; +// import arch from "../../assets/gltf-glb/arch.glb"; +// import door from "../../assets/gltf-glb/door.glb"; +// import Window from "../../assets/gltf-glb/window.glb"; ////////// Zustand State Imports ////////// @@ -129,30 +129,30 @@ export default function Builder() { ////////// Assest Configuration Values ////////// const AssetConfigurations: Types.AssetConfigurations = { - arch: { - modelUrl: arch, - scale: [0.75, 0.75, 0.75], - csgscale: [2, 4, 0.5], - csgposition: [0, 2, 0], - positionY: () => 0, - type: "Fixed-Move", - }, - door: { - modelUrl: door, - scale: [0.75, 0.75, 0.75], - csgscale: [2, 4, 0.5], - csgposition: [0, 2, 0], - positionY: () => 0, - type: "Fixed-Move", - }, - window: { - modelUrl: Window, - scale: [0.75, 0.75, 0.75], - csgscale: [5, 3, 0.5], - csgposition: [0, 1.5, 0], - positionY: (intersectionPoint) => intersectionPoint.point.y, - type: "Free-Move", - }, + // arch: { + // modelUrl: arch, + // scale: [0.75, 0.75, 0.75], + // csgscale: [2, 4, 0.5], + // csgposition: [0, 2, 0], + // positionY: () => 0, + // type: "Fixed-Move", + // }, + // door: { + // modelUrl: door, + // scale: [0.75, 0.75, 0.75], + // csgscale: [2, 4, 0.5], + // csgposition: [0, 2, 0], + // positionY: () => 0, + // type: "Fixed-Move", + // }, + // window: { + // modelUrl: Window, + // scale: [0.75, 0.75, 0.75], + // csgscale: [5, 3, 0.5], + // csgposition: [0, 1.5, 0], + // positionY: (intersectionPoint) => intersectionPoint.point.y, + // type: "Free-Move", + // }, }; ////////// All Toggle's ////////// diff --git a/app/src/modules/market/AssetPreview.tsx b/app/src/modules/market/AssetPreview.tsx index a53a60d..aa037e2 100644 --- a/app/src/modules/market/AssetPreview.tsx +++ b/app/src/modules/market/AssetPreview.tsx @@ -1,7 +1,6 @@ -import React, { Suspense, useEffect } from "react"; -import assetImage from "../../assets/image/image.png"; +import React, { Suspense } from "react"; import { FilledStarsIconSmall } from "../../components/icons/marketPlaceIcons"; -import { Canvas, useThree } from "@react-three/fiber"; +import { Canvas } from "@react-three/fiber"; import { ContactShadows, OrbitControls, Text } from "@react-three/drei"; import GltfLoader from "./GltfLoader"; import * as THREE from "three"; @@ -14,17 +13,26 @@ interface SelectedCard { rating: number; views: number; description: string; + AssetID: string; } // Define the props type for AssetPreview interface AssetPreviewProps { selectedCard: SelectedCard; + modelUrl: string; setSelectedCard: React.Dispatch>; // Type for setter function } +const savedTheme: string | null = localStorage.getItem("theme"); + function Ui() { return ( - + Loading preview... ); @@ -33,16 +41,8 @@ function Ui() { const AssetPreview: React.FC = ({ selectedCard, setSelectedCard, + modelUrl, }) => { - // Ensure rating is a valid number between 0 and 5 - const rating = Math.max( - 0, - Math.min(5, isNaN(selectedCard.rating) ? 0 : selectedCard.rating) - ); - - // Ensure that the rating is a valid positive integer for array length - const starsArray = Array.from({ length: rating }, (_, index) => index); - return (
@@ -53,18 +53,19 @@ const AssetPreview: React.FC = ({ { - scene.background = new THREE.Color(0xffffff); + scene.background = new THREE.Color( + savedTheme === "dark" ? 0x19191d : 0xfcfdfd + ); }} > }> - {selectedCard.assetName && ( - + {selectedCard.assetName && modelUrl && ( + )} = ({
{/* close button */} -
setSelectedCard(null)}> +
+
diff --git a/app/src/modules/market/Card.tsx b/app/src/modules/market/Card.tsx index a7010cc..e192c17 100644 --- a/app/src/modules/market/Card.tsx +++ b/app/src/modules/market/Card.tsx @@ -1,15 +1,12 @@ -import React, { useEffect } from "react"; +import React from "react"; import { CommentsIcon, - DownloadIcon, EyeIconBig, FilledStarsIconSmall, StarsIconSmall, VerifiedIcon, } from "../../components/icons/marketPlaceIcons"; -import assetImage from "../../assets/image/image.png"; -import { getAssetDownload } from "../../services/marketplace/getAssetDownload"; interface CardProps { assetName: string; @@ -19,6 +16,7 @@ interface CardProps { views: number; image: string; description: string; + AssetID: string; onSelectCard: (cardData: { assetName: string; uploadedOn: number; @@ -26,6 +24,7 @@ interface CardProps { rating: number; views: number; description: string; + AssetID: string; }) => void; } @@ -38,9 +37,18 @@ const Card: React.FC = ({ image, description, onSelectCard, + AssetID, }) => { const handleCardSelect = () => { - onSelectCard({ assetName, uploadedOn, price, rating, views, description }); + onSelectCard({ + assetName, + uploadedOn, + price, + rating, + views, + description, + AssetID, + }); }; return ( @@ -81,22 +89,22 @@ const Card: React.FC = ({
{[...Array(5)].map((_, index) => ( - <> + {index < 3 ? ( - + ) : ( - + )} - + ))}
₹ {price}/unit
-
+
+ ); }; diff --git a/app/src/modules/market/CardsContainer.tsx b/app/src/modules/market/CardsContainer.tsx index eabcbe4..684fc1d 100644 --- a/app/src/modules/market/CardsContainer.tsx +++ b/app/src/modules/market/CardsContainer.tsx @@ -1,6 +1,7 @@ -import React, { useEffect, useState } from "react"; +import React, { useState } from "react"; import Card from "./Card"; import AssetPreview from "./AssetPreview"; +import { fetchGltfUrl } from "../../services/marketplace/fetchGltfUrl"; interface ModelData { CreatedBy: string; @@ -15,12 +16,14 @@ interface ModelData { uploadDate: number; _id: string; price: number; + AssetID: string; } interface ModelsProps { models: ModelData[]; } const CardsContainer: React.FC = ({ models }) => { + const [modelUrl, setModelUrl] = useState(""); const [selectedCard, setSelectedCard] = useState<{ assetName: string; uploadedOn: number; @@ -28,19 +31,23 @@ const CardsContainer: React.FC = ({ models }) => { rating: number; views: number; description: string; + AssetID: string; } | null>(null); - const handleCardSelect = (cardData: { + const handleCardSelect = async (cardData: { assetName: string; uploadedOn: number; price: number; rating: number; views: number; description: string; + AssetID: string; }) => { setSelectedCard(cardData); + const res = await fetchGltfUrl(cardData.assetName, cardData.AssetID); + console.log("res: ", res); + setModelUrl(res.url); }; - return (
@@ -48,23 +55,26 @@ const CardsContainer: React.FC = ({ models }) => {
{models.length > 0 && models.map((assetDetail) => ( - + + + ))} {/* */} {selectedCard && ( )} {/* */} diff --git a/app/src/modules/market/FilterSearch.tsx b/app/src/modules/market/FilterSearch.tsx index 20882c9..e860b44 100644 --- a/app/src/modules/market/FilterSearch.tsx +++ b/app/src/modules/market/FilterSearch.tsx @@ -16,6 +16,7 @@ interface ModelData { uploadDate: number; _id: string; price: number; + AssetID: string; } interface ModelsProps { @@ -44,7 +45,7 @@ const FilterSearch: React.FC = ({ const descending = [...models].sort((a, b) => b.filename.localeCompare(a.filename)); setModels(descending); } - }, [activeOption]); + }, [activeOption, models, setModels]); const handleSearch = (val: string) => { const filteredModel = filteredModels.filter((model) => @@ -73,13 +74,13 @@ const FilterSearch: React.FC = ({
Rating
{[0, 1, 2, 3, 4].map((i) => ( -
handleStarClick(i)} className={`star-wrapper ${i < rating ? "filled" : "empty"}`} > -
+ ))}
diff --git a/app/src/modules/market/GltfLoader.tsx b/app/src/modules/market/GltfLoader.tsx index 2431af2..cfec06d 100644 --- a/app/src/modules/market/GltfLoader.tsx +++ b/app/src/modules/market/GltfLoader.tsx @@ -3,7 +3,6 @@ import { useFrame } from "@react-three/fiber"; import { Stage, useGLTF } from "@react-three/drei"; import { AnimationMixer, AnimationAction, Object3D } from "three"; import * as THREE from "three"; -import { fetchGltfUrl } from "../../services/marketplace/fetchGltfUrl"; interface GltfLoaderProps { glbdata?: boolean; @@ -13,7 +12,6 @@ interface GltfLoaderProps { setSelectedAnimation?: (animation: string) => void; } -// const getGLTFUrl = (url: string) => url; // Placeholder for your actual function const GltfLoader: React.FC = ({ glbdata, @@ -21,12 +19,10 @@ const GltfLoader: React.FC = ({ setAnimations, selectedAnimation, }) => { - const modelUrl: any = fromServer ? fetchGltfUrl(fromServer) : glbdata; - const { scene, animations } = useGLTF(modelUrl ?? "") as { + const { scene, animations } = useGLTF(fromServer ?? "") as { scene: Object3D; animations: THREE.AnimationClip[]; }; - const mixer = useRef( scene ? new AnimationMixer(scene) : null ); diff --git a/app/src/modules/market/MarketPlace.tsx b/app/src/modules/market/MarketPlace.tsx index 3b4b87c..c76baa3 100644 --- a/app/src/modules/market/MarketPlace.tsx +++ b/app/src/modules/market/MarketPlace.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from "react"; import FilterSearch from "./FilterSearch"; import CardsContainer from "./CardsContainer"; -import { fetchAssets } from "../../services/marketplace/fetchAssets"; import { getAssetImages } from "../../services/factoryBuilder/assest/assets/getAssetImages"; import SkeletonUI from "../../components/templates/SkeletonUI"; interface ModelData { @@ -17,6 +16,7 @@ interface ModelData { uploadDate: number; _id: string; price: number; + AssetID: string; } const MarketPlace = () => { const [models, setModels] = useState([]); diff --git a/app/src/modules/scene/setup/setup.tsx b/app/src/modules/scene/setup/setup.tsx index 34289f9..660264b 100644 --- a/app/src/modules/scene/setup/setup.tsx +++ b/app/src/modules/scene/setup/setup.tsx @@ -4,7 +4,7 @@ import PostProcessing from '../postProcessing/postProcessing' import Controls from '../controls/controls'; import { Environment } from '@react-three/drei' -import background from "../../../assets/hdr/mudroadpuresky2k.hdr"; +import background from "../../../assets/textures/hdr/mudroadpuresky2k.hdr"; function Setup() { return ( diff --git a/app/src/modules/simulation/actions/conveyor/actionHandler/useDefaultHandler.ts b/app/src/modules/simulation/actions/conveyor/actionHandler/useDefaultHandler.ts index 2b48a25..ef8160e 100644 --- a/app/src/modules/simulation/actions/conveyor/actionHandler/useDefaultHandler.ts +++ b/app/src/modules/simulation/actions/conveyor/actionHandler/useDefaultHandler.ts @@ -14,7 +14,7 @@ export function useDefaultHandler() { const material = getMaterialById(materialId); if (!material) return; - defaultLogStatus(material.materialId, `performed Default action`); + defaultLogStatus(material.materialName, `performed Default action`); }, [getMaterialById]); diff --git a/app/src/modules/simulation/actions/conveyor/actionHandler/useDespawnHandler.ts b/app/src/modules/simulation/actions/conveyor/actionHandler/useDespawnHandler.ts index 5136e51..9364d70 100644 --- a/app/src/modules/simulation/actions/conveyor/actionHandler/useDespawnHandler.ts +++ b/app/src/modules/simulation/actions/conveyor/actionHandler/useDespawnHandler.ts @@ -16,7 +16,7 @@ export function useDespawnHandler() { removeMaterial(material.materialId); - deSpawnLogStatus(material.materialId, `Despawned`); + deSpawnLogStatus(material.materialName, `Despawned`); }, [getMaterialById, removeMaterial]); diff --git a/app/src/modules/simulation/actions/conveyor/actionHandler/useSpawnHandler.ts b/app/src/modules/simulation/actions/conveyor/actionHandler/useSpawnHandler.ts index 544dc06..c4f9e6f 100644 --- a/app/src/modules/simulation/actions/conveyor/actionHandler/useSpawnHandler.ts +++ b/app/src/modules/simulation/actions/conveyor/actionHandler/useSpawnHandler.ts @@ -142,7 +142,7 @@ export function useSpawnHandler() { if (elapsed >= adjustedInterval) { const createdMaterial = createNewMaterial(material, action); if (createdMaterial) { - spawnLogStatus(createdMaterial.materialId, `[${elapsed.toFixed(2)}ms] Spawned ${material} (1/${totalCount})`); + spawnLogStatus(createdMaterial.materialName, `[${elapsed.toFixed(2)}ms] Spawned ${material} (1/${totalCount})`); } spawn.lastSpawnTime = currentTime; spawn.spawnCount = 1; @@ -162,7 +162,7 @@ export function useSpawnHandler() { const count = spawn.spawnCount + 1; const createdMaterial = createNewMaterial(material, action); if (createdMaterial) { - spawnLogStatus(createdMaterial.materialId, `[${timeSinceLast.toFixed(2)}ms] Spawned ${material} (${count}/${totalCount})`); + spawnLogStatus(createdMaterial.materialName, `[${timeSinceLast.toFixed(2)}ms] Spawned ${material} (${count}/${totalCount})`); } spawn.lastSpawnTime = currentTime; spawn.spawnCount = count; diff --git a/app/src/modules/simulation/actions/conveyor/actionHandler/useSwapHandler.ts b/app/src/modules/simulation/actions/conveyor/actionHandler/useSwapHandler.ts index 59de9b6..0f9af26 100644 --- a/app/src/modules/simulation/actions/conveyor/actionHandler/useSwapHandler.ts +++ b/app/src/modules/simulation/actions/conveyor/actionHandler/useSwapHandler.ts @@ -16,7 +16,7 @@ export function useSwapHandler() { if (!material) return; setMaterial(material.materialId, newMaterialType); - swapLogStatus(material.materialId, `Swapped to ${newMaterialType}`); + swapLogStatus(material.materialName, `Swapped to ${newMaterialType}`); }, [getMaterialById, setMaterial]); diff --git a/app/src/modules/simulation/actions/machine/actionHandler/useProcessHandler.ts b/app/src/modules/simulation/actions/machine/actionHandler/useProcessHandler.ts index 8cb07fb..cfd0c5a 100644 --- a/app/src/modules/simulation/actions/machine/actionHandler/useProcessHandler.ts +++ b/app/src/modules/simulation/actions/machine/actionHandler/useProcessHandler.ts @@ -29,8 +29,8 @@ export function useProcessHandler() { addCurrentAction(modelUuid, action.actionUuid, newMaterialType, material.materialId); - processLogStatus(material.materialId, `Swapped to ${newMaterialType}`); - processLogStatus(material.materialId, `starts Process action`); + processLogStatus(material.materialName, `Swapped to ${newMaterialType}`); + processLogStatus(material.materialName, `starts Process action`); }, [getMaterialById]); diff --git a/app/src/modules/simulation/actions/roboticArm/actionHandler/usePickAndPlaceHandler.ts b/app/src/modules/simulation/actions/roboticArm/actionHandler/usePickAndPlaceHandler.ts index d880ae0..b134d78 100644 --- a/app/src/modules/simulation/actions/roboticArm/actionHandler/usePickAndPlaceHandler.ts +++ b/app/src/modules/simulation/actions/roboticArm/actionHandler/usePickAndPlaceHandler.ts @@ -31,7 +31,7 @@ export function usePickAndPlaceHandler() { material.materialId ); - pickAndPlaceLogStatus(material.materialId, `is going to be picked by armBot ${modelUuid}`); + pickAndPlaceLogStatus(material.materialName, `is going to be picked by armBot ${modelUuid}`); }, [getMaterialById, getModelUuidByActionUuid, selectedProduct.productId, addCurrentAction]); diff --git a/app/src/modules/simulation/actions/storageUnit/actionHandler/useStoreHandler.ts b/app/src/modules/simulation/actions/storageUnit/actionHandler/useStoreHandler.ts index beb3d79..2b0e990 100644 --- a/app/src/modules/simulation/actions/storageUnit/actionHandler/useStoreHandler.ts +++ b/app/src/modules/simulation/actions/storageUnit/actionHandler/useStoreHandler.ts @@ -27,7 +27,7 @@ export function useStoreHandler() { addCurrentMaterial(modelUuid, material.materialType, material.materialId); updateCurrentLoad(modelUuid, 1); - storeLogStatus(material.materialId, `performed Store action`); + storeLogStatus(material.materialName, `performed Store action`); }, [getMaterialById]); diff --git a/app/src/modules/simulation/actions/vehicle/actionHandler/useTravelHandler.ts b/app/src/modules/simulation/actions/vehicle/actionHandler/useTravelHandler.ts index af7793c..c661883 100644 --- a/app/src/modules/simulation/actions/vehicle/actionHandler/useTravelHandler.ts +++ b/app/src/modules/simulation/actions/vehicle/actionHandler/useTravelHandler.ts @@ -27,7 +27,7 @@ export function useTravelHandler() { incrementVehicleLoad(modelUuid, 1); addCurrentMaterial(modelUuid, material.materialType, material.materialId); - travelLogStatus(material.materialId, `is triggering travel from ${modelUuid}`); + travelLogStatus(material.materialName, `is triggering travel from ${modelUuid}`); }, [addCurrentMaterial, getMaterialById, getModelUuidByActionUuid, incrementVehicleLoad, selectedProduct.productId]); diff --git a/app/src/modules/simulation/materials/instances/material/materialModel.tsx b/app/src/modules/simulation/materials/instances/material/materialModel.tsx index 244c7bf..d8f5fe9 100644 --- a/app/src/modules/simulation/materials/instances/material/materialModel.tsx +++ b/app/src/modules/simulation/materials/instances/material/materialModel.tsx @@ -2,10 +2,10 @@ import { useGLTF } from '@react-three/drei' import { useMemo } from 'react'; import * as THREE from 'three'; -import defaultMaterial from '../../../../../assets/gltf-glb/default.glb'; -import material1 from '../../../../../assets/gltf-glb/material1.glb'; -import material2 from '../../../../../assets/gltf-glb/material2.glb'; -import material3 from '../../../../../assets/gltf-glb/material3.glb'; +import defaultMaterial from '../../../../../assets/gltf-glb/materials/default.glb'; +import material1 from '../../../../../assets/gltf-glb/materials/material1.glb'; +import material2 from '../../../../../assets/gltf-glb/materials/material2.glb'; +import material3 from '../../../../../assets/gltf-glb/materials/material3.glb'; const modelPaths: Record = { 'Default material': defaultMaterial, diff --git a/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx b/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx index 55e511a..3bc2a92 100644 --- a/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx +++ b/app/src/modules/simulation/spatialUI/arm/armBotUI.tsx @@ -8,8 +8,8 @@ import PickDropPoints from './PickDropPoints'; import useDraggableGLTF from './useDraggableGLTF'; import * as THREE from 'three'; -import armPick from "../../../../assets/gltf-glb/arm_ui_pick.glb"; -import armDrop from "../../../../assets/gltf-glb/arm_ui_drop.glb"; +import armPick from "../../../../assets/gltf-glb/ui/arm_ui_pick.glb"; +import armDrop from "../../../../assets/gltf-glb/ui/arm_ui_drop.glb"; import { upsertProductOrEventApi } from '../../../../services/simulation/UpsertProductOrEventApi'; type Positions = { diff --git a/app/src/modules/simulation/spatialUI/vehicle/vehicleUI.tsx b/app/src/modules/simulation/spatialUI/vehicle/vehicleUI.tsx index bb690d4..300c55c 100644 --- a/app/src/modules/simulation/spatialUI/vehicle/vehicleUI.tsx +++ b/app/src/modules/simulation/spatialUI/vehicle/vehicleUI.tsx @@ -1,7 +1,5 @@ import { useEffect, useRef, useState } from "react"; import * as Types from "../../../../types/world/worldTypes"; -import startPoint from "../../../../assets/gltf-glb/arrow_green.glb"; -import startEnd from "../../../../assets/gltf-glb/arrow_red.glb"; import { useGLTF } from "@react-three/drei"; import { useFrame, useThree } from "@react-three/fiber"; import { @@ -15,6 +13,9 @@ import { useProductStore } from "../../../../store/simulation/useProductStore"; import { upsertProductOrEventApi } from "../../../../services/simulation/UpsertProductOrEventApi"; import { DoubleSide, Group, Plane, Vector3 } from "three"; +import startPoint from "../../../../assets/gltf-glb/ui/arrow_green.glb"; +import startEnd from "../../../../assets/gltf-glb/ui/arrow_red.glb"; + const VehicleUI = () => { const { scene: startScene } = useGLTF(startPoint) as any; const { scene: endScene } = useGLTF(startEnd) as any; diff --git a/app/src/services/marketplace/fetchGltfUrl.ts b/app/src/services/marketplace/fetchGltfUrl.ts index 3916c9e..2f52887 100644 --- a/app/src/services/marketplace/fetchGltfUrl.ts +++ b/app/src/services/marketplace/fetchGltfUrl.ts @@ -1,7 +1,26 @@ let BackEnd_url = `http://${process.env.REACT_APP_SERVER_MARKETPLACE_URL}`; -export const fetchGltfUrl = (filename: string) => { - if (filename) { - return `${BackEnd_url}/api/v1/getAssetFile/${filename}`; +export const fetchGltfUrl = async (filename: string, AssetID: string) => { + try { + const response = await fetch( + `${BackEnd_url}/api/v2/assetDetails/${filename}/${AssetID}`, + { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + // body: JSON.stringify(assetData), + } + ); + + if (!response.ok) { + throw new Error("Failed to fetch asset details"); + } + + const result = await response.json(); + + return result; + } catch (error: any) { + // + throw new Error(error.message); } - return null; // or handle the case when filename is not provided -}; +} \ No newline at end of file diff --git a/app/src/styles/components/marketPlace/marketPlace.scss b/app/src/styles/components/marketPlace/marketPlace.scss index b4237f2..6e39da6 100644 --- a/app/src/styles/components/marketPlace/marketPlace.scss +++ b/app/src/styles/components/marketPlace/marketPlace.scss @@ -2,9 +2,6 @@ @use "../../abstracts/mixins.scss" as *; .marketplace-wrapper { - // transform: scale(0.65); - /* Start at 90% width */ - height: 100vh; width: 100vw; z-index: #{$z-index-marketplace}; @@ -14,7 +11,6 @@ top: 0; padding: 10px; padding-top: 100px; - // animation: growWidth 0.4s ease-in-out 0.5s forwards; .marketplace-container { position: relative; @@ -43,8 +39,6 @@ width: 100%; .skeleton-content { - - width: calc(25% - 14px) !important; height: 100%; border-radius: #{$border-radius-xlarge}; @@ -79,7 +73,6 @@ } .button { - width: 100%; height: 35px; border-radius: 20px; @@ -143,8 +136,7 @@ .star-wrapper.filled { svg { - - fill: #F3A50C; + fill: #f3a50c; } } } @@ -190,10 +182,6 @@ justify-content: center; gap: 6px; - .assets-container { - height: auto; - } - .icon { position: absolute; top: 12px; @@ -208,7 +196,7 @@ .image-container { width: 100%; display: flex; - max-height: 180px; + height: 180px; justify-content: center; border-radius: #{$border-radius-medium}; overflow: hidden; @@ -224,7 +212,7 @@ display: flex; justify-content: space-between; padding: 0; - + height: auto; .name-container { display: flex; flex-direction: column; @@ -299,7 +287,6 @@ } } - .assetPreview-wrapper { width: 100%; height: 100%; @@ -307,15 +294,18 @@ top: 0; left: 0; z-index: 3; + padding: 0 10px; .assetPreview { width: 100%; height: 100%; background: var(--background-color); + backdrop-filter: blur(18px); display: flex; gap: 12px; overflow: hidden; border-radius: #{$border-radius-extra-large}; + outline: 1px solid var(--border-color); } // Image Preview Section @@ -352,8 +342,8 @@ min-width: 26px; border-radius: #{$border-radius-circle}; font-weight: var(--font-weight-bold); - color: var(--background-color); - background: var(--accent-color); + color: var(--text-button-color); + background: var(--background-color-button); } .organization-details { @@ -361,9 +351,7 @@ flex-direction: column; .organization-name { - font-weight: bold; margin-bottom: 5px; - font-weight: #{$bold-weight}; font-size: $regular; } @@ -380,35 +368,31 @@ margin-top: 20px; .asset-name { - font-size: 1.5em; - font-weight: bold; margin-bottom: 10px; font-weight: #{$bold-weight}; - font-size: $large; + font-size: var(--font-size-large); } .asset-description { margin-bottom: 20px; - color: #666; + color: var(--input-text-color); } .asset-review { width: fit-content; - padding: 5px 10px; + padding: 5px 14px; display: flex; align-items: center; margin-bottom: 20px; - outline: 1px solid #909090cc; - border-radius: #{$border-radius-small}; + outline: 1px solid var(--border-color); + border-radius: #{$border-radius-large}; .asset-rating { display: flex; align-items: center; gap: 4px; margin-right: 10px; - font-weight: bold; position: relative; - font-weight: #{$bold-weight}; font-size: $regular; @@ -442,25 +426,25 @@ } .button { - color: white; - padding: 10px 20px; - border-radius: #{$border-radius-small}; + color: var(--text-button-color); + padding: 8px 26px; + border-radius: #{$border-radius-extra-large}; cursor: pointer; text-align: center; &:first-child { - outline: 1px solid var(--accent-color); - color: var(--accent-color); + outline: 1px solid var(--background-color-button); + color: var(--highlight-text-color); } &:last-child { - background: var(--accent-color); - color: var(--background-color); + background: var(--background-color-button); + color: var(--text-button-color); } } .closeButton { - color: var(--accent-color); + color: var(--highlight-text-color); position: absolute; top: 18px; left: 18px; @@ -468,4 +452,4 @@ cursor: pointer; font-size: var(--font-size-large); } -} \ No newline at end of file +} diff --git a/app/src/styles/layout/sidebar.scss b/app/src/styles/layout/sidebar.scss index 4a3b5b7..c8e9aac 100644 --- a/app/src/styles/layout/sidebar.scss +++ b/app/src/styles/layout/sidebar.scss @@ -305,7 +305,6 @@ .header-container { @include flex-space-between; padding: 10px; - padding-left: 16px; width: 100%; gap: 8px; height: 52px; diff --git a/app/src/utils/shortcutkeys/handleShortcutKeys.ts b/app/src/utils/shortcutkeys/handleShortcutKeys.ts index c3346b8..c8d735a 100644 --- a/app/src/utils/shortcutkeys/handleShortcutKeys.ts +++ b/app/src/utils/shortcutkeys/handleShortcutKeys.ts @@ -108,26 +108,39 @@ const KeyPressListener: React.FC = () => { const handleSidebarShortcuts = (key: string) => { - if (activeModule !== "market") { - if (key === "Ctrl+\\") { + if (activeModule === "market") return; + + const updateLocalStorage = (left: boolean, right: boolean) => { + localStorage.setItem("navBarUiLeft", JSON.stringify(left)); + localStorage.setItem("navBarUiRight", JSON.stringify(right)); + }; + + switch (key) { + case "Ctrl+\\": if (toggleUILeft === toggleUIRight) { - setToggleUI(!toggleUILeft, !toggleUIRight); - } - else { + const newState = !toggleUILeft; + setToggleUI(newState, newState); + updateLocalStorage(newState, newState); + } else { setToggleUI(true, true); + updateLocalStorage(true, true); } - return; - } - if (key === "Ctrl+]") { - setToggleUI(toggleUILeft, !toggleUIRight); - return; - } - if (key === "Ctrl+[") { - setToggleUI(!toggleUILeft, toggleUIRight); - return; - } + break; + + case "Ctrl+]": + setToggleUI(toggleUILeft, !toggleUIRight); + updateLocalStorage(toggleUILeft, !toggleUIRight); + break; + + case "Ctrl+[": + setToggleUI(!toggleUILeft, toggleUIRight); + updateLocalStorage(!toggleUILeft, toggleUIRight); + break; + + default: + break; } - } + }; const handleKeyPress = (event: KeyboardEvent) => {