Spaces:
Build error
Build error
File size: 5,505 Bytes
844c2c6 4a05586 3c472d9 2800d7c 9b2ddd6 844c2c6 1ac95ab 844c2c6 c87b163 04878ca 1ac95ab 3c472d9 2800d7c a0f1951 04878ca 844c2c6 75d0ffc 4a05586 3c472d9 2800d7c 9b2ddd6 844c2c6 242ef34 844c2c6 9a2b185 844c2c6 9a2b185 844c2c6 242ef34 844c2c6 242ef34 844c2c6 242ef34 b09c6ba a0f1951 242ef34 844c2c6 242ef34 9b2ddd6 242ef34 2800d7c 9b2ddd6 2800d7c 242ef34 844c2c6 242ef34 9b2ddd6 242ef34 844c2c6 242ef34 9b2ddd6 242ef34 65b6ca7 844c2c6 570bb7b 844c2c6 65b6ca7 242ef34 844c2c6 242ef34 75d0ffc 9a2b185 75d0ffc 2800d7c 75d0ffc 9a2b185 97d6950 04878ca 1ac95ab 3c472d9 75d0ffc 242ef34 1ac95ab 242ef34 a0f1951 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | import React from "react";
import {
BrowserRouter as Router,
Route,
Routes,
Link,
useLocation,
} from "react-router-dom";
import { library } from "@fortawesome/fontawesome-svg-core";
import {
faEllipsisVertical,
faPlay,
faChevronLeft,
faCaretDown,
faCaretLeft,
faCaretRight,
faMagnifyingGlass,
faHome,
faFilm,
faTv,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import HomePage from "./pages/homePage";
import FilmsPage from "./pages/filmsPage";
import TvShowsPage from "./pages/tvshowsPage";
import FilmDetailsPage from "./pages/filmDetailsPage";
import { FilmProvider } from "./context/FilmContext";
import { TvShowsProvider } from "./context/TvShowsContext";
import "./App.css";
import MenueModal from "./components/modals/menueModal";
import FilmPlayer from "./pages/filmPlayer";
import TvshowPlayer from "./pages/tvshowPlayer";
import TvShowDetailsPage from "./pages/tvshowDetailsPage";
import AdminPage from "./pages/Admin/adminPage";
import SearchPage from "./pages/searchPage";
library.add(
faEllipsisVertical,
faPlay,
faChevronLeft,
faCaretDown,
faCaretLeft,
faCaretRight,
faMagnifyingGlass,
faHome,
faFilm,
faTv
);
function Navbar() {
const location = useLocation();
const [hoveredLink, setHoveredLink] = React.useState(null);
const [prevLink, setPrevLink] = React.useState(null);
const [isModalOpen, setIsModalOpen] = React.useState(false);
const handleModalClose = () => {
setIsModalOpen(false);
};
const handleModalOpen = () => {
setIsModalOpen(!isModalOpen);
};
React.useEffect(() => {
const activeLink = document.querySelector(
`.nav-link[href="${location.pathname}"]`
);
if (activeLink) {
setPrevLink(activeLink);
}
}, [location.pathname]);
const handleMouseEnter = (e) => {
setPrevLink(document.querySelector(".nav-link.active"));
setHoveredLink(e.target);
};
const handleMouseLeave = () => {
setHoveredLink(null);
};
return (
<nav>
<ul className="nav-links">
<li>
<Link
to="/"
className={`nav-link ${location.pathname === "/" ? "active" : ""}`}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<FontAwesomeIcon icon="fa-solid fa-house" size="lg" />
</Link>
</li>
<li>
<Link
to="/search"
className={`nav-link ${
location.pathname === "/search" ? "active" : ""
}`}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<FontAwesomeIcon icon="fa-solid fa-magnifying-glass" size="lg" />
</Link>
</li>
<li>
<Link
to="/films"
className={`nav-link ${
location.pathname === "/films" ? "active" : ""
}`}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<FontAwesomeIcon icon="fa-solid fa-film" size="lg" />
</Link>
</li>
<li>
<Link
to="/tvshows"
className={`nav-link ${
location.pathname === "/tvshows" ? "active" : ""
}`}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
>
<FontAwesomeIcon icon="fa-solid fa-tv" size="lg" />
</Link>
</li>
<li>
<FontAwesomeIcon
className="nav-link-menue"
icon="fa-solid fa-caret-down"
size="xl"
onClick={handleModalOpen}
/>
</li>
</ul>
<span
className="underline active-underline"
style={
prevLink
? {
width: prevLink.offsetWidth,
left: prevLink.offsetLeft,
}
: {}
}
/>
<span
className="underline hover-underline"
style={
hoveredLink
? {
width: hoveredLink.offsetWidth,
left: hoveredLink.offsetLeft,
}
: {}
}
/>
<MenueModal isOpen={isModalOpen} onRequestClose={setIsModalOpen} />
</nav>
);
}
function AppContent() {
const location = useLocation();
const isFilmPlayer = location.pathname.startsWith("/player");
return (
<div className="App">
{!isFilmPlayer && (
<header className="App-header">
<Navbar />
</header>
)}
<main>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/search" element={<SearchPage />} />
<Route path="/films" element={<FilmsPage />} />
<Route path="/tvshows" element={<TvShowsPage />} />
<Route path="/film/:title" element={<FilmDetailsPage />} />
<Route path="/player/film/:videoUrl" element={<FilmPlayer />} />
<Route path="/player/tvshow/:title/:season/:episode" element={<TvshowPlayer />} />
<Route path="/tvshow/:title" element={<TvShowDetailsPage />} />
<Route path="/admin" element={<AdminPage />} />
</Routes>
</main>
</div>
);
}
function App() {
return (
<FilmProvider>
<TvShowsProvider>
<Router>
<AppContent />
</Router>
</TvShowsProvider>
</FilmProvider>
);
}
export default App;
|