diff --git a/src/app/(client-components)/(Header)/SiteHeader.tsx b/src/app/(client-components)/(Header)/SiteHeader.tsx new file mode 100644 index 0000000..721a0fe --- /dev/null +++ b/src/app/(client-components)/(Header)/SiteHeader.tsx @@ -0,0 +1,213 @@ +"use client"; + +import React, { Fragment, useEffect, useRef, useState } from "react"; +import { + ShoppingBagIcon as ShoppingCartIcon, + Cog8ToothIcon as CogIcon, +} from "@heroicons/react/24/outline"; +import { Popover, Transition } from "@headlessui/react"; +import { PathName } from "@/routers/types"; +import Link from "next/link"; +import Header from "./Header"; +import Header3 from "./Header3"; +import { usePathname } from "next/navigation"; +import { useThemeMode } from "@/utils/useThemeMode"; + +export type SiteHeaders = "Header 1" | "Header 2" | "Header 3"; + +interface HomePageItem { + name: string; + slug: PathName; +} + +let OPTIONS = { + root: null, + rootMargin: "0px", + threshold: 1.0, +}; +let OBSERVER: IntersectionObserver | null = null; +const PAGES_HIDE_HEADER_BORDER: PathName[] = [ + "/home-3", + "/listing-car-detail", + "/listing-experiences-detail", + "/listing-stay-detail", +]; + +const SiteHeader = () => { + const anchorRef = useRef(null); + + let [headers] = useState(["Header 1", "Header 2", "Header 3"]); + + let [homePages] = useState([ + { name: "Home Main", slug: "/" }, + { name: "Real Estate", slug: "/home-2" }, + { name: "Home 3", slug: "/home-3" }, + ]); + const [headerSelected, setHeaderSelected] = useState("Header 2"); + + const [isTopOfPage, setIsTopOfPage] = useState(true); + + useEffect(() => { + setIsTopOfPage(window.pageYOffset < 5); + }, []); + // + useThemeMode(); + // + const pathname = usePathname(); + + const intersectionCallback = (entries: IntersectionObserverEntry[]) => { + entries.forEach((entry) => { + setIsTopOfPage(entry.isIntersecting); + }); + }; + + useEffect(() => { + // disconnect the observer + // observer for show the LINE bellow header + if (!PAGES_HIDE_HEADER_BORDER.includes(pathname as PathName)) { + OBSERVER && OBSERVER.disconnect(); + OBSERVER = null; + return; + } + if (!OBSERVER) { + OBSERVER = new IntersectionObserver(intersectionCallback, OPTIONS); + anchorRef.current && OBSERVER.observe(anchorRef.current); + } + }, [pathname]); + + const renderRadioHeaders = () => { + return ( +
+ Header Styles +
+ {headers.map((header) => { + return ( +
setHeaderSelected(header)} + > + {header} +
+ ); + })} +
+
+ ); + }; + + const renderRadioHomePages = () => { + return ( +
+ Home Demos +
+ {homePages.map((home) => { + return ( + + {home.name} + + ); + })} +
+
+ ); + }; + + // FOR DEMO PAGE + const renderControlSelections = () => { + return ( +
+
+ + {({ open }) => ( + <> + + + + + +
+
+ Customize +
+ {renderRadioHeaders()} + {renderRadioHomePages()} +
+ +
+
+
+ + )} +
+
+
+ ); + }; + + const renderHeader = () => { + let headerClassName = "shadow-sm dark:border-b dark:border-neutral-700"; + if (PAGES_HIDE_HEADER_BORDER.includes(pathname as PathName)) { + headerClassName = isTopOfPage + ? "" + : "shadow-sm dark:border-b dark:border-neutral-700"; + } + switch (headerSelected) { + case "Header 1": + return
; + case "Header 2": + return
; + case "Header 3": + return ; + + default: + return ; + } + }; + + return ( + <> + {renderControlSelections()} + {renderHeader()} +
+ + ); +}; + +export default SiteHeader;