+ // Portal target (defaults to body)
+ const portalRoot = document.getElementById("root") || document.body;
+
+ const content = (
+
+
+
{projectName}
+
+
+
-
-
{validatedProgress}%
-
+
Entering A New World with your Aalai
+
+
-
+
);
+
+ if (returnDefault) {
+ return content;
+ }
+
+ if (renderOver) {
+ return
{content};
+ }
+ // Render the loading screen as a portal
+ return ReactDOM.createPortal(content, portalRoot);
};
export default LoadingPage;
diff --git a/app/src/components/ui/compareVersion/Button.tsx b/app/src/components/ui/compareVersion/Button.tsx
index 66e4124..5a09448 100644
--- a/app/src/components/ui/compareVersion/Button.tsx
+++ b/app/src/components/ui/compareVersion/Button.tsx
@@ -2,26 +2,35 @@ import React from "react";
import {
useCreateNewWindow,
useIsComparing,
- useLoadingProgress,
+ useLimitDistance,
+ useRenderDistance,
} from "../../../store/builder/store";
import { useSimulationState } from "../../../store/simulation/useSimulationStore";
+import { useParams } from "react-router-dom";
+import { findEnvironment } from "../../../services/factoryBuilder/environment/findEnvironment";
const Button = () => {
const { isComparing, setIsComparing } = useIsComparing();
const { createNewWindow, setCreateNewWindow } = useCreateNewWindow();
- const { setLoadingProgress } = useLoadingProgress();
const { clearComparisonState } = useSimulationState();
+ const { projectId } = useParams();
+ const { setRenderDistance } = useRenderDistance();
+ const { setLimitDistance } = useLimitDistance();
const handleExit = () => {
setIsComparing(false);
setCreateNewWindow(false);
- setLoadingProgress(0);
clearComparisonState();
+ if (!projectId) return;
+ findEnvironment(projectId).then((data) => {
+ if (!data) return;
+ setRenderDistance(data.renderDistance);
+ setLimitDistance(data.limitDistance);
+ });
};
const handleOpenInNewWindow = () => {
- // ๐งน Immediately reset any loading or scene state
- setLoadingProgress(0);
+ // setLoadingProgress(0);
setCreateNewWindow(true);
};
diff --git a/app/src/components/ui/compareVersion/CompareLayOut.tsx b/app/src/components/ui/compareVersion/CompareLayOut.tsx
index 3b123f7..60e6ca3 100644
--- a/app/src/components/ui/compareVersion/CompareLayOut.tsx
+++ b/app/src/components/ui/compareVersion/CompareLayOut.tsx
@@ -5,6 +5,7 @@ import {
useLoadingProgress,
useIsComparing,
useCreateNewWindow,
+ useLimitDistance,
} from "../../../store/builder/store";
import { useSimulationState } from "../../../store/simulation/useSimulationStore";
import { usePlayButtonStore } from "../../../store/ui/usePlayButtonStore";
@@ -17,7 +18,6 @@ import useRestStates from "../../../hooks/useResetStates";
import { getVersionHistoryApi } from "../../../services/factoryBuilder/versionControl/getVersionHistoryApi";
import { validateSimulationDataApi } from "../../../services/simulation/comparison/validateSimulationDataApi";
-import Button from "./Button";
const CompareLayOut = () => {
const { clearComparisonState, comparisonScene, setComparisonState } = useSimulationState();
@@ -42,6 +42,7 @@ const CompareLayOut = () => {
const { projectId } = useParams();
const { resetStates } = useRestStates();
const { createNewWindow } = useCreateNewWindow();
+ const { limitDistance, setLimitDistance } = useLimitDistance();
useEffect(() => {
return () => {
resetStates();
@@ -188,7 +189,10 @@ const CompareLayOut = () => {
}
});
};
-
+ console.log("limitDistance: ", limitDistance);
+ useEffect(() => {
+ setLimitDistance(false);
+ }, [limitDistance]);
return (
<>
{!createNewWindow && (
diff --git a/app/src/components/ui/compareVersion/ComparisonResult.tsx b/app/src/components/ui/compareVersion/ComparisonResult.tsx
index 0194662..b2b86a1 100644
--- a/app/src/components/ui/compareVersion/ComparisonResult.tsx
+++ b/app/src/components/ui/compareVersion/ComparisonResult.tsx
@@ -2,7 +2,7 @@ import { useEffect, useMemo, useState } from "react";
import PerformanceResult from "./result-card/PerformanceResult";
import { Bar, Pie } from "react-chartjs-2";
import { useCompareProductDataStore } from "../../../store/builder/store";
-import { useSimulationState } from "../../../store/simulation/useSimulationStore";
+import { useSimulationState } from "../../../store/simulation/useSimulationStore";
export interface CompareProduct {
productUuid: string;
@@ -24,9 +24,12 @@ export interface CompareProduct {
const ComparisonResult = () => {
const { compareProductsData } = useCompareProductDataStore();
const { comparisonScene, mainScene } = useSimulationState();
- const [comparedProducts, setComparedProducts] = useState<[CompareProduct, CompareProduct] | []>([]);
+ const [comparedProducts, setComparedProducts] = useState<[CompareProduct, CompareProduct] | []>(
+ []
+ );
useEffect(() => {
+ console.log("compareProductsData: ", compareProductsData);
if (compareProductsData.length > 0 && comparisonScene && mainScene) {
setComparedProducts([compareProductsData[0], compareProductsData[1]]);
} else {
@@ -34,11 +37,6 @@ const ComparisonResult = () => {
}
}, [compareProductsData, comparisonScene, mainScene]);
- useEffect(() => {
- if (comparedProducts.length === 2) {
- }
- }, [comparedProducts]);
-
const options = useMemo(
() => ({
responsive: true,
@@ -64,7 +62,10 @@ const ComparisonResult = () => {
datasets: [
{
label: "Throughput (units/hr)",
- data: [comparedProducts[0]?.simulationData.throughputData, comparedProducts[1]?.simulationData.throughputData],
+ data: [
+ comparedProducts[0]?.simulationData.throughputData,
+ comparedProducts[1]?.simulationData.throughputData,
+ ],
backgroundColor: [purpleDark, purpleLight],
borderColor: [purpleDark, purpleLight],
borderWidth: 1,
@@ -79,7 +80,10 @@ const ComparisonResult = () => {
datasets: [
{
label: "Cycle Time (sec)",
- data: [comparedProducts[0]?.simulationData.machineActiveTime, comparedProducts[1]?.simulationData.machineActiveTime],
+ data: [
+ comparedProducts[0]?.simulationData.machineActiveTime,
+ comparedProducts[1]?.simulationData.machineActiveTime,
+ ],
backgroundColor: [purpleDark, purpleLight],
borderColor: "#fff",
borderWidth: 2,
@@ -92,7 +96,10 @@ const ComparisonResult = () => {
datasets: [
{
label: "Downtime (mins)",
- data: [comparedProducts[0]?.simulationData.machineIdleTime, comparedProducts[1]?.simulationData.machineIdleTime],
+ data: [
+ comparedProducts[0]?.simulationData.machineIdleTime,
+ comparedProducts[1]?.simulationData.machineIdleTime,
+ ],
backgroundColor: [purpleDark, purpleLight],
borderColor: "#fff",
borderWidth: 2,
@@ -105,7 +112,10 @@ const ComparisonResult = () => {
datasets: [
{
label: "Production Capacity (units)",
- data: [comparedProducts[0]?.simulationData.productionCapacity, comparedProducts[1]?.simulationData.productionCapacity],
+ data: [
+ comparedProducts[0]?.simulationData.productionCapacity,
+ comparedProducts[1]?.simulationData.productionCapacity,
+ ],
backgroundColor: [purpleDark, purpleLight],
borderColor: [purpleDark, purpleLight],
borderWidth: 1,
@@ -116,25 +126,40 @@ const ComparisonResult = () => {
};
const highestProductivityProduct =
- (comparedProducts[0]?.simulationData?.productionCapacity ?? 0) > (comparedProducts[1]?.simulationData?.productionCapacity ?? 0) ? comparedProducts[0] : comparedProducts[1];
+ (comparedProducts[0]?.simulationData?.productionCapacity ?? 0) >
+ (comparedProducts[1]?.simulationData?.productionCapacity ?? 0)
+ ? comparedProducts[0]
+ : comparedProducts[1];
const product1CyclePercentage =
((comparedProducts[0]?.simulationData?.machineActiveTime ?? 0) /
- ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) + (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0))) *
+ ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0))) *
100;
const product2CyclePercentage =
((comparedProducts[1]?.simulationData?.machineActiveTime ?? 0) /
- ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) + (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) *
+ ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) *
100;
const product1IdlePercentage =
((comparedProducts[0]?.simulationData?.machineIdleTime ?? 0) /
- ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) + (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0))) *
+ ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0))) *
100;
+ console.log(
+ "product1IdlePercentage: ",
+ compareProductsData[0]?.simulationData?.machineIdleTime
+ );
const product2IdlePercentage =
((comparedProducts[1]?.simulationData?.machineIdleTime ?? 0) /
- ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) + (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) *
+ ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) *
100;
+ console.log(
+ "product2IdlePercentage: ",
+ compareProductsData[1]?.simulationData?.machineIdleTime
+ );
return (
@@ -147,16 +172,28 @@ const ComparisonResult = () => {
{comparedProducts[0]?.productName}
-
{compareProductsData[0]?.simulationData.machineActiveTime} Sec
-
= 50 ? "profit" : "loss"}`}>
+
+ {compareProductsData[0]?.simulationData.machineActiveTime} Sec
+
+
= 50 ? "profit" : "loss"
+ }`}
+ >
{product1CyclePercentage >= 50 ? "โ" : "โ"}
{(100 - product1CyclePercentage).toFixed(2)}%
{comparedProducts[1]?.productName}
-
{compareProductsData[1]?.simulationData.machineActiveTime} Sec
-
= 50 ? "profit" : "loss"}`}>
+
+ {compareProductsData[1]?.simulationData.machineActiveTime} Sec
+
+
= 50 ? "profit" : "loss"
+ }`}
+ >
{product2CyclePercentage >= 50 ? "โ" : "โ"}
{(100 - product2CyclePercentage).toFixed(2)}%
@@ -171,23 +208,69 @@ const ComparisonResult = () => {
{/*
*/}
-
Human Idle Time
+
Machine Idle Time
{/*
Overall Downtime
*/}
{comparedProducts[0]?.productName}
-
{compareProductsData[0]?.simulationData.machineIdleTime} Sec
-
= 50 ? "profit" : "loss"}`}>
-
{product1IdlePercentage >= 50 ? "โ" : "โ"}
- {(100 - product1IdlePercentage).toFixed(2)}%
+
+ {compareProductsData[0]?.simulationData.machineIdleTime} Sec
+
+
+ compareProductsData[1]?.simulationData?.machineIdleTime
+ ? "profit"
+ : "loss"
+ }`}
+ >
+
+ {compareProductsData[0]?.simulationData?.machineIdleTime >
+ compareProductsData[1]?.simulationData?.machineIdleTime
+ ? "โ"
+ : "โ"}
+
+ {(
+ ((compareProductsData[0]?.simulationData?.machineIdleTime ??
+ 0) /
+ ((compareProductsData[0]?.simulationData
+ ?.machineActiveTime ?? 0) +
+ (compareProductsData[1]?.simulationData
+ ?.machineIdleTime ?? 0))) *
+ 100
+ ).toFixed(2)}
+ %
{comparedProducts[1]?.productName}
-
{compareProductsData[1]?.simulationData.machineIdleTime} Sec
-
= 50 ? "profit" : "loss"}`}>
-
{product2IdlePercentage >= 50 ? "โ" : "โ"}
- {(100 - product2IdlePercentage).toFixed(2)}%
+
+ {compareProductsData[1]?.simulationData.machineIdleTime} Sec
+
+
+ compareProductsData[0]?.simulationData?.machineIdleTime
+ ? "profit"
+ : "loss"
+ }`}
+ >
+
+ {compareProductsData[1]?.simulationData?.machineIdleTime >
+ compareProductsData[0]?.simulationData?.machineIdleTime
+ ? "โ"
+ : "โ"}
+
+ {(
+ ((compareProductsData[1]?.simulationData?.machineIdleTime ??
+ 0) /
+ ((compareProductsData[1]?.simulationData
+ ?.machineActiveTime ?? 0) +
+ (compareProductsData[0]?.simulationData
+ ?.machineIdleTime ?? 0))) *
+ 100
+ ).toFixed(2)}
+ %
@@ -201,11 +284,15 @@ const ComparisonResult = () => {
{comparedProducts[0]?.productName}
-
{comparedProducts[0]?.simulationData.throughputData}/ hr
+
+ {comparedProducts[0]?.simulationData.throughputData}/ hr
+
{comparedProducts[1]?.productName}
-
{comparedProducts[1]?.simulationData.throughputData}/ hr
+
+ {comparedProducts[1]?.simulationData.throughputData}/ hr
+
@@ -236,9 +323,13 @@ const ComparisonResult = () => {
Production Capacity
-
{highestProductivityProduct?.productName}
+
+ {highestProductivityProduct?.productName}
+
Total product produced
-
{highestProductivityProduct?.simulationData.productionCapacity}
+
+ {highestProductivityProduct?.simulationData.productionCapacity}
+
@@ -246,7 +337,9 @@ const ComparisonResult = () => {
- {comparedProducts.length === 2 &&
}
+ {comparedProducts.length === 2 && (
+
+ )}
);
diff --git a/app/src/components/ui/compareVersion/NewWindowScene.tsx b/app/src/components/ui/compareVersion/NewWindowScene.tsx
index 8e09060..d2522da 100644
--- a/app/src/components/ui/compareVersion/NewWindowScene.tsx
+++ b/app/src/components/ui/compareVersion/NewWindowScene.tsx
@@ -1,10 +1,11 @@
-import React, { Suspense, useEffect, useState } from "react";
+import { Suspense } from "react";
import { RenderInNewWindow } from "../../templates/CreateNewWindow";
import { useSceneContext } from "../../../modules/scene/sceneContext";
import { useCreateNewWindow, useLoadingProgress } from "../../../store/builder/store";
import Scene from "../../../modules/scene/scene";
import ComparisonResult from "./ComparisonResult";
import Button from "./Button";
+import LoadingPage from "../../templates/LoadingPage";
const NewWindowScene = () => {
const { versionStore } = useSceneContext();
@@ -15,12 +16,21 @@ const NewWindowScene = () => {
return (
<>
{selectedVersion?.versionId && (
-
+
setCreateNewWindow(false)}
>
+ {/* Wait a tick to access child window */}
+
+ {
+
+ }
{
>
-
{!loadingProgress && }
diff --git a/app/src/modules/builder/builder.tsx b/app/src/modules/builder/builder.tsx
index a5e6a64..cfde4b4 100644
--- a/app/src/modules/builder/builder.tsx
+++ b/app/src/modules/builder/builder.tsx
@@ -11,7 +11,15 @@ import { useFrame, useThree } from "@react-three/fiber";
import { useSceneContext } from "../scene/sceneContext";
import { useBuilderStore } from "../../store/builder/useBuilderStore";
-import { useToggleView, useWallVisibility, useRoofVisibility, useShadows, useToolMode, useRenderDistance, useLimitDistance } from "../../store/builder/store";
+import {
+ useToggleView,
+ useWallVisibility,
+ useRoofVisibility,
+ useShadows,
+ useToolMode,
+ useRenderDistance,
+ useLimitDistance,
+} from "../../store/builder/store";
////////// 3D Function Imports //////////
@@ -36,12 +44,12 @@ export default function Builder() {
const csgRef = useRef
(null);
const { toggleView } = useToggleView();
- const { setToolMode } = useToolMode();
+ const { toolMode, setToolMode } = useToolMode();
const { setRoofVisibility } = useRoofVisibility();
const { setWallVisibility } = useWallVisibility();
const { setShadows } = useShadows();
const { setRenderDistance } = useRenderDistance();
- const { setLimitDistance } = useLimitDistance();
+ const { limitDistance, setLimitDistance } = useLimitDistance();
const { projectId } = useParams();
const { scene: storeScene, camera: storeCamera, controls: storeControls } = useSceneContext();
const { setHoveredPoint, setHoveredLine } = useBuilderStore();
@@ -72,7 +80,7 @@ export default function Builder() {
setRenderDistance(data.renderDistance);
setLimitDistance(data.limitDistance);
});
- }, [projectId]);
+ }, [projectId, toolMode]);
useFrame(() => {
if (csgRef.current) {
diff --git a/app/src/styles/layout/_loading.scss b/app/src/styles/layout/_loading.scss
index 5331c2f..c26cffd 100644
--- a/app/src/styles/layout/_loading.scss
+++ b/app/src/styles/layout/_loading.scss
@@ -2,104 +2,110 @@
@use "../abstracts/mixins" as *;
.loading-wrapper {
- height: 100vh;
- width: 100vw;
- background: var(--background-color-solid);
-
- &.comparisionLoading {
- position: fixed;
- top: 0;
- right: 0;
-
height: 100vh;
- width: 50vw;
- }
+ width: 100vw;
+ background: var(--background-color-solid);
+ z-index: 1000;
- .loading-container {
- position: relative;
- height: 100%;
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: space-between;
- padding: 28px;
- z-index: 5;
-
- &::after {
- content: "";
- position: absolute;
- background: var(--faint-gradient-color);
- height: 50vh;
- width: 50vw;
- top: 0;
- left: 0;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- border-radius: #{$border-radius-circle};
- filter: blur(200px);
- z-index: -1;
+ &.comparisionLoading {
+ position: fixed;
+ top: 0;
+ right: 0;
+ height: 100vh;
+ width: 50vw;
}
- .project-name {
- font-size: var(--font-size-regular);
+ &.newWindowLoading {
+ position: fixed;
+ top: 0;
+ right: 0;
+ height: 10px;
+ width: 10px;
}
- .loading-hero-container {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- .logo {
- @include flex-center;
- width: 100%;
- margin-bottom: 35px;
- scale: 0.8;
- circle {
- fill: transparent;
- }
- }
-
- .content {
- font-family: #{$font-josefin-sans};
- font-size: #{$xxlarge};
- font-weight: #{$thin-weight};
- max-width: 250px;
- text-align: center;
- line-height: 2rem;
- }
- }
-
- .progress-container {
- width: 100%;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-
- .progress-value {
- font-family: #{$font-josefin-sans};
- font-weight: #{$thin-weight};
- font-size: 96px;
- margin-bottom: 22px;
- text-align: center;
- }
-
- .progress-indicator-container {
- height: 6px;
- width: 60%;
- background: var(--highlight-accent-color);
- border-radius: #{$border-radius-small};
+ .loading-container {
position: relative;
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ padding: 28px;
+ z-index: 5;
- .progress-bar {
- height: 6px;
- background: var(--accent-color);
- border-radius: #{$border-radius-small};
- transition: width 0.2 ease;
+ &::after {
+ content: "";
+ position: absolute;
+ background: var(--faint-gradient-color);
+ height: 50vh;
+ width: 50vw;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ border-radius: #{$border-radius-circle};
+ filter: blur(200px);
+ z-index: -1;
+ }
+
+ .project-name {
+ font-size: var(--font-size-regular);
+ }
+
+ .loading-hero-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ .logo {
+ @include flex-center;
+ width: 100%;
+ margin-bottom: 35px;
+ scale: 0.8;
+ circle {
+ fill: transparent;
+ }
+ }
+
+ .content {
+ font-family: #{$font-josefin-sans};
+ font-size: #{$xxlarge};
+ font-weight: #{$thin-weight};
+ max-width: 250px;
+ text-align: center;
+ line-height: 2rem;
+ }
+ }
+
+ .progress-container {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ .progress-value {
+ font-family: #{$font-josefin-sans};
+ font-weight: #{$thin-weight};
+ font-size: 96px;
+ margin-bottom: 22px;
+ text-align: center;
+ }
+
+ .progress-indicator-container {
+ height: 6px;
+ width: 60%;
+ background: var(--highlight-accent-color);
+ border-radius: #{$border-radius-small};
+ position: relative;
+
+ .progress-bar {
+ height: 6px;
+ background: var(--accent-color);
+ border-radius: #{$border-radius-small};
+ transition: width 0.2 ease;
+ }
+ }
}
- }
}
- }
}