Skip to content

Commit

Permalink
(feat) created a mobile devices sidebar menu
Browse files Browse the repository at this point in the history
  • Loading branch information
sksabbirhossain committed Nov 7, 2023
1 parent 1f85f94 commit 4902035
Show file tree
Hide file tree
Showing 2 changed files with 168 additions and 9 deletions.
59 changes: 50 additions & 9 deletions src/components/user/Headers/MainHeader.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { useState } from "react";
import { AiOutlineShopping, AiOutlineUser } from "react-icons/ai";
import { BsSearch } from "react-icons/bs";
import { FaAlignRight } from "react-icons/fa";
import { useDispatch, useSelector } from "react-redux";
import { Link, useNavigate } from "react-router-dom";
import {
Expand All @@ -10,12 +11,15 @@ import {
import { openCart } from "../../../features/cart/cartOpenSlice";
import { selectCartItems } from "../../../features/cart/cartSelectors";
import { Menu } from "./Menu";
import { MobileMenu } from "./MobileMenu";

export const MainHeader = () => {
const cartItems = useSelector(selectCartItems);
const userAccessToken = useSelector(selectUserAccessToken);
const userInfo = useSelector(selectUserInfo);
const [searchValue, setSearchValue] = useState("");
const [mobileMenu, setMobileMenu] = useState(false);
const [mobileSerach, setMobileSearch] = useState(false);

const dispatch = useDispatch();
const navigate = useNavigate();
Expand All @@ -29,18 +33,32 @@ export const MainHeader = () => {
const searchHeandler = (e) => {
e.preventDefault();
if (searchValue !== "") {
setMobileSearch(false);
navigate(`/search?search=${searchValue}`);
}
};

return (
<div className="w-full h-14 bg-[#f85606] text-gray-100 px-1 sm:px-0 sticky top-0 z-40 shadow-md shadow-gray-400 ">
<div className="container mx-auto flex w-full h-full items-center justify-between space-x-3">
{/* logo area */}
<div className="xl:min-w-[300px]">
<Link to="/">
<h1 className="text-2xl text-white font-semibold">MegaMart</h1>
</Link>
<div className="w-full h-14 bg-[#f85606] text-gray-100 px-2 sm:px-0 sticky top-0 z-40 shadow-md shadow-gray-400 ">
<div className="container mx-auto flex w-full h-full items-center justify-between space-x-3 relative">
<div className="flex items-center space-x-3">
{/* mobile left side menu */}
<div
className="sm:hidden block"
onClick={() => setMobileMenu(!mobileMenu)}
>
<FaAlignRight />
</div>
{/* mobile menu */}
{mobileMenu && (
<MobileMenu setMobileMenu={setMobileMenu} mobileMenu={mobileMenu} />
)}
{/* logo area */}
<div className="xl:min-w-[300px]">
<Link to="/">
<h1 className="text-2xl text-white font-semibold">MegaMart</h1>
</Link>
</div>
</div>
{/* search bar */}
<form className="hidden sm:block sm:w-full" onSubmit={searchHeandler}>
Expand All @@ -63,7 +81,7 @@ export const MainHeader = () => {
<div className="flex items-center space-x-3 relative">
{userAccessToken && userInfo?._id ? (
<>
<div className=" flex items-center space-x-2 group hover:cursor-pointer">
<div className="items-center space-x-2 group hover:cursor-pointer hidden sm:flex">
<div className="w-7 h-7 ">
<img
src={
Expand Down Expand Up @@ -123,6 +141,7 @@ export const MainHeader = () => {
<button
type="submit"
className="pr-2 text-lg text-white block sm:hidden"
onClick={() => setMobileSearch(!mobileSerach)}
>
<BsSearch />
</button>
Expand All @@ -135,12 +154,34 @@ export const MainHeader = () => {
<span className="text-4xl text-white sm:pb-1 absolute">
<AiOutlineShopping />
</span>
<p className="relative left-2 bottom-4 w-5 h-5 flex items-center justify-center bg-gray-800 text-white rounded-full">
<p className="relative left-1 bottom-4 w-5 h-5 flex items-center justify-center bg-gray-800 text-white rounded-full">
<span>{cartItems.length > 0 ? cartItems.length : "0"}</span>
</p>
</div>
</div>
</div>
{/* this form for mobile devices */}
<div className={mobileSerach ? "block" : "hidden"}>
<form
className="sm:hidden block w-full absolute top-3 left-0"
onSubmit={searchHeandler}
>
<div className="flex items-center bg-gray-200 rounded-md ring-1 ring-emerald-800 mx-2">
<input
type="search"
name="search"
value={searchValue}
placeholder="Search Product..."
className="bg-transparent text-black px-2 py-2 focus:outline-none"
onChange={(e) => setSearchValue(e.target.value)}
/>

<button type="submit" className="pr-3 text-lg text-[#f85606]">
<BsSearch />
</button>
</div>
</form>
</div>
</div>
);
};
118 changes: 118 additions & 0 deletions src/components/user/Headers/MobileMenu.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
import React from "react";
import toast from "react-hot-toast";
import { AiOutlineUser } from "react-icons/ai";
import { useDispatch, useSelector } from "react-redux";
import { Link, useNavigate } from "react-router-dom";
import {
selectUserAccessToken,
selectUserInfo,
} from "../../../features/auth/userAuthSelectors";
import { userLoggedOut } from "../../../features/auth/userAuthSlice";

export const MobileMenu = ({ mobileMenu, setMobileMenu }) => {
const userAccessToken = useSelector(selectUserAccessToken);
const userInfo = useSelector(selectUserInfo);
const dispatch = useDispatch();
const navigate = useNavigate();

//user logout hanlder
const logoutHandler = () => {
dispatch(userLoggedOut());
localStorage.removeItem("userAuth");
toast.success("User LogOut SuccessFull");
navigate("/login");
};
return (
<aside
className={`fixed top-0 -left-3 z-50 h-screen w-60 bg-white text-black transition-transform transform ${
mobileMenu
? "translate-x-0 transition ease-in-out duration-1000"
: "-translate-x-full"
}`}
>
<div className="shadow-md">
<div className="flex items-center justify-between p-3">
<p className="text-xl">MegaMart</p>
<button className="text-red-500" onClick={() => setMobileMenu(false)}>
X
</button>
</div>
</div>

<div className=" space-x-3">
{userAccessToken && userInfo?._id ? (
<>
<div className="items-center space-x-2 p-3 group hover:cursor-pointer flex">
<div className="w-7 h-7 ">
<img
src={
userInfo?.profilePic !== null
? userInfo.profilePic
: "https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_1280.png"
}
alt="profile"
className="w-full h-full rounded-full"
/>
</div>
<div className="whitespace-nowrap leading-4">
<p className="text-[12px]">
Hello,{userInfo.name.substring(0, 9)}
</p>
</div>
</div>

<div className="block space-y-2">
<p>
<Link
to="/checkout"
className=" hover:bg-orange-700/50 p-2 rounded-md ease-out duration-100"
>
<span className="text-base font-medium">CheckOut</span>
</Link>
</p>

<p>
<Link
to="/my-order"
className=" hover:bg-orange-700/50 p-2 rounded-md ease-out duration-100"
>
<span className="text-base font-medium ">My Orders</span>
</Link>
</p>

<p
className="pl-2 rounded-md ease-out duration-100"
onClick={logoutHandler}
>
<span className="text-base font-medium "> Logout account</span>
</p>
</div>
</>
) : (
<div className="w-full p-3">
<Link
to="/login"
className="flex items-center w-full hover:bg-orange-700/50 p-2 rounded-md ease-out duration-100"
>
<span className="text-2x pr-1">
<AiOutlineUser />
</span>
<span className="text-base font-medium">Login</span>
</Link>
<Link
to="/register"
className="flex items-center w-full hover:bg-orange-700/50 p-2 rounded-md ease-out duration-100"
>
<span className="text-2x pr-1">
<AiOutlineUser />
</span>
<span className="text-base font-medium whitespace-nowrap">
Sign Up
</span>
</Link>
</div>
)}
</div>
</aside>
);
};

0 comments on commit 4902035

Please sign in to comment.