185 lines
5.0 KiB
JavaScript
185 lines
5.0 KiB
JavaScript
import React, { useState } from "react";
|
|
import { Route } from "react-router-dom";
|
|
import { useSelector } from "react-redux";
|
|
import { LinkContainer } from "react-router-bootstrap";
|
|
import PropTypes from "prop-types";
|
|
|
|
import Nav from "react-bootstrap/Nav";
|
|
import Navbar from "react-bootstrap/Navbar";
|
|
import NavDropdown from "react-bootstrap/NavDropdown";
|
|
|
|
export const AppNavBar = () => {
|
|
const [expanded, setExpanded] = useState(false);
|
|
|
|
const username = useSelector((state) => state.user.username);
|
|
const isAdmin = useSelector((state) => state.user.isAdmin);
|
|
|
|
return (
|
|
<Navbar
|
|
fixed="top"
|
|
collapseOnSelect
|
|
bg="dark"
|
|
variant="dark"
|
|
expanded={expanded}
|
|
expand="sm"
|
|
onToggle={() => setExpanded(!expanded)}
|
|
>
|
|
<LinkContainer to="/">
|
|
<Navbar.Brand>Canapé</Navbar.Brand>
|
|
</LinkContainer>
|
|
<Navbar.Toggle />
|
|
<Navbar.Collapse>
|
|
<Nav className="mr-auto">
|
|
<MoviesDropdown />
|
|
<ShowsDropdown />
|
|
<WishlistDropdown />
|
|
<TorrentsDropdown />
|
|
</Nav>
|
|
<Nav>
|
|
<Route
|
|
path="/movies"
|
|
render={(props) => (
|
|
<Search
|
|
placeholder="Search movies"
|
|
path="/movies/search"
|
|
history={props.history}
|
|
setExpanded={setExpanded}
|
|
/>
|
|
)}
|
|
/>
|
|
<Route
|
|
path="/shows"
|
|
render={(props) => (
|
|
<Search
|
|
placeholder="Search shows"
|
|
path="/shows/search"
|
|
history={props.history}
|
|
setExpanded={setExpanded}
|
|
/>
|
|
)}
|
|
/>
|
|
<UserDropdown username={username} isAdmin={isAdmin} />
|
|
</Nav>
|
|
</Navbar.Collapse>
|
|
</Navbar>
|
|
);
|
|
};
|
|
AppNavBar.propTypes = {
|
|
history: PropTypes.object,
|
|
};
|
|
|
|
const Search = ({ path, placeholder, setExpanded, history }) => {
|
|
const [search, setSearch] = useState("");
|
|
|
|
const handleSearch = (ev) => {
|
|
ev.preventDefault();
|
|
history.push(`${path}/${encodeURI(search)}`);
|
|
setExpanded(false);
|
|
};
|
|
|
|
return (
|
|
<div className="navbar-form navbar-right">
|
|
<form className="input-group" onSubmit={(ev) => handleSearch(ev)}>
|
|
<input
|
|
className="form-control"
|
|
placeholder={placeholder}
|
|
value={search}
|
|
onChange={(e) => setSearch(e.target.value)}
|
|
/>
|
|
</form>
|
|
</div>
|
|
);
|
|
};
|
|
Search.propTypes = {
|
|
placeholder: PropTypes.string.isRequired,
|
|
setExpanded: PropTypes.func.isRequired,
|
|
path: PropTypes.string.isRequired,
|
|
history: PropTypes.object,
|
|
};
|
|
|
|
const MoviesDropdown = () => (
|
|
<NavDropdown title="Movies" id="navbar-movies-dropdown">
|
|
<LinkContainer to="/movies/explore/yts/seeds">
|
|
<NavDropdown.Item>Discover</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/movies/polochon">
|
|
<NavDropdown.Item>My movies</NavDropdown.Item>
|
|
</LinkContainer>
|
|
</NavDropdown>
|
|
);
|
|
|
|
const ShowsDropdown = () => (
|
|
<NavDropdown title="Shows" id="navbar-shows-dropdown">
|
|
<LinkContainer to="/shows/explore/trakttv/trending">
|
|
<NavDropdown.Item>Discover</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/shows/polochon">
|
|
<NavDropdown.Item>My shows</NavDropdown.Item>
|
|
</LinkContainer>
|
|
</NavDropdown>
|
|
);
|
|
|
|
const UserDropdown = (props) => (
|
|
<Nav>
|
|
<NavDropdown title={props.username} alignRight>
|
|
{props.isAdmin && (
|
|
<LinkContainer to="/admin">
|
|
<NavDropdown.Item>Admin Panel</NavDropdown.Item>
|
|
</LinkContainer>
|
|
)}
|
|
<LinkContainer to="/users/profile">
|
|
<NavDropdown.Item>Profile</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/users/tokens">
|
|
<NavDropdown.Item>Tokens</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/users/logout">
|
|
<NavDropdown.Item>Logout</NavDropdown.Item>
|
|
</LinkContainer>
|
|
</NavDropdown>
|
|
</Nav>
|
|
);
|
|
UserDropdown.propTypes = {
|
|
username: PropTypes.string.isRequired,
|
|
isAdmin: PropTypes.bool.isRequired,
|
|
};
|
|
|
|
const WishlistDropdown = () => (
|
|
<NavDropdown title="Wishlist" id="navbar-wishlit-dropdown">
|
|
<LinkContainer to="/movies/wishlist">
|
|
<NavDropdown.Item>Movies</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/shows/wishlist">
|
|
<NavDropdown.Item>Shows</NavDropdown.Item>
|
|
</LinkContainer>
|
|
</NavDropdown>
|
|
);
|
|
|
|
const TorrentsDropdown = () => {
|
|
const title = <TorrentsDropdownTitle />;
|
|
return (
|
|
<NavDropdown title={title} id="navbar-wishlit-dropdown">
|
|
<LinkContainer to="/torrents/list">
|
|
<NavDropdown.Item>Downloads</NavDropdown.Item>
|
|
</LinkContainer>
|
|
<LinkContainer to="/torrents/search">
|
|
<NavDropdown.Item>Search</NavDropdown.Item>
|
|
</LinkContainer>
|
|
</NavDropdown>
|
|
);
|
|
};
|
|
|
|
const TorrentsDropdownTitle = () => {
|
|
const count = useSelector((state) => state.torrents.count);
|
|
if (count === 0) {
|
|
return <span>Torrents</span>;
|
|
}
|
|
|
|
return (
|
|
<span>
|
|
Torrents
|
|
<span className="badge badge-info badge-pill ml-1">{count}</span>
|
|
</span>
|
|
);
|
|
};
|