Forked from
TO / cf-online-ui
115 commits behind the upstream repository.
Navbar.jsx 4.25 KiB
import React, { useCallback, useState } from "react";
import { NavLink } from "react-router-dom";
import { useKeycloak } from "@react-keycloak/web";
import useWindowSize from "@rooks/use-window-size";
import classNames from "classnames";
import Button from "components/Button";
import { AuthStore, GlobalInfoStore } from "stores";
const Navbar = () => {
const { innerWidth } = useWindowSize();
const [showMenu, setShowMenu] = useState();
const { keycloak } = useKeycloak();
const { isAuthenticated, user } = AuthStore.useState();
const { connectionState } = GlobalInfoStore.useState();
const login = useCallback(() => {
keycloak.login();
}, [keycloak]);
const logout = useCallback(() => {
keycloak.logout();
}, [keycloak]);
const connectionStateCaption = {
connected: "Jsi online",
offline: "Jsi offline",
connecting: "Probíhá připojování",
}[connectionState];
const isLg = innerWidth >= 1024;
const indicatorClass = {
"bg-green-400": connectionState === "connected",
"bg-red-600": connectionState === "offline",
"bg-yellow-200": connectionState === "connecting",
};
const connectionIndicator = (
<span
className="relative inline-flex h-4 w-4 mr-4"
title={connectionStateCaption}
>
<span
className={classNames(
"animate-ping absolute inline-flex h-full w-full rounded-full opacity-75",
indicatorClass
)}
/>
<span
className={classNames(
"inline-flex rounded-full w-4 h-4",
indicatorClass
)}
/>
</span>
);
return (
<nav className="navbar navbar--simple">
<div className="container container--wide navbar__content navbar__content--initialized">
<div className="navbar__brand my-4 flex items-center lg:pr-8 lg:my-0">
<NavLink to="/">
<img
src={`${process.env.REACT_APP_STYLEGUIDE_URL}/images/logo-round-white.svg`}
className="w-8"
alt="Pirátská strana"
/>
</NavLink>
<NavLink
to="/"
className="pl-4 font-bold text-xl lg:border-r lg:border-grey-300 lg:pr-8 hover:no-underline"
>
Celostátní fórum 2021
</NavLink>
</div>
<div className="navbar__menutoggle my-4 flex justify-end lg:hidden">
<button
onClick={() => setShowMenu(!showMenu)}
className="no-underline hover:no-underline"
>
<i className="ico--menu text-3xl"></i>
</button>
</div>
{(showMenu || isLg) && (
<>
<div className="navbar__main navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto">
<ul className="navbar-menu text-white">
<li className="navbar-menu__item">
<NavLink className="navbar-menu__link" to="/">
Přímý přenos
</NavLink>
</li>
<li className="navbar-menu__item">
<NavLink className="navbar-menu__link" to="/program">
Program
</NavLink>
</li>
</ul>
</div>
<div className="navbar__actions navbar__section navbar__section--expandable container-padding--zero lg:container-padding--auto self-start flex flex-row items-center">
{connectionIndicator}
{!isAuthenticated && (
<Button className="btn--white" onClick={login}>
Přihlásit se
</Button>
)}
{isAuthenticated && (
<div className="flex items-center space-x-4">
<span className="head-heavy-2xs">{user.name}</span>
<div className="avatar avatar--2xs">
<img
src={`https://a.pirati.cz/piratar/200/${user.username}.jpg`}
alt="Avatar"
/>
</div>
<button onClick={logout}>
<i className="ico--log-out"></i>
</button>
</div>
)}
</div>
</>
)}
</div>
</nav>
);
};
export default Navbar;