index.js 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { AppBar, Box, Button, IconButton, Stack, Toolbar, Typography } from "@mui/material";
  2. import { useState } from "react";
  3. import { useSelector } from "react-redux";
  4. import { createSearchParams, Link, useNavigate, useSearchParams } from "react-router-dom";
  5. import { ReactComponent as ShoppingLogo } from "../../../images/shopping-logo.svg";
  6. import { AuthModal } from "../../common/AuthModal";
  7. import { CDrawerCart } from "../../common/DrawerCart/DrawerCart";
  8. import { CSearchBar } from "../../common/SearchBar";
  9. import { CSearchResults } from "../../common/SearchBar/SearchResults";
  10. import { AvatarButton } from "./AvatarButton";
  11. import { CCartIcon } from "./CartIcon";
  12. import { CLogoutIcon } from "./LogoutIcon";
  13. const Header = () => {
  14. const rootCats = useSelector((state) => state?.promise?.rootCats?.payload || []);
  15. const [isCartDrawerOpen, setIsCartDrawerOpen] = useState(false);
  16. const [isAuthModalOpen, setIsAuthModalOpen] = useState(false);
  17. const navigate = useNavigate();
  18. const [searchParams, setSearchParams] = useSearchParams();
  19. const token = useSelector((state) => state?.auth?.token || null);
  20. return (
  21. <Box className="Header">
  22. <AppBar position="static" className="AppBar">
  23. <Toolbar variant="dense" className="ToolBar">
  24. <IconButton component={Link} to="/">
  25. <ShoppingLogo className="Logo" />
  26. </IconButton>
  27. <Stack direction="row" spacing={2}>
  28. <Button variant="text" color="inherit" component={Link} to="/">
  29. <Typography variant="body1" component="div">
  30. Головна
  31. </Typography>
  32. </Button>
  33. <Button variant="text" color="inherit" component={Link} to={rootCats[0] ? `/category/${rootCats[0]._id}` : "/"}>
  34. <Typography variant="body1" component="div">
  35. Товари
  36. </Typography>
  37. </Button>
  38. </Stack>
  39. <Box className="SearchBarWrapper">
  40. <CSearchBar
  41. render={CSearchResults}
  42. renderParams={{ itemLink: "/good/" }}
  43. searchLink="/goods/search"
  44. onSearchButtonClick={(text) => {
  45. searchParams.set("text", text);
  46. setSearchParams(searchParams);
  47. navigate({ pathname: "/goods/search", search: createSearchParams(searchParams).toString() });
  48. }}
  49. />
  50. </Box>
  51. <Stack direction="row" spacing={3}>
  52. {token ? (
  53. <Stack direction="row" spacing={3}>
  54. <CLogoutIcon />
  55. <AvatarButton onClick={() => navigate("/dashboard/")} />
  56. </Stack>
  57. ) : (
  58. <Button variant="text" color="inherit" onClick={() => setIsAuthModalOpen(true)}>
  59. <Typography variant="body1" component="div">
  60. Увійти
  61. </Typography>
  62. </Button>
  63. )}
  64. <IconButton color="inherit" className="CartLogoButton" onClick={() => setIsCartDrawerOpen(true)}>
  65. <Box>
  66. <CCartIcon />
  67. </Box>
  68. </IconButton>
  69. </Stack>
  70. </Toolbar>
  71. </AppBar>
  72. <CDrawerCart isOpen={isCartDrawerOpen} onClose={() => setIsCartDrawerOpen(false)} />
  73. <AuthModal open={isAuthModalOpen} onClose={() => setIsAuthModalOpen(false)} />
  74. </Box>
  75. );
  76. };
  77. export { Header };