import { useRef, useState, useEffect, useMemo } from "@wordpress/element"; import { useDeviceType } from "../../controls/controls"; import { KebabMenuIcon, LeftArrow, MoreArrowIcon, RightArrow } from "../../icons/arrowIcons"; import { usePanelBodyContext } from "../../context"; export default function Render({ attributes }) { const { selectedTerms, taxonomyLimit, taxonomyStyle, allTextLabel, filterType, headingLabel, headingTag, headingStyle, allTaxonomies, taxonomyType, selectTermsType, excludeTerms, } = attributes; const { togglePanelBody } = usePanelBodyContext(); const [activeItem, setActiveItem] = useState("all"); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const dropdownRef = useRef(null); const deviceType = useDeviceType(); const HeadingTag = headingTag || "h2"; const moreAnchorRef = useRef(null); //......... const limit = taxonomyLimit.device?.[deviceType]; // e.g., 5 const [currentPage, setCurrentPage] = useState(0); const allItem = { id: "all", label: allTextLabel, }; let allTerms = []; allTaxonomies?.forEach((taxonomy) => { if (taxonomyType === taxonomy.name) { allTerms = [...allTerms, ...taxonomy.terms_items]; } }) const updatedSelectedTerms = { specific: selectedTerms && selectedTerms.length > 0 ? selectedTerms : allTerms, exclude: allTerms.filter( ( term ) => !excludeTerms.some( ex => ex.id === term.id ) ), all: allTerms, }; const newSelectedTerms = [allItem, ...updatedSelectedTerms[selectTermsType]]; // Split the array into chunks const paginatedTerms = useMemo(() => { const chunks = []; for (let i = 0; i < newSelectedTerms.length; i += limit) { chunks.push(newSelectedTerms.slice(i, i + limit)); } return chunks; }, [newSelectedTerms, limit]); // current page’s terms const currentTerms = paginatedTerms[currentPage] || []; // handle next/prev const nextPage = () => { if (currentPage < paginatedTerms.length - 1) { setCurrentPage((p) => p + 1); } }; const prevPage = () => { if (currentPage > 0) { setCurrentPage((p) => p - 1); } }; const handleNavClick = (id) => { setActiveItem(id); setIsDropdownOpen(false); }; let displayTaxonomies; let moreTaxonomies; if (filterType === "button") { displayTaxonomies = currentTerms; moreTaxonomies = updatedSelectedTerms[selectTermsType].slice(limit); } else { displayTaxonomies = []; moreTaxonomies = updatedSelectedTerms[selectTermsType]; } const handleDropdownItemClick = (id) => { setActiveItem(id); setIsDropdownOpen(false); }; const handleMoreClick = (e) => { e.preventDefault(); if ( taxonomyStyle !== "navigation" ) { setIsDropdownOpen(!isDropdownOpen); } }; useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setIsDropdownOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); return (