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
RevLine 
[dc30259]1import { useEffect, useState } from "react";
2import {
3 createBrowserRouter,
4 Outlet,
5 RouterProvider,
6 useLocation,
7} from "react-router-dom";
[b70fbeb]8import { ToastContainer } from "react-toastify";
9import "react-toastify/dist/ReactToastify.css";
[dc30259]10import LoadingSpinner from "./components/LoadingSpinner";
[9c1dcc7]11import MiniPlayer from "./components/MiniPlayer";
[cb4a1da]12import Sidebar from "./components/Sidebar";
[5938bc9]13import { useAuth } from "./context/authContext";
[9c1dcc7]14import { usePlayer } from "./context/playerContext";
[4e5cf92]15import AllUsers from "./pages/AllUsers";
16import LandingPage from "./pages/LandingPage";
17import Login from "./pages/Login";
[cb4a1da]18import MusicalCollection from "./pages/MusicalCollection";
[4e5cf92]19import Nav from "./pages/Nav";
20import Register from "./pages/Register";
[8a47b30]21import SongDetail from "./pages/SongDetail";
[2730163]22import UserDetail from "./pages/UserDetail";
[15ec67f]23
[5938bc9]24const MainLayout = () => {
25 const { user } = useAuth();
[9c1dcc7]26 const { currentSong } = usePlayer();
[dc30259]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]);
[cb4a1da]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"
[9c1dcc7]61 } ${currentSong ? "pb-20" : ""}`}
[cb4a1da]62 >
63 <Outlet />
64 </main>
[9c1dcc7]65 <MiniPlayer />
[cb4a1da]66 </div>
67 );
[0c86e77]68};
69
[5938bc9]70const Layout = () => {
71 const { isAuthLoading } = useAuth();
72
73 if (isAuthLoading) {
[dc30259]74 return <LoadingSpinner />;
[5938bc9]75 }
76
77 return <MainLayout />;
78};
79
[0c86e77]80const router = createBrowserRouter([
[cb4a1da]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 },
[8a47b30]105 {
106 path: "/songs/:id",
107 element: <SongDetail />,
108 },
[cb4a1da]109 {
110 path: "/collection/:type/:id",
111 element: <MusicalCollection />,
112 },
[ebdd3d4]113 {
114 path: "/me",
115 element: <UserDetail />,
116 },
[cb4a1da]117 ],
118 },
[0c86e77]119]);
120
121function App() {
[cb4a1da]122 return <RouterProvider router={router} />;
[15ec67f]123}
124
125export default App;
Note: See TracBrowser for help on using the repository browser.