diff --git a/app/layout.jsx b/app/layout.jsx index d2cdb7a..fb31c92 100644 --- a/app/layout.jsx +++ b/app/layout.jsx @@ -1,205 +1,14 @@ -"use client"; -import { useEffect, useRef } from "react"; import "../public/assets/style.css"; import "photoswipe/dist/photoswipe.css"; -import iTooltip from "itooltip"; -import { usePathname } from "next/navigation"; -import scrollQue from "../utils/scrollCue.min.js"; import Context from "@/context/Context"; import ProgressWrap from "@/components/common/ProgressWrap"; -import initPlayer from "@/utils/initPlayer"; import SearchModal from "@/components/modals/SearchModal"; import InfoModal from "@/components/modals/InfoModal"; import Header from "@/components/headers/Header"; import Footer from "@/components/footers/Footer"; +import ClientAppEffects from "@/components/common/ClientAppEffects"; export default function RootLayout({ children }) { - const pathname = usePathname(); - useEffect(() => { - if (typeof window !== "undefined") { - import("bootstrap/dist/js/bootstrap.esm").then((module) => { - // Module is imported, you can access any exported functionality if - }); - } - }, []); - // const rellaxRef = useRef(null); - useEffect(() => { - if (typeof window !== "undefined") { - scrollQue().init(); - window.dispatchEvent(new Event("scroll")); - } - - return () => { - // rellaxRef.current?.destroy(); - }; - }, [pathname]); - useEffect(() => { - initPlayer(); - const overlayElements = document.querySelectorAll( - ".overlay > a, .overlay > span" - ); - overlayElements.forEach((element) => { - const overlayBg = document.createElement("span"); - overlayBg.className = "bg"; - element.appendChild(overlayBg); - }); - }, [pathname]); - useEffect(() => { - const tooltipTriggerList = document.querySelectorAll( - '[data-bs-toggle="tooltip"]' - ); - const popoverTriggerList = document.querySelectorAll( - '[data-bs-toggle="popover"]' - ); - - if (tooltipTriggerList.length > 0 || popoverTriggerList.length > 0) { - import("bootstrap/dist/js/bootstrap.bundle.min").then((bootstrap) => { - // Initialize tooltips - const tooltipList = Array.from(tooltipTriggerList).map( - (tooltipTriggerEl) => { - return new bootstrap.Tooltip(tooltipTriggerEl, { - trigger: "hover", - }); - } - ); - - // Initialize popovers - const popoverList = Array.from(popoverTriggerList).map( - (popoverTriggerEl) => { - return new bootstrap.Popover(popoverTriggerEl); - } - ); - - // Cleanup tooltips and popovers on component unmount - return () => { - tooltipList.forEach((tooltip) => tooltip.dispose()); - popoverList.forEach((popover) => popover.dispose()); - }; - }); - } - }, [pathname]); - - useEffect(() => { - const handleSticky = () => { - const navbar = document.querySelector(".navbar"); - if (navbar) { - if (window.scrollY > 120) { - navbar.classList.add("fixed"); - navbar.classList.add("navbar-clone"); - if ( - navbar.classList.contains("transparent") && - navbar.classList.contains("navbar-dark") - ) { - navbar.classList.remove("navbar-dark"); - navbar.classList.add("navbar-light"); - navbar.classList.add("navbar-dark-removed"); - } - } else { - navbar.classList.remove("fixed"); - navbar.classList.remove("navbar-clone"); - if ( - navbar.classList.contains("transparent") && - navbar.classList.contains("navbar-dark-removed") - ) { - navbar.classList.add("navbar-dark"); - navbar.classList.remove("navbar-light"); - navbar.classList.remove("navbar-dark-removed"); - } - } - if (window.scrollY > 300) { - navbar.classList.add("navbar-stick"); - } else { - navbar.classList.remove("navbar-stick"); - } - } - }; - - window.addEventListener("scroll", handleSticky); - }, []); - useEffect(() => { - // Close any open modal - const bootstrap = require("bootstrap"); // dynamically import bootstrap - const modalElements = document.querySelectorAll(".modal.show"); - modalElements.forEach((modal) => { - const modalInstance = bootstrap.Modal.getInstance(modal); - if (modalInstance) { - modalInstance.hide(); - } - }); - - // Close any open offcanvas - const offcanvasElements = document.querySelectorAll(".offcanvas.show"); - offcanvasElements.forEach((offcanvas) => { - const offcanvasInstance = bootstrap.Offcanvas.getInstance(offcanvas); - if (offcanvasInstance) { - offcanvasInstance.hide(); - } - }); - // Select all elements with the class 'offcanvas-backdrop' - const backdrops = document.querySelectorAll(".offcanvas-backdrop"); - - // Check if any backdrop elements exist and remove them - backdrops?.forEach((backdrop) => { - backdrop?.remove(); - }); - }, [pathname]); // Runs every time the route changes - - useEffect(() => { - // Assuming iTooltip is globally available - var tooltip = new iTooltip(".itooltip"); - tooltip.init({ - className: "itooltip-inner", - indentX: 15, - indentY: 15, - positionX: "right", - positionY: "bottom", - }); - }, [pathname]); - useEffect(() => { - setTimeout(() => { - import("bootstrap").then(({ Offcanvas }) => { - const navbar = document.querySelector(".navbar"); - if (!navbar) return; - - const navOffCanvasBtn = document.querySelectorAll(".offcanvas-nav-btn"); - const navOffCanvas = document.querySelector( - ".navbar:not(.navbar-clone) .offcanvas-nav" - ); - if (!navOffCanvas) return; - - const bsOffCanvas = new Offcanvas(navOffCanvas, { scroll: true }); - const scrollLink = document.querySelectorAll( - ".onepage .navbar li a.scroll" - ); - const searchOffcanvas = document.getElementById("offcanvas-search"); - - const handleNavClick = () => bsOffCanvas.show(); - const handleScrollClick = () => bsOffCanvas.hide(); - - navOffCanvasBtn.forEach((e) => - e.addEventListener("click", handleNavClick) - ); - scrollLink.forEach((e) => - e.addEventListener("click", handleScrollClick) - ); - - if (searchOffcanvas) { - searchOffcanvas.addEventListener("shown.bs.offcanvas", () => { - document.getElementById("search-form")?.focus(); - }); - } - - return () => { - navOffCanvasBtn.forEach((e) => - e.removeEventListener("click", handleNavClick) - ); - scrollLink.forEach((e) => - e.removeEventListener("click", handleScrollClick) - ); - }; - }); - }); - }, [pathname]); return ( @@ -213,7 +22,6 @@ export default function RootLayout({ children }) { rel="stylesheet" /> -
@@ -223,6 +31,7 @@ export default function RootLayout({ children }) {