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); + } + } + } +}