diff --git a/app/src/app.tsx b/app/src/app.tsx
index 9685c13..bbd5984 100644
--- a/app/src/app.tsx
+++ b/app/src/app.tsx
@@ -7,6 +7,7 @@ import UserAuth from "./pages/UserAuth";
import "./styles/main.scss";
import { LoggerProvider } from "./components/ui/log/LoggerContext";
import ForgotPassword from "./pages/ForgotPassword";
+import PageNotFound from "./pages/PageNotFound";
const App: React.FC = () => {
@@ -23,6 +24,7 @@ const App: React.FC = () => {
} />
} />
} />
+ } />
diff --git a/app/src/assets/image/404/404.svg b/app/src/assets/image/404/404.svg
new file mode 100644
index 0000000..d17802e
--- /dev/null
+++ b/app/src/assets/image/404/404.svg
@@ -0,0 +1,9 @@
+
diff --git a/app/src/assets/image/404/404_bk.png b/app/src/assets/image/404/404_bk.png
new file mode 100644
index 0000000..27bfd56
Binary files /dev/null and b/app/src/assets/image/404/404_bk.png differ
diff --git a/app/src/assets/image/localAssets/arch.png b/app/src/assets/image/localAssets/arch.png
deleted file mode 100644
index bf14278..0000000
Binary files a/app/src/assets/image/localAssets/arch.png and /dev/null differ
diff --git a/app/src/assets/image/localAssets/window.png b/app/src/assets/image/localAssets/window.png
deleted file mode 100644
index c6dbd54..0000000
Binary files a/app/src/assets/image/localAssets/window.png and /dev/null differ
diff --git a/app/src/assets/image/sampleDecal.png b/app/src/assets/image/sampleDecal.png
deleted file mode 100644
index ed8c9fd..0000000
Binary files a/app/src/assets/image/sampleDecal.png and /dev/null differ
diff --git a/app/src/modules/scene/controls/selectionControls/selection3D/boundingBoxHelper3D.tsx b/app/src/modules/scene/controls/selectionControls/selection3D/boundingBoxHelper3D.tsx
index aab6856..b6b49ef 100644
--- a/app/src/modules/scene/controls/selectionControls/selection3D/boundingBoxHelper3D.tsx
+++ b/app/src/modules/scene/controls/selectionControls/selection3D/boundingBoxHelper3D.tsx
@@ -88,9 +88,9 @@ const BoundingBox = ({ boundingBoxRef, isPerAsset = true }: BoundingBoxProps) =>
>
{
+ const savedTheme = localStorage.getItem("theme");
+ const isLogedIn = localStorage.getItem("userId");
+ const navigate = useNavigate();
+ const { hash } = useLocation();
+
+ function getErrorContext() {
+ const contexts = hash.split("#");
+ const context = contexts[1];
+ const info = contexts.length > 1 ? contexts[2] : "";
+ switch (context) {
+ case "project_not_found":
+ return `Project Not found - The project ${
+ info !== "" && `with ID (${info})`
+ } was not found.`;
+ default:
+ return "Page not Found - looks like we have hit a roadblock";
+ }
+ }
+
+ return (
+
+
+
+

+
+
+

+
+
{getErrorContext()}
+
+
+
+ );
+};
+
+export default PageNotFound;
diff --git a/app/src/pages/Project.tsx b/app/src/pages/Project.tsx
index 20aad02..d7bebd8 100644
--- a/app/src/pages/Project.tsx
+++ b/app/src/pages/Project.tsx
@@ -42,6 +42,7 @@ const Project: React.FC = () => {
useEffect(() => {
if (!email || !userId) {
console.error("User data not found in localStorage");
+ navigate("/page-not-found");
return;
}
@@ -60,6 +61,7 @@ const Project: React.FC = () => {
await viewProject(organization, matchedProject._id, userId);
} else {
console.warn("Project not found with given ID:", projectId);
+ navigate(`/not_found#project_not_found#${projectId}`);
}
} catch (error) {
console.error("Error fetching projects:", error);
@@ -72,6 +74,7 @@ const Project: React.FC = () => {
useEffect(() => {
if (!projectId) return;
+
getVersionHistoryApi(projectId)
.then((data) => {
const versions: VersionHistory = [];
diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx
index 06352a0..4db2358 100644
--- a/app/src/pages/UserAuth.tsx
+++ b/app/src/pages/UserAuth.tsx
@@ -36,8 +36,6 @@ const UserAuth: React.FC = () => {
initializeFingerprint();
}, []);
- const { userId, organization } = getUserData();
-
const handleLogin = async (e: FormEvent) => {
e.preventDefault();
const organization = email.split("@")[1].split(".")[0];
diff --git a/app/src/styles/main.scss b/app/src/styles/main.scss
index cc59a33..6da5352 100644
--- a/app/src/styles/main.scss
+++ b/app/src/styles/main.scss
@@ -45,6 +45,7 @@
@use "pages/realTimeViz";
@use "pages/userAuth";
@use "pages/forgotPassword";
+@use "pages/pageNotFound.scss";
//
@use "./scene/scene";
diff --git a/app/src/styles/pages/pageNotFound.scss b/app/src/styles/pages/pageNotFound.scss
new file mode 100644
index 0000000..f185f47
--- /dev/null
+++ b/app/src/styles/pages/pageNotFound.scss
@@ -0,0 +1,56 @@
+@use "../abstracts/variables" as *;
+@use "../abstracts/mixins" as *;
+
+.page-not-found-wrapper {
+ height: 100vh;
+ width: 100vw;
+ background: var(--background-color);
+ .page-not-found-container {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+ gap: 30px;
+ &::after {
+ content: "";
+ position: absolute;
+ background: var(--faint-gradient-color);
+ height: 100vh;
+ width: 100vw;
+ top: 0;
+ left: 0;
+ z-index: -1;
+ }
+ .text-404 {
+ height: 10vh;
+ img {
+ height: 100%;
+ width: 100%;
+ }
+ }
+ .hero-container {
+ height: 50vh;
+ img {
+ height: 100%;
+ width: 100%;
+ }
+ }
+ .context {
+ color: var(--text-color);
+ font-size: 1rem;
+ }
+ .back-to-home {
+ background: var(--background-color-button);
+ color: var(--text-button-color);
+ padding: 8px 16px;
+ border-radius: 30px;
+ cursor: pointer;
+ transition: all 0.2s;
+ &:hover {
+ transform: translateY(-2px);
+ }
+ }
+ }
+}