Skip to content

Commit

Permalink
perf: add new custom hook to header
Browse files Browse the repository at this point in the history
  • Loading branch information
moonbamijam committed May 1, 2024
1 parent f01ac60 commit a4c5e08
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 29 deletions.
32 changes: 3 additions & 29 deletions components/header/Header.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
"use client";

import { useState, useEffect, useRef } from "react";
import { FaBars } from "react-icons/fa";
import { FaBarsStaggered } from "react-icons/fa6";
import { usePathname } from "next/navigation";
import Image from "next/image";
import Link from "next/link";
import tsukiwaLogoLight from "@assets/tsukiwa-logo.png";
Expand All @@ -12,6 +10,7 @@ import ThemeSwitchBtn from "@components/buttons/ThemeSwitchBtn";
import Dropdown from "../ui/Dropdown";
import Anchor from "./Anchor";
import Version from "@components/ui/Version";
import useHeader from "@hooks/useHeader";

const NavLinks = [
{ id: 1, name: "moonbami", path: "/" },
Expand All @@ -22,33 +21,8 @@ const NavLinks = [
];

export default function Header() {
const pathName = usePathname();
const isLinkActive = (path: any) => path === pathName;

const [isMenuActive, setIsMenuActive] = useState(false);
const [scrollHeaderBg, setScrollHeaderBg] = useState("");

const handleScrollHeaderBg = () => {
if (window.scrollY < 15) return setScrollHeaderBg("");
else if (window.scrollY > 15)
return setScrollHeaderBg("scrolled-header-bg");
};

const toggleMenu = () => setIsMenuActive(!isMenuActive);

const dropdown = useRef<HTMLButtonElement | null>(null);

useEffect(() => {
const handleDropdowns = ({ target }: Event) => {
if (!dropdown.current?.contains(target as Node)) setIsMenuActive(false);
};
document.addEventListener("mousedown", handleDropdowns);
document.addEventListener("scroll", handleScrollHeaderBg);
return () => {
document.removeEventListener("mousedown", handleDropdowns);
document.removeEventListener("scroll", handleScrollHeaderBg);
};
}, []);
const { isLinkActive, isMenuActive, scrollHeaderBg, toggleMenu, dropdown } =
useHeader();

return (
<>
Expand Down
42 changes: 42 additions & 0 deletions hooks/useHeader.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { usePathname } from "next/navigation";
import { useEffect, useRef, useState } from "react";

export default function useHeader() {
const pathName = usePathname();
const isLinkActive = (path: any) => path === pathName;

const [isMenuActive, setIsMenuActive] = useState(false);
const [scrollHeaderBg, setScrollHeaderBg] = useState("");

const handleScrollHeaderBg = () => {
if (window.scrollY < 15) return setScrollHeaderBg("");
else if (window.scrollY > 15)
return setScrollHeaderBg("scrolled-header-bg");
};

const toggleMenu = () => setIsMenuActive(!isMenuActive);

const dropdown = useRef<HTMLButtonElement | null>(null);

useEffect(() => {
const handleDropdowns = ({ target }: Event) => {
if (!dropdown.current?.contains(target as Node)) setIsMenuActive(false);
};
document.addEventListener("mousedown", handleDropdowns);
document.addEventListener("scroll", handleScrollHeaderBg);
return () => {
document.removeEventListener("mousedown", handleDropdowns);
document.removeEventListener("scroll", handleScrollHeaderBg);
};
}, []);
return {
isLinkActive,
isMenuActive,
setIsMenuActive,
scrollHeaderBg,
setScrollHeaderBg,
handleScrollHeaderBg,
toggleMenu,
dropdown,
};
}

0 comments on commit a4c5e08

Please sign in to comment.