Source

components/_templates/NavBarTemplate/index.js

// react
import React from "react"
import { useTranslation } from "react-i18next"
import { NavLink } from "react-router-dom"
import { IoHomeOutline } from "react-icons/io5"
import styles from "./styles.module.css"
// chakra-ui
import {
  Flex,
  Box,
  Link,
  useDisclosure,
  Button,
  useMediaQuery,
  Icon,
  Divider,
  Text,
} from "@chakra-ui/react"
// components
import CustomDrawer from "components/_atoms/CustomDrawer"
import HorizontalSeparator from "components/_atoms/HorizontalSeparator"
import ChangeThemeBtn from "components/_molecules/ChangeThemeBtn"
import ChangeLanguageBtn from "components/_molecules/ChangeLanguageBtn"
import LogoOpc1 from "components/_molecules/LogoOpc1"
import Logout from "components/_molecules/Logout"
import PresentationLinks from "components/_organisms/PresentationLinks"
import FavoritesBtn from "components/_organisms/FavoritesBtn"
import NotificationsBtn from "components/_organisms/NotificationsBtn"
import CartWidgetBtn from "components/_organisms/CartWidgetBtn"
import LoginBtn from "components/_organisms/LoginBtn"
// styles
import { MY_BREAKPOINTS } from "styles/theme"
import { addOpacityToColor } from "styles/utils"
// hooks
import useSetColorTheme from "hooks/useSetColorTheme"
import useUser from "hooks/useUser"
// routes
import { ROUTES } from "routes"
// utils
import { CATEGORIES } from "utils/constants"
import ItemNavLink from "components/_atoms/ItemNavLink"
import ButtonLink from "components/_atoms/ButtonLink"

/**
 * NavBarTemplate Component
 * @component
 * @author Braian D. Vaylet
 * @description Componente NavBarTemplate con Drawer
 */
const NavBarTemplate = () => {
  const [t] = useTranslation("global")
  const user = useUser()
  const { isOpen, onOpen, onClose } = useDisclosure()
  const backgroundColor = useSetColorTheme(
    addOpacityToColor("#1A202C", 0.75),
    addOpacityToColor("#FFFFFF", 0.75)
  )
  const [mediaQueryMin1280] = useMediaQuery(MY_BREAKPOINTS.BREAK_MIN_1280)
  const [mediaQueryMax600] = useMediaQuery(MY_BREAKPOINTS.BREAK_MAX_600)

  /**
   * renderLinks
   * @function
   * @description retorna links a las diferentes categorias
   * @returns {undefined} return ItemNavLInk Components
   */
  const renderLinks = (_default = true) => {
    return (
      <>
        <ItemNavLink
          to={ROUTES.PRODUCTS + "/" + CATEGORIES.JACKETS}
          m={_default ? ".25rem 0" : "0 1rem"}
        >
          <Text>{t(`NavBarTemplate.${CATEGORIES.JACKETS}`)}</Text>
        </ItemNavLink>

        <ItemNavLink
          to={ROUTES.PRODUCTS + "/" + CATEGORIES.SHIRTS}
          m={_default ? ".25rem 0" : "0 1rem"}
        >
          <Text>{t(`NavBarTemplate.${CATEGORIES.SHIRTS}`)}</Text>
        </ItemNavLink>

        <ItemNavLink
          to={ROUTES.PRODUCTS + "/" + CATEGORIES.SHOES}
          m={_default ? ".25rem 0" : "0 1rem"}
        >
          <Text>{t(`NavBarTemplate.${CATEGORIES.SHOES}`)}</Text>
        </ItemNavLink>

        <ItemNavLink
          to={ROUTES.PRODUCTS + "/" + CATEGORIES.ACCESORIES}
          m={_default ? ".25rem 0" : "0 1rem"}
        >
          <Text>{t(`NavBarTemplate.${CATEGORIES.ACCESORIES}`)}</Text>
        </ItemNavLink>
      </>
    )
  }

  return (
    <>
      <Flex
        w="100%"
        p={2}
        mb={2}
        direction="row"
        justify="space-between"
        align="center"
        borderTopWidth="0.25rem"
        borderColor="brand.primary"
        boxShadow="lg"
        position="fixed"
        bg={backgroundColor}
        opacity="0.95"
        top="0"
        zIndex="1000"
        className={styles.NavBarContainer}
      >
        <Flex direction="row" justify="flex-start" align="center">
          <Flex ml={2} direction="row" align="center" justify="space-between">
            <Button
              variant="none"
              _focus={{
                borderStyle: "none",
                backgroundColor: "transparent",
              }}
              onClick={onOpen}
            >
              <LogoOpc1 />
            </Button>
            <HorizontalSeparator withSeparator />
            <Link as={NavLink} to={ROUTES.HOME} p="0 1rem">
              <Icon as={IoHomeOutline} w="1.5rem" h="1.5rem" />
            </Link>
          </Flex>
        </Flex>
        <Flex direction="row" justify="flex-start" align="center">
          {mediaQueryMin1280 && renderLinks(false)}
          <Box ml={4} mr={4}>
            {!mediaQueryMax600 && user && <FavoritesBtn />}
            {!mediaQueryMax600 && user && <NotificationsBtn />}
            <CartWidgetBtn />
            <LoginBtn ml={10} />
          </Box>
        </Flex>
      </Flex>
      <CustomDrawer
        direction="left"
        onClose={onClose}
        isOpen={isOpen}
        header={<LogoOpc1 />}
        footer={
          <Flex align="center" justify="space-between" w="100%">
            <Box>
              <ChangeThemeBtn />
              <ChangeLanguageBtn />
              <ButtonLink variant="ghost" to={ROUTES.ADMIN}>
                🏗
              </ButtonLink>
            </Box>
            <Logout />
          </Flex>
        }
      >
        <Flex direction="column" align="space-between" justify="flex-start">
          <PresentationLinks m="1rem 0" />
          <Flex
            direction="column"
            align="flex-start"
            justify="flex-start"
            mt={4}
          >
            <Text fontWeight="bold" fontSize="1.25rem">
              {t("NavBarTemplate.categories")}
            </Text>
            <Divider m="1rem 0" />
            {renderLinks()}
          </Flex>
        </Flex>
      </CustomDrawer>
    </>
  )
}

export default NavBarTemplate