source: frontend/src/App.tsx@ dc30259

main
Last change on this file since dc30259 was dc30259, checked in by Filip Gavrilovski <filipgavrilovski28@…>, 5 months ago

add loading spinner; don't show sidebar for unauthenticated users

  • Property mode set to 100644
File size: 2.5 KB
Line 
1import { useEffect, useState } from "react";
2import {
3 createBrowserRouter,
4 Outlet,
5 RouterProvider,
6 useLocation,
7} from "react-router-dom";
8import { ToastContainer } from "react-toastify";
9import "react-toastify/dist/ReactToastify.css";
10import LoadingSpinner from "./components/LoadingSpinner";
11import Sidebar from "./components/Sidebar";
12import { useAuth } from "./context/authContext";
13import AllUsers from "./pages/AllUsers";
14import LandingPage from "./pages/LandingPage";
15import Login from "./pages/Login";
16import MusicalCollection from "./pages/MusicalCollection";
17import Nav from "./pages/Nav";
18import Register from "./pages/Register";
19import UserDetail from "./pages/UserDetail";
20
21const MainLayout = () => {
22 const { user } = useAuth();
23 const location = useLocation();
24 // show sidebar only if user is logged in and is on the landing page
25 const isLandingPage = location.pathname === "/";
26 const [isSidebarOpen, setIsSidebarOpen] = useState(!!user && isLandingPage);
27
28 // Open sidebar when user logs in and navigates to landing page
29 useEffect(() => {
30 if (user && isLandingPage) {
31 setIsSidebarOpen(true);
32 }
33 }, [user, isLandingPage]);
34
35 return (
36 <div className="flex flex-col min-h-screen bg-[#121212]">
37 <Nav
38 isSidebarOpen={isSidebarOpen}
39 onToggleSidebar={() => setIsSidebarOpen(!isSidebarOpen)}
40 />
41 <Sidebar isOpen={isSidebarOpen} onClose={() => setIsSidebarOpen(false)} />
42 <ToastContainer
43 position="top-right"
44 autoClose={2000}
45 hideProgressBar={false}
46 newestOnTop={false}
47 closeOnClick
48 rtl={false}
49 pauseOnFocusLoss
50 draggable
51 pauseOnHover
52 theme="light"
53 />
54 <main
55 className={`grow transition-all duration-300 pt-20 ${
56 isSidebarOpen ? "ml-64" : "ml-0"
57 }`}
58 >
59 <Outlet />
60 </main>
61 </div>
62 );
63};
64
65const Layout = () => {
66 const { isAuthLoading } = useAuth();
67
68 if (isAuthLoading) {
69 return <LoadingSpinner />;
70 }
71
72 return <MainLayout />;
73};
74
75const router = createBrowserRouter([
76 {
77 path: "",
78 element: <Layout />,
79 children: [
80 {
81 path: "/",
82 element: <LandingPage />,
83 },
84 {
85 path: "/login",
86 element: <Login />,
87 },
88 {
89 path: "/users",
90 element: <AllUsers />,
91 },
92 {
93 path: "/users/:username",
94 element: <UserDetail />,
95 },
96 {
97 path: "/register",
98 element: <Register />,
99 },
100 {
101 path: "/collection/:type/:id",
102 element: <MusicalCollection />,
103 },
104 {
105 path: "/me",
106 element: <UserDetail />,
107 },
108 ],
109 },
110]);
111
112function App() {
113 return <RouterProvider router={router} />;
114}
115
116export default App;
Note: See TracBrowser for help on using the repository browser.