diff --git a/src/components/services/list.jsx b/src/components/services/list.jsx index c473287f..39e0398f 100644 --- a/src/components/services/list.jsx +++ b/src/components/services/list.jsx @@ -1,7 +1,7 @@ +import { memo, useCallback, useEffect, useMemo, useRef, useState } from "react"; import classNames from "classnames"; import Item from "components/services/item"; -import { useEffect, useRef, useState } from "react"; const columnMap = [ "grid-cols-1 md:grid-cols-1 lg:grid-cols-1", @@ -29,107 +29,167 @@ const subcolumnMap = [ const itemRemSizeMap = [1, 1, 9, 8, 7, 7, 7, 7, 7]; -export default function List({ group, services, layout, isGroup = false }) { - const containerRef = useRef(null); - const [childrensToSlice, setChildrensToSlice] = useState(0); +function areArraysEqual(array1, array2) { + if (array1.length === 0 && array2.length === 0) return true; - const numberOfServices = services.filter((e) => e).length; - const servicesTopRows = services.filter((v) => v).slice(0, numberOfServices - childrensToSlice); - const servicesBottomRows = services.filter((v) => v).slice(numberOfServices - childrensToSlice); - if (servicesBottomRows.length > 0) console.log(servicesBottomRows); + if (array1.length !== array2.length) { + return false; + } + const sortedArray1 = JSON.stringify(array1.slice().sort()); + const sortedArray2 = JSON.stringify(array2.slice().sort()); - let gridClassName = isGroup ? subcolumnMap[layout.columns] : columnMap[layout?.columns]; - let gridClassNameBottom = isGroup - ? subcolumnMap[servicesBottomRows?.length] - : servicesBottomRows[servicesTopRows?.length]; - if (gridClassName) gridClassName = ` grid auto-rows-max ${gridClassName} gap-x-2`; - if (gridClassNameBottom) gridClassNameBottom = ` grid auto-rows-max ${gridClassNameBottom} gap-x-2`; - if (!gridClassName) gridClassName = " flex flex-wrap gap-x-2"; - if (!gridClassNameBottom) gridClassNameBottom = " flex flex-wrap gap-x-2"; + return sortedArray1 === sortedArray2; +} - useEffect(() => { - const resizeObserver = new ResizeObserver((entries) => { - for (let i = 0; i < entries.length; i += 1) { - const entry = entries[i]; - const { width } = entry.contentRect; - const remSize = parseFloat(getComputedStyle(document.documentElement).fontSize); +// eslint-disable-next-line react/display-name +const List = memo( + ({ group, services, layout, isGroup = false, propagate = [], setPropagate, isStyleCombined = false }) => { + const containerRef = useRef(null); + const [childrensToSlice, setChildrensToSlice] = useState(0); + const [servicesToPropagate, setServicesToPropagate] = useState({}); - const itemRemSize = itemRemSizeMap[parseInt(layout?.columns, 10)]; - - const remWidth = width / remSize; - const maxChildrenFit = Math.floor(remWidth / itemRemSize); - - if (numberOfServices < maxChildrenFit) return setChildrensToSlice(0); - const toSlice = - remWidth / itemRemSize > 1 && numberOfServices > Math.min(maxChildrenFit, layout.columns) - ? numberOfServices % Math.min(maxChildrenFit, layout.columns) - : 0; - setChildrensToSlice(toSlice); - } - return true; - }); - - if (containerRef.current) { - resizeObserver.observe(containerRef.current); - } - - return () => { - resizeObserver.disconnect(); + const setPropagateWrapper = (id) => (value) => { + if (areArraysEqual(servicesToPropagate[id] || [], value)) return; + setServicesToPropagate((prev) => ({ ...prev, [id]: value })); }; - }, [numberOfServices]); + const numberOfServices = useMemo(() => [...propagate, ...services].filter((e) => e).length, [propagate, services]); + const servicesTopRows = useMemo( + () => [...propagate, ...services].filter((v) => v).slice(0, numberOfServices - childrensToSlice), + [propagate, services, childrensToSlice, numberOfServices] + ); + const servicesBottomRows = useMemo( + () => [...propagate, ...services].filter((v) => v).slice(numberOfServices - childrensToSlice), + [propagate, services, childrensToSlice, numberOfServices] + ); - return ( - + ); + } +); +export default List; diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx index 006b233a..53eaed3e 100644 --- a/src/components/services/widget/container.jsx +++ b/src/components/services/widget/container.jsx @@ -59,7 +59,7 @@ export default function Container({ error = false, children, service }) { if (numberOfChildren > 1 && remWidth > 12) { if (numberOfChildren <= maxChildrenFit) return setChildrensToSlice(0); - setChildrensToSlice(remWidth / 6 > 1 ? parseInt(numberOfChildren / maxChildrenFit, 10) : 0); + setChildrensToSlice(remWidth / 6 > 1 ? numberOfChildren % maxChildrenFit : 0); } } return true;