source: frontend/src/App.tsx@ 9c1dcc7

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

add experimental video miniplayer

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