diff --git a/app/src/components/layout/sidebarLeft/Assets.tsx b/app/src/components/layout/sidebarLeft/Assets.tsx index d0aaef2..dd2c2a2 100644 --- a/app/src/components/layout/sidebarLeft/Assets.tsx +++ b/app/src/components/layout/sidebarLeft/Assets.tsx @@ -1,9 +1,6 @@ import React, { useEffect, useState } from "react"; import Search from "../../ui/inputs/Search"; import { getCategoryAsset } from "../../../services/factoryBuilder/assest/assets/getCategoryAsset"; -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 { fetchAssets } from "../../../services/marketplace/fetchAssets"; import { useSelectedItem } from "../../../store/store"; @@ -16,8 +13,6 @@ import storage from "../../../assets/image/categories/storage.png"; import office from "../../../assets/image/categories/office.png"; import safety from "../../../assets/image/categories/safety.png"; import feneration from "../../../assets/image/categories/feneration.png"; -import archThumbnail from "../../../assets/image/localAssets/arch.png"; -import windowThumbnail from "../../../assets/image/localAssets/window.png"; import SkeletonUI from "../../templates/SkeletonUI"; // ------------------------------------- @@ -90,24 +85,7 @@ const Assets: React.FC = () => { useEffect(() => { setCategoryList([ - { - assetName: "Doors", - assetImage: "", - category: "Feneration", - categoryImage: feneration, - }, - { - assetName: "Windows", - assetImage: "", - category: "Feneration", - categoryImage: feneration, - }, - { - assetName: "Pillars", - assetImage: "", - category: "Feneration", - categoryImage: feneration, - }, + { category: "Fenestration", categoryImage: feneration }, { category: "Vehicles", categoryImage: vehicle }, { category: "Workstation", categoryImage: workStation }, { category: "Machines", categoryImage: machines }, @@ -121,44 +99,15 @@ const Assets: React.FC = () => { const fetchCategoryAssets = async (asset: any) => { setisLoading(true); setSelectedCategory(asset); - if (asset === "Feneration") { - const localAssets: AssetProp[] = [ - { - filename: "arch", - category: "Feneration", - url: arch, - thumbnail: archThumbnail, - tags: "arch", - }, - { - filename: "door", - category: "Feneration", - url: door, - thumbnail: feneration, - tags: "door", - }, - { - filename: "window", - category: "Feneration", - url: window, - thumbnail: windowThumbnail, - tags: "window", - }, - ]; - setCategoryAssets(localAssets); - setFiltereredAssets(localAssets); + try { + const res = await getCategoryAsset(asset); + setCategoryAssets(res); + setFiltereredAssets(res); + setisLoading(false); // End loading + // eslint-disable-next-line + } catch (error) { + echo.error("failed to fetch assets"); setisLoading(false); - } else { - try { - const res = await getCategoryAsset(asset); - setCategoryAssets(res); - setFiltereredAssets(res); - setisLoading(false); // End loading - // eslint-disable-next-line - } catch (error) { - echo.error("failed to fetch assets"); - setisLoading(false); - } } }; @@ -167,64 +116,21 @@ const Assets: React.FC = () => {
- {isLoading ? ( - // Show skeleton when loading - ) : searchValue ? ( -
-
-
-

Results for {searchValue}

-
-
- {categoryAssets?.map((asset: any, index: number) => ( -
- {asset.filename} - -
- {asset.filename - .split("_") - .map( - (word: any) => - word.charAt(0).toUpperCase() + word.slice(1) - ) - .join(" ")} -
+ {(() => { + if (isLoading) { + return ; // Show skeleton when loading + } + if (searchValue) { + return ( +
+
+
+

Results for {searchValue}

- ))} -
-
-
- ) : ( - <> - {selectedCategory ? ( -
-

- {selectedCategory}{" "} -
{ - setSelectedCategory(null); - setCategoryAssets([]); - }} - > - ← Back -
-

-
- {categoryAssets && - categoryAssets?.map((asset: any, index: number) => ( +
+ {categoryAssets?.map((asset: any, index: number) => (
{ } }} /> +
{asset.filename .split("_") @@ -257,40 +164,104 @@ const Assets: React.FC = () => {
))} +
- ) : ( + ); + } + + if (selectedCategory) { + return (
-

Categories

-
- {Array.from( - new Set(categoryList.map((asset) => asset.category)) - ).map((category, index) => { - const categoryInfo = categoryList.find( - (asset) => asset.category === category - ); - return ( -
fetchCategoryAssets(category)} - > - {category} -
{category}
+

+ {selectedCategory} + +

+
+ {categoryAssets?.map((asset: any, index: number) => ( +
+ {asset.filename} { + setSelectedItem({ + name: asset.filename, + id: asset.AssetID, + type: + asset.type === "undefined" + ? undefined + : asset.type, + }); + }} + /> +
+ {asset.filename + .split("_") + .map( + (word: any) => + word.charAt(0).toUpperCase() + word.slice(1) + ) + .join(" ")}
- ); - })} +
+ ))} + {categoryAssets.length === 0 && ( +
+ 🚧 The asset shelf is empty. We're working on filling it + up! +
+ )}
- )} - - )} + ); + } + + return ( +
+

Categories

+
+ {Array.from( + new Set(categoryList.map((asset) => asset.category)) + ).map((category, index) => { + const categoryInfo = categoryList.find( + (asset) => asset.category === category + ); + return ( + + ); + })} +
+
+ ); + })()}
diff --git a/app/src/components/layout/sidebarLeft/Header.tsx b/app/src/components/layout/sidebarLeft/Header.tsx index 70668af..f26f4fa 100644 --- a/app/src/components/layout/sidebarLeft/Header.tsx +++ b/app/src/components/layout/sidebarLeft/Header.tsx @@ -6,7 +6,7 @@ import useToggleStore from "../../../store/useUIToggleStore"; import useModuleStore from "../../../store/useModuleStore"; const Header: React.FC = () => { - const { toggleUI, setToggleUI } = useToggleStore(); + const { toggleUILeft, toggleUIRight, setToggleUI } = useToggleStore(); const { activeModule } = useModuleStore(); return ( @@ -20,15 +20,17 @@ const Header: React.FC = () => { diff --git a/app/src/components/layout/sidebarLeft/SideBarLeft.tsx b/app/src/components/layout/sidebarLeft/SideBarLeft.tsx index 0765b95..eb618ec 100644 --- a/app/src/components/layout/sidebarLeft/SideBarLeft.tsx +++ b/app/src/components/layout/sidebarLeft/SideBarLeft.tsx @@ -12,7 +12,7 @@ import Search from "../../ui/inputs/Search"; const SideBarLeft: React.FC = () => { const [activeOption, setActiveOption] = useState("Widgets"); - const { toggleUI } = useToggleStore(); + const { toggleUILeft } = useToggleStore(); const { activeModule } = useModuleStore(); // Reset activeOption whenever activeModule changes @@ -31,47 +31,55 @@ const SideBarLeft: React.FC = () => { }; return ( -
+
- {toggleUI && ( + {toggleUILeft && (
- {activeModule === "visualization" ? ( - <> - - -
- {activeOption === "Widgets" ? : } -
- - ) : activeModule === "market" ? ( - <> - ) : activeModule === "builder" ? ( - <> - -
- {activeOption === "Outline" ? : } -
- - ) : ( - <> - -
- {activeOption === "Outline" ? : } -
- - )} + {(() => { + if (activeModule === "visualization") { + return ( + <> + + +
+ {activeOption === "Widgets" ? : } +
+ + ); + } else if (activeModule === "market") { + return <>; + } else if (activeModule === "builder") { + return ( + <> + +
+ {activeOption === "Outline" ? : } +
+ + ); + } else { + return ( + <> + +
+ {activeOption === "Outline" ? : } +
+ + ); + } + })()}
)}
diff --git a/app/src/components/layout/sidebarRight/Header.tsx b/app/src/components/layout/sidebarRight/Header.tsx index 3684157..c7c3070 100644 --- a/app/src/components/layout/sidebarRight/Header.tsx +++ b/app/src/components/layout/sidebarRight/Header.tsx @@ -5,10 +5,15 @@ import { ActiveUser } from "../../../types/users"; import CollaborationPopup from "../../templates/CollaborationPopup"; import { getAvatarColor } from "../../../modules/collaboration/functions/getAvatarColor"; import { useSelectedUserStore } from "../../../store/useCollabStore"; +import useToggleStore from "../../../store/useUIToggleStore"; +import { ToggleSidebarIcon } from "../../icons/HeaderIcons"; +import useModuleStore from "../../../store/useModuleStore"; const Header: React.FC = () => { const { activeUsers } = useActiveUsers(); const userName = localStorage.getItem("userName") ?? "Anonymous"; + const { toggleUILeft, toggleUIRight, setToggleUI } = useToggleStore(); + const { activeModule } = useModuleStore(); const guestUsers: ActiveUser[] = activeUsers.filter( (user: ActiveUser) => user.userName !== userName @@ -55,6 +60,25 @@ const Header: React.FC = () => { )}
+
)} {/* process builder */} - {toggleUI && + {toggleUIRight && subModule === "properties" && activeModule !== "visualization" && !selectedFloorItem && ( @@ -114,7 +114,7 @@ const SideBarRight: React.FC = () => {
)} - {toggleUI && + {toggleUIRight && subModule === "properties" && activeModule !== "visualization" && selectedFloorItem && ( @@ -124,7 +124,7 @@ const SideBarRight: React.FC = () => { )} - {toggleUI && + {toggleUIRight && subModule === "zoneProperties" && (activeModule === "builder" || activeModule === "simulation") && (
@@ -134,7 +134,7 @@ const SideBarRight: React.FC = () => {
)} {/* simulation */} - {toggleUI && activeModule === "simulation" && ( + {toggleUIRight && activeModule === "simulation" && ( <> {subModule === "simulations" && (
@@ -160,7 +160,7 @@ const SideBarRight: React.FC = () => { )} {/* realtime visualization */} - {toggleUI && activeModule === "visualization" && } + {toggleUIRight && activeModule === "visualization" && }
); }; diff --git a/app/src/components/templates/SkeletonUI.tsx b/app/src/components/templates/SkeletonUI.tsx index 76c3fbd..2928916 100644 --- a/app/src/components/templates/SkeletonUI.tsx +++ b/app/src/components/templates/SkeletonUI.tsx @@ -7,7 +7,6 @@ interface SkeletonUIProps { // Define the SkeletonUI component const SkeletonUI: React.FC = ({ type }) => { - // Function to render skeleton content based on 'type' const renderSkeleton = () => { switch (type) { @@ -38,17 +37,28 @@ const SkeletonUI: React.FC = ({ type }) => { case "asset": return ( <> -
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
); - + default: return (
diff --git a/app/src/components/ui/ModuleToggle.tsx b/app/src/components/ui/ModuleToggle.tsx index a1583e1..4a1532f 100644 --- a/app/src/components/ui/ModuleToggle.tsx +++ b/app/src/components/ui/ModuleToggle.tsx @@ -19,8 +19,11 @@ const ModuleToggle: React.FC = () => { onClick={() => { setActiveModule("builder"); setToggleUI( - localStorage.getItem("navBarUi") - ? localStorage.getItem("navBarUi") === "true" + localStorage.getItem("navBarUiLeft") + ? localStorage.getItem("navBarUiLeft") === "true" + : true, + localStorage.getItem("navBarUiRight") + ? localStorage.getItem("navBarUiRight") === "true" : true ); }} @@ -37,8 +40,11 @@ const ModuleToggle: React.FC = () => { onClick={() => { setActiveModule("simulation"); setToggleUI( - localStorage.getItem("navBarUi") - ? localStorage.getItem("navBarUi") === "true" + localStorage.getItem("navBarUiLeft") + ? localStorage.getItem("navBarUiLeft") === "true" + : true, + localStorage.getItem("navBarUiRight") + ? localStorage.getItem("navBarUiRight") === "true" : true ); }} @@ -55,8 +61,11 @@ const ModuleToggle: React.FC = () => { onClick={() => { setActiveModule("visualization"); setToggleUI( - localStorage.getItem("navBarUi") - ? localStorage.getItem("navBarUi") === "true" + localStorage.getItem("navBarUiLeft") + ? localStorage.getItem("navBarUiLeft") === "true" + : true, + localStorage.getItem("navBarUiRight") + ? localStorage.getItem("navBarUiRight") === "true" : true ); }} @@ -70,7 +79,7 @@ const ModuleToggle: React.FC = () => { className={`module-list ${activeModule === "market" ? "active" : ""}`} onClick={() => { setActiveModule("market"); - setToggleUI(false); + setToggleUI(false, false); }} >
diff --git a/app/src/components/ui/Tools.tsx b/app/src/components/ui/Tools.tsx index 40fec27..cf77f9e 100644 --- a/app/src/components/ui/Tools.tsx +++ b/app/src/components/ui/Tools.tsx @@ -68,8 +68,11 @@ const Tools: React.FC = () => { // Reset activeTool whenever activeModule changes useEffect(() => { setToggleUI( - localStorage.getItem("navBarUi") - ? localStorage.getItem("navBarUi") === "true" + localStorage.getItem("navBarUiLeft") + ? localStorage.getItem("navBarUiLeft") === "true" + : true, + localStorage.getItem("navBarUiRight") + ? localStorage.getItem("navBarUiRight") === "true" : true ); }, []); @@ -90,8 +93,11 @@ const Tools: React.FC = () => { setToggleView(false); } setToggleUI( - localStorage.getItem("navBarUi") - ? localStorage.getItem("navBarUi") === "true" + localStorage.getItem("navBarUiLeft") + ? localStorage.getItem("navBarUiLeft") === "true" + : true, + localStorage.getItem("navBarUiRight") + ? localStorage.getItem("navBarUiRight") === "true" : true ); setToggleThreeD(!toggleThreeD); @@ -116,7 +122,7 @@ const Tools: React.FC = () => { }, []); useEffect(() => { if (!toggleThreeD) { - setToggleUI(false); + setToggleUI(false, false); } }, [toggleThreeD]); @@ -191,8 +197,9 @@ const Tools: React.FC = () => {
{activeSubTool == "cursor" && (
{ setActiveTool("cursor"); }} @@ -203,8 +210,9 @@ const Tools: React.FC = () => { )} {activeSubTool == "free-hand" && (
{ setActiveTool("free-hand"); }} @@ -215,8 +223,9 @@ const Tools: React.FC = () => { )} {activeSubTool == "delete" && (
{ setActiveTool("delete"); }} @@ -289,8 +298,9 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-wall"); }} @@ -299,8 +309,9 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-zone"); }} @@ -309,8 +320,9 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-aisle"); }} @@ -319,8 +331,9 @@ const Tools: React.FC = () => {
{ setActiveTool("draw-floor"); }} @@ -336,8 +349,9 @@ const Tools: React.FC = () => {
{ setActiveTool("measure"); }} @@ -353,8 +367,9 @@ const Tools: React.FC = () => {
{ setActiveTool("pen"); }} @@ -391,8 +406,9 @@ const Tools: React.FC = () => {
{ setActiveTool("comment"); }} @@ -402,8 +418,9 @@ const Tools: React.FC = () => {
{toggleThreeD && (
{ setIsPlaying(!isPlaying); }} @@ -417,8 +434,9 @@ const Tools: React.FC = () => { <>
toggle view (tab)
diff --git a/app/src/components/ui/menu/menu.tsx b/app/src/components/ui/menu/menu.tsx index 39508b6..e784808 100644 --- a/app/src/components/ui/menu/menu.tsx +++ b/app/src/components/ui/menu/menu.tsx @@ -1,12 +1,14 @@ import React, { useState } from "react"; import { ArrowIcon } from "../../icons/ExportCommonIcons"; import { toggleTheme } from "../../../utils/theme"; +import { useNavigate } from "react-router-dom"; interface MenuBarProps { setOpenMenu: (isOpen: boolean) => void; // Function to update menu state } const MenuBar: React.FC = ({ setOpenMenu }) => { + const navigate = useNavigate(); const [activeMenu, setActiveMenu] = useState(null); const [activeSubMenu, setActiveSubMenu] = useState(null); @@ -23,13 +25,19 @@ const MenuBar: React.FC = ({ setOpenMenu }) => { })); }; - function handleThemeChange(){ + function handleThemeChange() { toggleTheme(); window.location.reload(); } const savedTheme: string | null = localStorage.getItem("theme") ?? "light"; + + const handleLogout = () => { + localStorage.clear(); // 1. Clear all localStorage + navigate('/'); // 2. Redirect to homepage + }; + return (
= ({ setOpenMenu }) => {
)}
+
+
Log out
+
); diff --git a/app/src/modules/scene/controls/selectionControls/rotateControls.tsx b/app/src/modules/scene/controls/selectionControls/rotateControls.tsx index 58dab0c..31ba8c9 100644 --- a/app/src/modules/scene/controls/selectionControls/rotateControls.tsx +++ b/app/src/modules/scene/controls/selectionControls/rotateControls.tsx @@ -22,7 +22,7 @@ function RotateControls({ rotatedObjects, setRotatedObjects, movedObjects, setMo const itemsData = useRef([]); const email = localStorage.getItem('email') - const organization = (email!.split("@")[1]).split(".")[0]; + const organization = (email?.split("@")[1])?.split(".")[0] ?? null; const updateBackend = ( productName: string, @@ -214,7 +214,7 @@ function RotateControls({ rotatedObjects, setRotatedObjects, movedObjects, setMo rotation: [obj.rotation.x, obj.rotation.y, obj.rotation.z], }) - if (event) { + if (event && organization) { updateBackend( selectedProduct.productName, selectedProduct.productId, diff --git a/app/src/store/useUIToggleStore.ts b/app/src/store/useUIToggleStore.ts index a508b38..9f5f583 100644 --- a/app/src/store/useUIToggleStore.ts +++ b/app/src/store/useUIToggleStore.ts @@ -1,13 +1,17 @@ import { create } from "zustand"; interface ToggleState { - toggleUI: boolean; // State to track UI toggle - setToggleUI: (value: boolean) => void; // Action to update toggleUI + toggleUILeft: boolean; + toggleUIRight: boolean; + setToggleUI: (value1: boolean, value2: boolean) => void; } const useToggleStore = create((set) => ({ - toggleUI: true, // Initial state - setToggleUI: (value: boolean) => set({ toggleUI: value }), // Update the state + toggleUILeft: true, + toggleUIRight: false, + setToggleUI: (value1: boolean, value2: boolean) => { + set({ toggleUILeft: value1, toggleUIRight: value2 }); + }, })); export default useToggleStore; diff --git a/app/src/styles/layout/sidebar.scss b/app/src/styles/layout/sidebar.scss index 0b7743f..e6b8f10 100644 --- a/app/src/styles/layout/sidebar.scss +++ b/app/src/styles/layout/sidebar.scss @@ -1,6 +1,55 @@ @use "../abstracts/variables" as *; @use "../abstracts/mixins" as *; +.toggle-sidebar-ui-button { + @include flex-center; + cursor: pointer; + height: 32px; + width: 32px; + min-height: 32px; + min-width: 32px; + border-radius: #{$border-radius-large}; + position: relative; + + .tooltip { + top: 6px; + right: -168px; + + &::after { + left: 0px; + bottom: 50%; + } + } + + &:hover { + outline: 1px solid var(--border-color); + outline-offset: -1px; + background: var(--background-color-solid); + + .tooltip { + opacity: 1; + transform: translateX(2px); + } + } +} + +.toggle-sidebar-ui-button.active { + background: var(--background-color-accent); + + rect { + stroke: var(--icon-default-color-active); + } + + circle { + fill: var(--icon-default-color-active); + } + + &:hover { + filter: saturate(0.8); + background: var(--background-color-accent); + } +} + .sidebar-left-wrapper { width: 270px; position: fixed; @@ -34,15 +83,6 @@ } .toggle-sidebar-ui-button { - @include flex-center; - cursor: pointer; - height: 32px; - width: 32px; - min-height: 32px; - min-width: 32px; - border-radius: #{$border-radius-large}; - position: relative; - .tooltip { top: 6px; right: -168px; @@ -52,34 +92,6 @@ bottom: 50%; } } - - &:hover { - outline: 1px solid var(--border-color); - outline-offset: -1px; - background: var(--background-color-solid); - - .tooltip { - opacity: 1; - transform: translateX(2px); - } - } - } - - .active { - background: var(--background-color-accent); - - rect { - stroke: var(--icon-default-color-active); - } - - circle { - fill: var(--icon-default-color-active); - } - - &:hover { - filter: saturate(0.8); - background: var(--background-color-accent); - } } } @@ -295,7 +307,7 @@ padding: 10px; padding-left: 16px; width: 100%; - gap: 12px; + gap: 8px; height: 52px; .options-container { @@ -318,7 +330,7 @@ .split { height: 20px; - width: 2px; + min-width: 1px; background: var(--text-disabled); } @@ -1265,6 +1277,18 @@ } } } + .toggle-sidebar-ui-button { + svg { + transform: scaleX(-1); + } + .tooltip { + right: 56px; + &::after { + left: 100%; + bottom: 50%; + } + } + } } .assets-container-main { @@ -1431,7 +1455,11 @@ height: 100%; gap: 6px; padding: 2px; - + .no-asset { + text-align: center; + margin: 12px; + width: 100%; + } .assets { width: 122px; height: 95px; @@ -1490,20 +1518,6 @@ } } -.skeleton-wrapper { - display: flex; - - .asset-name { - width: 40%; - height: 10px; - } - - .asset { - width: 100%; - height: 100%; - } -} - .sidebar-left-wrapper, .sidebar-right-wrapper { transition: height 0.2s ease-in-out; diff --git a/app/src/styles/layout/skeleton.scss b/app/src/styles/layout/skeleton.scss index 9df0331..9dbc069 100644 --- a/app/src/styles/layout/skeleton.scss +++ b/app/src/styles/layout/skeleton.scss @@ -1,61 +1,90 @@ .skeleton-wrapper { - // max-width: 600px; - margin: 0 auto; - width: 100%; + margin: 0 auto; + width: 100%; - .skeleton { - background: var(--background-color-gray); + .skeleton { + background: var(--background-color-gray); - border-radius: 8px; - position: relative; - overflow: hidden; + border-radius: 8px; + position: relative; + overflow: hidden; - &::after { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-image: linear-gradient(90deg, - rgba(255, 255, 255, 0) 0%, - rgba(255, 255, 255, 0.2) 20%, - rgba(255, 255, 255, 0.5) 60%, - rgba(255, 255, 255, 0) 100%); - transform: translateX(-100%); - animation: shimmer 1.5s infinite; - } + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-image: linear-gradient( + 90deg, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, 0.2) 20%, + rgba(255, 255, 255, 0.39) 60%, + rgba(255, 255, 255, 0) 100% + ); + transform: translateX(-100%); + animation: shimmer 1.5s infinite; + } + } + + .skeleton-header { + margin-bottom: 20px; + + .skeleton-title { + width: 100%; + height: 25px; + margin-bottom: 12px; } - .skeleton-header { - margin-bottom: 20px; - - .skeleton-title { - width: 100%; - height: 25px; - margin-bottom: 12px; - } - - .skeleton-subtitle { - width: 100%; - height: 4px; - } + .skeleton-subtitle { + width: 100%; + height: 4px; } + } - .skeleton-content { - display: flex; - flex-direction: column; - gap: 16px; + .skeleton-content { + display: flex; + flex-direction: column; + gap: 16px; - .skeleton-card { - width: 100%; - height: 15px; - } + .skeleton-card { + width: 100%; + height: 15px; } + } +} + +.asset-category-title{ + width: 60%; + height: 12px; + margin-bottom: 12px; + margin-top: 4px; +} +.skeleton-content-asset{ + display: flex; + height: calc(95px * 2 + 10px); + gap: 10px; + flex-wrap: wrap; + .skeleton-content { + gap: 8px; + flex-direction: column; + min-width: 122px; + min-height: 95px; + .asset-name { + width: 40%; + height: 10px; + } + .asset { + flex: 1; + width: 100%; + height: 100%; + } + } } @keyframes shimmer { - 100% { - transform: translateX(100%); - } -} \ No newline at end of file + 100% { + transform: translateX(100%); + } +} diff --git a/app/src/utils/shortcutkeys/handleShortcutKeys.ts b/app/src/utils/shortcutkeys/handleShortcutKeys.ts index 2ff5f39..c3346b8 100644 --- a/app/src/utils/shortcutkeys/handleShortcutKeys.ts +++ b/app/src/utils/shortcutkeys/handleShortcutKeys.ts @@ -17,7 +17,7 @@ import { useSelectedZoneStore } from "../../store/visualization/useZoneStore"; const KeyPressListener: React.FC = () => { const { activeModule, setActiveModule } = useModuleStore(); const { setActiveSubTool } = useActiveSubTool(); - const { toggleUI, setToggleUI } = useToggleStore(); + const { toggleUILeft, toggleUIRight, setToggleUI } = useToggleStore(); const { setToggleThreeD } = useThreeDStore(); const { setToolMode } = useToolMode(); const { setIsPlaying } = usePlayButtonStore(); @@ -26,7 +26,7 @@ const KeyPressListener: React.FC = () => { const { setAddAction } = useAddAction(); const { setSelectedWallItem } = useSelectedWallItem(); const { setActiveTool } = useActiveTool(); - const { clearSelectedZone} = useSelectedZoneStore(); + const { clearSelectedZone } = useSelectedZoneStore(); const isTextInput = (element: Element | null): boolean => element instanceof HTMLInputElement || @@ -42,9 +42,10 @@ const KeyPressListener: React.FC = () => { }; const module = modules[keyCombination]; if (module && !toggleView) { + console.log("hi"); setActiveTool("cursor"); setActiveSubTool("cursor"); - if (module === "market") setToggleUI(false); + if (module === "market") setToggleUI(false, false); setActiveModule(module); } }; @@ -69,6 +70,7 @@ const KeyPressListener: React.FC = () => { const toggleTo2D = toggleView; setToggleView(!toggleTo2D); setToggleThreeD(toggleTo2D); + setToggleUI(toggleTo2D, toggleTo2D); if (toggleTo2D) { setSelectedWallItem(null); setDeleteTool(false); @@ -105,6 +107,29 @@ const KeyPressListener: React.FC = () => { }; + const handleSidebarShortcuts = (key: string) => { + if (activeModule !== "market") { + if (key === "Ctrl+\\") { + if (toggleUILeft === toggleUIRight) { + setToggleUI(!toggleUILeft, !toggleUIRight); + } + else { + setToggleUI(true, true); + } + return; + } + if (key === "Ctrl+]") { + setToggleUI(toggleUILeft, !toggleUIRight); + return; + } + if (key === "Ctrl+[") { + setToggleUI(!toggleUILeft, toggleUIRight); + return; + } + } + } + + const handleKeyPress = (event: KeyboardEvent) => { if (isTextInput(document.activeElement)) return; @@ -113,11 +138,8 @@ const KeyPressListener: React.FC = () => { event.preventDefault(); - if (keyCombination === "Ctrl+\\") { - if (activeModule !== "market") setToggleUI(!toggleUI); - return; - } - + // Shortcuts specific for sidebar visibility toggle and others specific to sidebar if added + handleSidebarShortcuts(keyCombination); // Active module selection (builder, simulation, etc.) handleModuleSwitch(keyCombination); // Common editing tools: cursor | delete | free-hand @@ -132,6 +154,7 @@ const KeyPressListener: React.FC = () => { if (keyCombination === "ESCAPE") { setActiveTool("cursor"); + setActiveSubTool("cursor"); setIsPlaying(false); clearSelectedZone(); } @@ -146,7 +169,7 @@ const KeyPressListener: React.FC = () => { window.addEventListener("keydown", handleKeyPress); return () => window.removeEventListener("keydown", handleKeyPress); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [activeModule, toggleUI, toggleView]); + }, [activeModule, toggleUIRight, toggleUILeft, toggleView]); return null; };