jingrow/components/common/ClientAppEffects.jsx

194 lines
5.8 KiB
JavaScript

"use client";
import { useEffect } from "react";
import { usePathname } from "next/navigation";
import iTooltip from "itooltip";
import scrollQue from "@/utils/scrollCue.min.js";
import initPlayer from "@/utils/initPlayer";
export default function ClientAppEffects() {
const pathname = usePathname();
useEffect(() => {
if (typeof window !== "undefined") {
import("bootstrap/dist/js/bootstrap.esm");
}
}, []);
useEffect(() => {
if (typeof window !== "undefined") {
scrollQue().init();
window.dispatchEvent(new Event("scroll"));
}
}, [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);
return () => window.removeEventListener("scroll", handleSticky);
}, []);
useEffect(() => {
import("bootstrap").then((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");
backdrops?.forEach((backdrop) => {
backdrop?.remove();
});
});
}, [pathname]);
useEffect(() => {
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 null;
}