Dwinzo_dev/app/src/components/ui/Tools.tsx

485 lines
16 KiB
TypeScript
Raw Normal View History

2025-03-25 06:17:41 +00:00
import React, { useEffect, useRef, useState } from "react";
import {
AsileIcon,
CommentIcon,
CursorIcon,
2025-03-29 07:27:16 +00:00
DeleteIcon,
2025-03-25 06:17:41 +00:00
FloorIcon,
FreeMoveIcon,
2025-03-29 07:27:16 +00:00
MeasureToolIcon,
2025-03-25 06:17:41 +00:00
PenIcon,
PlayIcon,
SaveTemplateIcon,
WallIcon,
ZoneIcon,
} from "../icons/ExportToolsIcons";
import { ArrowIcon, TickIcon } from "../icons/ExportCommonIcons";
import useModuleStore, { useThreeDStore } from "../../store/useModuleStore";
2025-03-25 06:17:41 +00:00
import { handleSaveTemplate } from "../../modules/visualization/handleSaveTemplate";
import { usePlayButtonStore } from "../../store/usePlayButtonStore";
import useTemplateStore from "../../store/useTemplateStore";
import { useSelectedZoneStore } from "../../store/useZoneStore";
2025-03-26 06:00:17 +00:00
import {
useActiveTool,
2025-03-26 06:00:17 +00:00
useAddAction,
useDeleteModels,
useDeletePointOrLine,
useMovePoint,
useRefTextUpdate,
2025-03-26 06:00:17 +00:00
useSelectedWallItem,
useSocketStore,
2025-03-26 06:00:17 +00:00
useToggleView,
useToolMode,
useTransformMode,
2025-03-26 06:00:17 +00:00
} from "../../store/store";
2025-03-29 07:27:16 +00:00
import useToggleStore from "../../store/useUIToggleStore";
2025-04-02 13:42:14 +00:00
import {
use3DWidget,
useFloatingWidget,
} from "../../store/useDroppedObjectsStore";
2025-03-25 06:17:41 +00:00
const Tools: React.FC = () => {
const { templates } = useTemplateStore();
const [activeSubTool, setActiveSubTool] = useState("cursor");
const { toggleThreeD, setToggleThreeD } = useThreeDStore();
const { setToggleUI } = useToggleStore();
2025-03-25 06:17:41 +00:00
const dropdownRef = useRef<HTMLDivElement>(null);
const [openDrop, setOpenDrop] = useState(false);
const { visualizationSocket } = useSocketStore();
2025-03-25 06:17:41 +00:00
const { activeModule } = useModuleStore();
const { isPlaying, setIsPlaying } = usePlayButtonStore();
const { addTemplate } = useTemplateStore();
const { selectedZone } = useSelectedZoneStore();
2025-04-02 13:42:14 +00:00
const { floatingWidget } = useFloatingWidget();
const { widgets3D } = use3DWidget();
2025-03-25 06:17:41 +00:00
// wall options
const { toggleView, setToggleView } = useToggleView();
const { setDeleteModels } = useDeleteModels();
const { setAddAction } = useAddAction();
const { setSelectedWallItem } = useSelectedWallItem();
const { transformMode, setTransformMode } = useTransformMode();
const { deletePointOrLine, setDeletePointOrLine } = useDeletePointOrLine();
const { movePoint, setMovePoint } = useMovePoint();
const { toolMode, setToolMode } = useToolMode();
const { activeTool, setActiveTool } = useActiveTool();
const { refTextupdate, setRefTextUpdate } = useRefTextUpdate();
2025-03-25 06:17:41 +00:00
// Reset activeTool whenever activeModule changes
2025-03-29 07:27:16 +00:00
useEffect(() => {
setToggleUI(
localStorage.getItem("navBarUi")
? localStorage.getItem("navBarUi") === "true"
: true
);
2025-03-29 07:27:16 +00:00
}, []);
2025-04-02 13:42:14 +00:00
useEffect(() => {}, [activeModule]);
2025-03-25 06:17:41 +00:00
useEffect(() => {
setActiveTool(activeSubTool);
setActiveSubTool(activeSubTool);
}, [activeModule]);
const toggleSwitch = () => {
if (toggleThreeD) {
setSelectedWallItem(null);
setDeleteModels(false);
setAddAction(null);
setToggleView(true);
// localStorage.setItem("navBarUi", JSON.stringify(!toggleThreeD));
2025-03-26 06:00:17 +00:00
} else {
setToggleView(false);
}
setToggleUI(
localStorage.getItem("navBarUi")
? localStorage.getItem("navBarUi") === "true"
: true
);
setToggleThreeD(!toggleThreeD);
setActiveSubTool("cursor");
setActiveTool("cursor");
};
2025-03-25 06:17:41 +00:00
useEffect(() => {
const handleOutsideClick = (event: MouseEvent) => {
if (
dropdownRef.current &&
!dropdownRef.current.contains(event.target as Node)
) {
setOpenDrop(false); // Close the dropdown
}
};
2025-03-26 08:22:10 +00:00
const handleEscKeyPress = (event: KeyboardEvent) => {
if (event.key === "Escape") {
setIsPlaying(false); // Set isPlaying to false when Escape key is pressed
}
};
2025-03-25 06:17:41 +00:00
document.addEventListener("mousedown", handleOutsideClick);
2025-03-26 08:22:10 +00:00
document.addEventListener("keydown", handleEscKeyPress); // Listen for ESC key
2025-03-25 06:17:41 +00:00
return () => {
document.removeEventListener("mousedown", handleOutsideClick);
2025-03-26 08:22:10 +00:00
document.removeEventListener("keydown", handleEscKeyPress); // Clean up the event listener
2025-03-25 06:17:41 +00:00
};
}, []);
2025-03-29 07:27:16 +00:00
useEffect(() => {
if (!toggleThreeD) {
setToggleUI(false);
}
}, [toggleThreeD]);
2025-03-25 06:17:41 +00:00
useEffect(() => {
setToolMode(null);
setDeleteModels(false);
setAddAction(null);
setTransformMode(null);
setMovePoint(false);
setDeletePointOrLine(false);
setRefTextUpdate((prevUpdate) => prevUpdate - 1);
switch (activeTool) {
case "Move":
if (toggleView) {
setMovePoint(true);
} else {
setTransformMode("translate");
}
break;
case "Rotate":
if (!toggleView) {
setTransformMode("rotate");
}
break;
case "Scale":
if (!toggleView) {
setTransformMode("scale");
}
break;
case "draw-wall":
if (toggleView) {
setToolMode("Wall");
}
break;
2025-03-29 07:27:16 +00:00
case "draw-aisle":
if (toggleView) {
setToolMode("Aisle");
}
break;
2025-03-29 07:27:16 +00:00
case "draw-zone":
if (toggleView) {
setToolMode("Zone");
}
break;
2025-03-29 07:27:16 +00:00
case "draw-floor":
if (toggleView) {
setToolMode("Floor");
}
break;
2025-03-29 07:27:16 +00:00
case "measure":
setToolMode("MeasurementScale");
break;
case "Add pillar":
if (!toggleView) {
setAddAction("pillar");
}
break;
2025-03-29 07:27:16 +00:00
case "delete":
if (toggleView) {
setDeletePointOrLine(true);
} else {
setDeleteModels(true);
}
break;
default:
break;
}
setActiveTool(activeTool);
}, [activeTool]);
2025-03-25 06:17:41 +00:00
return (
2025-03-26 06:00:17 +00:00
<>
{!isPlaying ? (
<>
<div className="tools-container">
<div className="drop-down-icons">
<div className="activeDropicon">
{activeSubTool == "cursor" && (
2025-03-26 04:33:43 +00:00
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "cursor" ? "active" : ""
}`}
2025-03-26 04:33:43 +00:00
onClick={() => {
setActiveTool("cursor");
}}
>
2025-03-26 06:00:17 +00:00
<CursorIcon isActive={activeTool === "cursor"} />
2025-03-26 04:33:43 +00:00
</div>
2025-03-26 06:00:17 +00:00
)}
{activeSubTool == "free-hand" && (
2025-03-26 04:33:43 +00:00
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "free-hand" ? "active" : ""
}`}
2025-03-26 04:33:43 +00:00
onClick={() => {
setActiveTool("free-hand");
}}
>
2025-03-26 06:00:17 +00:00
<FreeMoveIcon isActive={activeTool === "free-hand"} />
2025-03-25 06:17:41 +00:00
</div>
2025-03-26 06:00:17 +00:00
)}
2025-03-29 07:27:16 +00:00
{activeSubTool == "delete" && (
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "delete" ? "active" : ""
}`}
2025-03-29 07:27:16 +00:00
onClick={() => {
setActiveTool("delete");
}}
>
<DeleteIcon isActive={activeTool === "delete"} />
</div>
)}
2025-03-26 06:00:17 +00:00
{activeModule !== "visualization" && (
<div
className="drop-down-option-button"
ref={dropdownRef}
onClick={() => {
setOpenDrop(!openDrop);
}}
>
<ArrowIcon />
{openDrop && (
<div className="drop-down-container">
<div
className="option-list"
onClick={() => {
setOpenDrop(false);
setActiveTool("cursor");
setActiveSubTool("cursor");
}}
>
<div className="active-option">
{activeSubTool === "cursor" && <TickIcon />}
</div>
<CursorIcon isActive={false} />
<div className="option">Cursor</div>
</div>
<div
className="option-list"
onClick={() => {
setOpenDrop(false);
setActiveTool("free-hand");
setActiveSubTool("free-hand");
}}
>
<div className="active-option">
{activeSubTool === "free-hand" && <TickIcon />}
</div>
<FreeMoveIcon isActive={false} />
<div className="option">Free Hand</div>
</div>
2025-03-29 07:27:16 +00:00
<div
className="option-list"
onClick={() => {
setOpenDrop(false);
setActiveTool("delete");
setActiveSubTool("delete");
}}
>
<div className="active-option">
{activeSubTool === "delete" && <TickIcon />}
</div>
<DeleteIcon isActive={false} />
<div className="option">Delete</div>
</div>
2025-03-26 06:00:17 +00:00
</div>
)}
</div>
)}
</div>
2025-03-25 06:17:41 +00:00
</div>
2025-03-26 06:00:17 +00:00
{!toggleThreeD && activeModule === "builder" && (
<>
<div className="split"></div>
<div className="draw-tools">
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "draw-wall" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("draw-wall");
}}
2025-03-29 07:27:16 +00:00
title="Wall"
2025-03-26 06:00:17 +00:00
>
<WallIcon isActive={activeTool === "draw-wall"} />
</div>
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "draw-zone" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("draw-zone");
}}
2025-03-29 07:27:16 +00:00
title="Zone"
2025-03-26 06:00:17 +00:00
>
<ZoneIcon isActive={activeTool === "draw-zone"} />
</div>
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "draw-aisle" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("draw-aisle");
}}
2025-03-29 07:27:16 +00:00
title="Aisle"
2025-03-26 06:00:17 +00:00
>
<AsileIcon isActive={activeTool === "draw-aisle"} />
</div>
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "draw-floor" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("draw-floor");
}}
2025-03-29 07:27:16 +00:00
title="Floor"
2025-03-26 06:00:17 +00:00
>
<FloorIcon isActive={activeTool === "draw-floor"} />
</div>
</div>
</>
)}
2025-03-29 07:27:16 +00:00
{activeModule === "builder" && (
<>
<div className="split"></div>
<div className="draw-tools">
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "measure" ? "active" : ""
}`}
2025-03-29 07:27:16 +00:00
onClick={() => {
setActiveTool("measure");
}}
title="Measure"
>
<MeasureToolIcon isActive={activeTool === "measure"} />
</div>
</div>
</>
)}
2025-03-26 06:00:17 +00:00
{activeModule === "simulation" && (
<>
<div className="split"></div>
<div className="draw-tools">
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "pen" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("pen");
}}
>
<PenIcon isActive={activeTool === "pen"} />
</div>
</div>
</>
)}
{activeModule === "visualization" && (
<>
<div className="split"></div>
<div className="draw-tools">
<div
className={`tool-button`}
onClick={() => {
2025-03-26 06:00:17 +00:00
handleSaveTemplate({
addTemplate,
floatingWidget,
widgets3D,
2025-03-26 06:00:17 +00:00
selectedZone,
templates,
visualizationSocket
2025-03-26 06:00:17 +00:00
})
}
}
2025-03-26 06:00:17 +00:00
>
<SaveTemplateIcon isActive={false} />
</div>
</div>
</>
)}
<div className="split"></div>
<div className="general-options">
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "comment" ? "active" : ""
}`}
2025-03-26 06:00:17 +00:00
onClick={() => {
setActiveTool("comment");
}}
>
<CommentIcon isActive={activeTool === "comment"} />
</div>
2025-03-29 07:27:16 +00:00
{toggleThreeD && (
<div
2025-04-02 13:42:14 +00:00
className={`tool-button ${
activeTool === "play" ? "active" : ""
}`}
2025-03-29 07:27:16 +00:00
onClick={() => {
setIsPlaying(!isPlaying);
}}
>
<PlayIcon isActive={activeTool === "play"} />
</div>
)}
2025-03-25 06:17:41 +00:00
</div>
{activeModule === "builder" && (
<>
<div className="split"></div>
<div
2025-04-02 13:42:14 +00:00
className={`toggle-threed-button${
toggleThreeD ? " toggled" : ""
}`}
onClick={toggleSwitch}
>
2025-04-02 13:42:14 +00:00
<div
className={`toggle-option${!toggleThreeD ? " active" : ""}`}
>
2d
</div>
2025-04-02 13:42:14 +00:00
<div
className={`toggle-option${toggleThreeD ? " active" : ""}`}
>
3d
</div>
</div>
</>
)}
2025-03-25 06:17:41 +00:00
</div>
</>
2025-03-26 06:00:17 +00:00
) : (
2025-03-27 05:25:44 +00:00
<>
{activeModule !== "simulation" && (
<div className="exitPlay" onClick={() => setIsPlaying(false)}>
X
</div>
)}
</>
2025-03-26 06:00:17 +00:00
)}
</>
2025-03-25 06:17:41 +00:00
);
};
export default Tools;