Files
moteva/frontend/src/ui/App.tsx
T

102 lines
3.1 KiB
TypeScript
Raw Normal View History

"use client";
import { Loader2 } from "lucide-react";
import { useEffect, useState } from "react";
import { readRoute, type AppRoute } from "@/application/route";
import { BrandMark } from "@/ui/components/BrandMark";
import { CanvasWorkspace } from "@/ui/pages/CanvasWorkspace";
import { HomePage } from "@/ui/pages/HomePage";
import { NotFoundPage } from "@/ui/pages/NotFoundPage";
import { ProjectsRoutePage } from "@/ui/pages/ProjectsRoutePage";
import { useAuth } from "@/ui/auth/AuthProvider";
export function App() {
const { isAuthenticated, openLogin } = useAuth();
const [route, setRoute] = useState<AppRoute | null>(null);
useEffect(() => {
setRoute(readRoute());
const handleRoute = () => setRoute(readRoute());
window.addEventListener("hashchange", handleRoute);
window.addEventListener("popstate", handleRoute);
return () => {
window.removeEventListener("hashchange", handleRoute);
window.removeEventListener("popstate", handleRoute);
};
}, []);
useEffect(() => {
if (route?.name === "project" && !isAuthenticated) {
openLogin();
}
}, [isAuthenticated, openLogin, route]);
if (!route) {
return (
<div className="workspace-loading">
<Loader2 className="spin" size={28} />
</div>
);
}
if (route.name === "project" && !isAuthenticated) return <ProjectAuthPreview />;
if (route.name === "project") return <CanvasWorkspace projectId={route.id} />;
if (route.name === "projects") return <ProjectsRoutePage />;
if (route.name === "notFound") return <NotFoundPage />;
return <HomePage />;
}
function ProjectAuthPreview() {
return (
<div className="project-auth-shell" aria-hidden="true">
<div className="project-auth-blur">
<header className="project-auth-topbar">
<div className="project-auth-title">
<BrandMark className="project-auth-mark" />
<span />
</div>
<div className="project-auth-top-actions">
<i />
<i />
<b />
</div>
</header>
<main className="project-auth-main">
<section className="project-auth-stage">
<div className="project-auth-grid" />
<div className="project-auth-frame primary" />
<div className="project-auth-frame secondary" />
<div className="project-auth-frame tertiary" />
<div className="project-auth-toolbar">
<i />
<i />
<i />
<i />
</div>
</section>
<aside className="project-auth-panel">
<div className="project-auth-panel-head">
<span />
<i />
<i />
</div>
<div className="project-auth-thread">
<b />
<span />
<span />
<span />
</div>
<div className="project-auth-composer">
<span />
<div>
<i />
<i />
</div>
</div>
</aside>
</main>
</div>
</div>
);
}