import React, { useEffect, useRef, useState } from "react"; import { AsileIcon, CommentIcon, CursorIcon, DeleteIcon, FloorIcon, FreeMoveIcon, MeasureToolIcon, PenIcon, PlayIcon, SaveTemplateIcon, WallIcon, ZoneIcon, } from "../icons/ExportToolsIcons"; import { ArrowIcon, TickIcon } from "../icons/ExportCommonIcons"; import useModuleStore, { useThreeDStore } from "../../store/useModuleStore"; import { handleSaveTemplate } from "../../modules/visualization/functions/handleSaveTemplate"; import { usePlayButtonStore } from "../../store/usePlayButtonStore"; import useTemplateStore from "../../store/useTemplateStore"; import { useSelectedZoneStore } from "../../store/visualization/useZoneStore"; import { useActiveTool, useAddAction, useDeleteTool, useDeletePointOrLine, useRefTextUpdate, useSelectedWallItem, useSocketStore, useToggleView, useToolMode, useActiveSubTool, useShortcutStore, } from "../../store/builder/store"; import {useToggleStore} from "../../store/useUIToggleStore"; import { use3DWidget, useFloatingWidget, } from "../../store/visualization/useDroppedObjectsStore"; // Utility component const ToolButton = ({ toolKey, toolId, icon: Icon, active, onClick, tooltip, }: any) => ( ); const Tools: React.FC = () => { const { activeModule } = useModuleStore(); const { toggleThreeD, setToggleThreeD } = useThreeDStore(); const { isPlaying, setIsPlaying } = usePlayButtonStore(); const { showShortcuts } = useShortcutStore(); const { activeTool, setActiveTool, setToolMode, setAddAction, setDeleteTool, setDeletePointOrLine, } = 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(); const dropdownRef = useRef(null); const [openDrop, setOpenDrop] = useState(false); // 1. Set UI toggles on initial render useEffect(() => { setToggleUI( 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]); // 3. Update tools behavior based on selected tool and view mode useEffect(() => { 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(e.target as Node) ) { setOpenDrop(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const resetTools = () => { setToolMode(null); setDeleteTool(false); setAddAction(null); setDeletePointOrLine(false); setRefTextUpdate((prev) => prev - 1); }; const updateToolBehavior = (tool: string, is2D: boolean) => { switch (tool) { case "cursor": if (toggleView) { setToolMode("move"); } break; case "draw-wall": is2D && setToolMode("Wall"); break; case "draw-aisle": is2D && setToolMode("Aisle"); break; case "draw-zone": is2D && setToolMode("Zone"); break; case "draw-floor": is2D && setToolMode("Floor"); break; case "measure": setToolMode("MeasurementScale"); break; case "Add pillar": if (!is2D) setAddAction("pillar"); break; case "delete": is2D ? setDeletePointOrLine(true) : setDeleteTool(true); break; } }; const toggle2D3D = () => { const toggleTo2D = toggleView; setToggleView(!toggleTo2D); setToggleThreeD(toggleTo2D); setToggleUI(toggleTo2D, toggleTo2D); if (toggleTo2D) { setSelectedWallItem(null); setDeleteTool(false); setAddAction(null); } setActiveTool("cursor"); setActiveSubTool("cursor"); setToggleUI( localStorage.getItem("navBarUiLeft") !== "false", localStorage.getItem("navBarUiRight") !== "false" ); }; 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 (
{/* Tool Picker (cursor, delete, etc.) */} {["cursor", "free-hand", "delete"].map( (tool) => activeSubTool === tool && ( setActiveTool(tool)} /> ) )} {/* Dropdown Menu */} {activeModule !== "visualization" && ( ))}
)} )}
{activeModule === "builder" && renderBuilderTools()} {activeModule === "simulation" && renderSimulationTools()} {activeModule === "visualization" && renderVisualizationTools()}
setActiveTool("comment")} /> {toggleThreeD && ( setIsPlaying(!isPlaying)} /> )}
{activeModule === "builder" && ( <>
{renderModeSwitcher()} )} ); }; // Extracted common store logic const useStoreHooks = () => { return { ...useActiveTool(), ...useToolMode(), ...useDeleteTool(), ...useAddAction(), ...useDeletePointOrLine(), ...useRefTextUpdate(), }; }; export default Tools;