import React, { useState, useImperativeHandle, useRef, useCallback, useEffect, useMemo, } from "react"; import InfoCard from "./InfoCard"; import Row from "../Row"; const gutter = 20; const cardBottom = 20; const InfoCardList = React.forwardRef((props, ref) => { const { mainKey, speed = 50, span = 4, withClassify = false, autoNext = true, classifyKey = { name: "name", children: "children" }, pageFinished, type = "move", extraColumnsOpt, ...otherProps } = props; const sizeRef = useRef(); const infoCardListRef = useRef(); const pageBoxRef = useRef(); const pageRef = useRef(1); const [data, setData] = useState([]); const [energy, setEnergy] = useState([]); const [autoScroll, setAutoScroll] = useState([0, 0]); const classifyRef = useRef([]); const classifyBoxRef = useRef(); const pageSize = useMemo(() => Math.floor(24 / span), [span]); const totalPage = useMemo(() => { if (withClassify) { let { children } = classifyKey; let size = 0; classifyRef.current = []; data.forEach((item) => { let itemPageSize = Math.ceil((item[children].length || 0) / pageSize); size += itemPageSize; classifyRef.current.push(size); }); return size; } else return Math.ceil(data.length / pageSize); }, [data, pageSize, withClassify, classifyKey]); const [pageHeight, setPageHeight] = useState(0); const setActiveClassify = useCallback( (page) => { if (!classifyBoxRef.current) return; let classifyIndex = classifyRef.current.findIndex((maxPageSize) => page <= maxPageSize) || 0; let { name } = classifyKey; let oprationname = data?.[classifyIndex]?.[name].split("】")[1]; let text = oprationname === undefined ? "" : "- " + oprationname; if (text) { classifyBoxRef.current.style.display = "block"; classifyBoxRef.current.innerText = text; } else classifyBoxRef.current.style.display = "none"; }, [data] ); const setPageBoxCss = useCallback( (page) => { pageRef.current = page; setActiveClassify(page); pageBoxRef.current.style.transition = page === 1 ? "none" : "transform 0.3s"; pageBoxRef.current.style.transform = `translateY(${ -(page - 1) * (pageHeight + cardBottom) }px)`; }, [pageHeight, setActiveClassify] ); const nextPage = useCallback(() => { // console.log(); let page = pageRef.current; if (page + 1 > totalPage) { if (autoNext) { setPageBoxCss(1); } else { pageFinished && pageFinished(); } } else { setPageBoxCss(page + 1); } }, [totalPage]); const moveChecking = useCallback(() => { let { offsetWidth, scrollWidth } = infoCardListRef.current; setAutoScroll([offsetWidth, scrollWidth]); }, [data]); const pageChecking = useCallback(() => { let { scrollHeight, offsetHeight } = sizeRef.current; setPageHeight(scrollHeight); }, []); useEffect(() => { if (type === "move") { let innerWindow = sizeRef.current.contentDocument.defaultView; innerWindow.addEventListener("resize", moveChecking); moveChecking(); return () => { innerWindow.removeEventListener("resize", moveChecking); }; } }, [moveChecking]); useEffect(() => { if (type === "page") { let innerWindow = sizeRef.current.contentDocument.defaultView; innerWindow.addEventListener("resize", pageChecking); pageChecking(); return () => { innerWindow.removeEventListener("resize", pageChecking); }; } }, [pageChecking]); useEffect(() => { setPageBoxCss(1); }, [data, setPageBoxCss]); useImperativeHandle( ref, () => ({ setData: (data) => { setData(data); setPageBoxCss(1); }, setEnergy:(data)=>{ setEnergy(data); }, nextPage, }), [nextPage] ); return (