All files / publisher/components/Navigation Navigation.tsx

50% Statements 4/8
62.5% Branches 5/8
20% Functions 1/5
50% Lines 4/8

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                81x   81x       81x     81x                                                                                                                                                                  
import {
  AppNavigation,
  AppNavigationBar,
  Button,
  Icon,
  Panel,
  Tooltip,
} from "@canonical/react-components";
 
import { useState } from "react";
import useLocalStorage from "../../hooks/useLocalStorage";
import PrimaryNav from "../PrimaryNav";
import Logo from "./Logo";
 
function Navigation(): React.JSX.Element {
  // persist navigation state between refreshes for desktop and tablet
  const [collapseDesktopNavigation, setCollapseDesktopNavigation] =
    useLocalStorage<boolean>("collapse-desktop-nav", false);
  const [pinTabletNavigation, setPinTabletNavigation] =
    useLocalStorage<boolean>("pin-nav", false);
 
  // don't persist mobile navigation state between refreshes
  const [collapseMobileNavigation, setCollapseMobileNavigation] =
    useState<boolean>(true);
 
  return (
    <>
      <AppNavigationBar>
        <Panel
          dark
          logo={<Logo />}
          toggle={{
            label: "Menu",
            onClick: () => {
              setCollapseMobileNavigation(!collapseMobileNavigation);
            },
          }}
        ></Panel>
      </AppNavigationBar>
 
      <AppNavigation
        className={collapseDesktopNavigation ? "is-collapsed--desktop" : ""}
        collapsed={collapseMobileNavigation}
        pinned={pinTabletNavigation}
      >
        <Panel
          dark
          stickyHeader
          className="u-flex-column"
          contentClassName="u-flex-grow u-flex-column u-no-padding"
          logo={<Logo />}
          controls={
            <>
              <Button
                hasIcon
                appearance="base"
                className="u-no-margin u-hide--small u-hide--large"
                onClick={() => {
                  setPinTabletNavigation(!pinTabletNavigation);
                }}
              >
                <Icon light name={pinTabletNavigation ? "close" : "pin"} />
              </Button>
 
              {!collapseDesktopNavigation && (
                <Tooltip message="Collapse main navigation" position="right">
                  <Button
                    hasIcon
                    appearance="base"
                    className="u-hide--small u-hide--medium u-no-margin l-navigation__collapse-toggle"
                    aria-label="Collapse main navigation"
                    onClick={() => {
                      setCollapseDesktopNavigation(true);
                    }}
                  >
                    <Icon name="toggle-side-nav" />
                  </Button>
                </Tooltip>
              )}
            </>
          }
        >
          {collapseDesktopNavigation && (
            <Tooltip message="Expand main navigation" position="right">
              <Button
                hasIcon
                appearance="base"
                className="u-hide--small u-hide--medium u-no-margin l-navigation__collapse-toggle"
                aria-label="Expand main navigation"
                onClick={() => {
                  setCollapseDesktopNavigation(false);
                }}
              >
                <Icon name="toggle-side-nav" />
              </Button>
            </Tooltip>
          )}
 
          <PrimaryNav />
        </Panel>
      </AppNavigation>
    </>
  );
}
 
export default Navigation;