import React, { useState, useMemo, useEffect, useRef } from "react"; import { AddOfferButton, AuthButtonsContainer, AuthButtonsDrawerContainer, DrawerContainer, EndIcon, FilterContainer, FilterIcon, HeaderContainer, LoginButton, LogoContainer, RegisterButton, SearchIcon, SearchInput, SearchInputMobile, ToggleDrawerButton, ToolsButtonsContainer, ToolsContainer, UserButton, UserName, } from "./Header.styled"; import PropTypes from "prop-types"; import { AppBar, Badge, Toolbar, useMediaQuery, Typography, } from "@mui/material"; import { useTheme } from "@mui/system"; import MenuOutlinedIcon from "@mui/icons-material/MenuOutlined"; import MailIcon from "@mui/icons-material/EmailOutlined"; import Autorenew from "@mui/icons-material/Autorenew"; import AccountCircle from "@mui/icons-material/PersonOutlineOutlined"; import Drawer from "../MUI/DrawerComponent"; import { PrimaryButton } from "../Buttons/PrimaryButton/PrimaryButton"; import PopoverComponent from "../Popovers/PopoverComponent"; import { MyPosts } from "../Popovers/MyPosts/MyPosts"; import { MyMessages } from "../Popovers/MyMessages/MyMessages"; import { MyProfile } from "../Popovers/MyProfile/MyProfile"; import { ReactComponent as LogoHorizontal } from "../../assets/images/svg/logo-horizontal.svg"; import selectedTheme from "../../themes"; import { useTranslation } from "react-i18next"; import { IconButton } from "../Buttons/IconButton/IconButton"; import { useDispatch, useSelector } from "react-redux"; import { selectUserId } from "../../store/selectors/loginSelectors"; import { useSearch } from "../../hooks/useSearch"; import { selectProfileName } from "../../store/selectors/profileSelectors"; import { fetchProfile } from "../../store/actions/profile/profileActions"; import { useHistory, useRouteMatch } from "react-router-dom"; import { LOGIN_PAGE, REGISTER_PAGE } from "../../constants/pages"; import useFilters from "../../hooks/useFilters"; import FilterCard from "../Cards/FilterCard/FilterCard"; import { useQueryString } from "../../hooks/useQueryString"; import { convertQueryStringFrontend } from "../../util/helpers/queryHelpers"; const Header = () => { const [openDrawer, setOpenDrawer] = useState(false); const [openFilters, setOpenFilters] = useState(false); const [numberOfFilters, setNumberOfFilters] = useState(0); const { t } = useTranslation(); const theme = useTheme(); const searchRef = useRef(null); const matches = useMediaQuery(theme.breakpoints.down("md")); const user = useSelector(selectUserId); const search = useSearch(); const dispatch = useDispatch(); const name = useSelector(selectProfileName); const history = useHistory(); const routeMatch = useRouteMatch(); const filters = useFilters(); const searchMobileRef = useRef(null); const queryStringHook = useQueryString(); useEffect(() => { if (user?.length > 1) { dispatch(fetchProfile(user)); } }, [user]); useEffect(() => { setUserPopoverOpen(false); setUserAnchorEl(null); return () => { setUserPopoverOpen(false); setUserAnchorEl(null); }; }, []); useEffect(() => { setNumberOfFilters(filters.calculateFiltersChosen()); }, [ filters.selectedCategory, filters.selectedLocations, filters.selectedSubcategory, ]); useEffect(() => { if (queryStringHook.loadedFromURL) { const queryObject = new URLSearchParams( convertQueryStringFrontend(queryStringHook.queryString) ); if (queryObject.has("search")) { searchRef.current.value = queryObject.get("search"); searchMobileRef.current.value = queryObject.get("search"); } } }); const [postsPopoverOpen, setPostsPopoverOpen] = useState(false); const [postsAnchorEl, setPostsAnchorEl] = useState(null); const [msgPopoverOpen, setMsgPopoverOpen] = useState(false); const [msgAnchorEl, setMsgAnchorEl] = useState(null); const [userPopoverOpen, setUserPopoverOpen] = useState(false); const [userAnchorEl, setUserAnchorEl] = useState(null); const [shouldShow, setShouldShow] = useState(true); useEffect(() => { let shouldShowHeader = true; if ( location.pathname === "/login" || location.pathname === "/register" || location.pathname === "/forgot-password" || location.pathname === "/reset-password" || location.pathname === "/" ) { shouldShowHeader = false; } if (location.pathname === "/" && user?.length === 0) { shouldShowHeader = false; } setShouldShow(shouldShowHeader); }, [location.pathname, user, routeMatch]); const handleToggleDrawer = () => { setOpenDrawer(!openDrawer); }; const handleNavigateLogin = () => { setShouldShow(false); history.push(LOGIN_PAGE); }; const handleNavigateRegister = () => { setShouldShow(false); history.push(REGISTER_PAGE); }; const drawerContent = useMemo( () => ( {user ? ( handleToggleDrawer()} > {t("header.addOffer")} { setPostsPopoverOpen(true); setPostsAnchorEl(e.currentTarget); }} sx={{ borderRadius: "4px" }} > Moje objave { setMsgPopoverOpen(true); setMsgAnchorEl(e.currentTarget); }} sx={{ borderRadius: "4px" }} > Moje poruke { setUserPopoverOpen(true); setUserAnchorEl(e.currentTarget); }} sx={{ borderRadius: "4px" }} > Moj profil ) : ( {t("register.headerTitle")} {t("login.headerTitle")} )} ), [handleToggleDrawer] ); let listener; const handleFocusSearch = () => { listener = (event) => { if (event.keyCode === 13) { event.preventDefault(); handleSearch(searchRef.current.value); } }; searchRef.current.addEventListener("keyup", listener); }; const handleBlurSearch = () => { searchRef.current.removeEventListener("keyup", listener); }; const handleSearch = (value) => { console.log(value); if (value.length === 0) return; search.searchOffers(value); }; const toggleFilters = () => { setOpenFilters((prevState) => !prevState); }; return ( {matches && ( )} handleSearch(searchRef.current.value)} /> ), }} placeholder={t("header.searchOffers")} onFocus={handleFocusSearch} onBlur={handleBlurSearch} ref={searchRef} /> {user ? ( {matches ? ( ) : ( { setUserPopoverOpen(false); setUserAnchorEl(null); }} > {t("header.addOffer")} { setPostsPopoverOpen(true); setPostsAnchorEl(e.currentTarget); }} style={{ background: selectedTheme.primaryIconBackgroundColor, color: selectedTheme.primaryPurple, }} > { setMsgPopoverOpen(true); setMsgAnchorEl(e.currentTarget); }} style={{ background: selectedTheme.primaryIconBackgroundColor, color: selectedTheme.primaryPurple, }} > { setUserPopoverOpen(true); setUserAnchorEl(e.currentTarget); }} > {name} )} ) : ( {matches ? ( ) : ( {t("login.headerTitle")} {t("register.headerTitle")} )} )} {user && ( { setPostsPopoverOpen(false); setPostsAnchorEl(null); }} content={} /> { setMsgPopoverOpen(false); setMsgAnchorEl(null); }} content={} /> { setUserPopoverOpen(false); setUserAnchorEl(null); }} content={} /> )} handleSearch(searchMobileRef.current.value)} /> ), }} placeholder={t("header.searchOffers")} italicPlaceholder onFocus={handleFocusSearch} onBlur={handleBlurSearch} /> ); }; Header.propTypes = { isGrid: PropTypes.bool, }; export default Header;