import React, { useMemo, useContext, useState, useEffect } from 'react'; import { Empty, Row, Spin, Pagination } from 'antd'; import styles from './index.module.less'; import { Block, AddBlockParams, Resource } from '../../../data.d'; import Context from '../UIApiContext'; import BlockItem from './BlockItem'; interface BlockItemProps { type: Resource['blockType']; addingBlock?: Block; item: Block; disabled?: boolean; loading?: boolean; onShowModal?: (Block: Block, option: AddBlockParams) => void; keyword?: string; } interface BlockListProps extends Omit { name?: string; selectedTag?: any; setSelectedTag?: any; list: Block[]; } const BlockList: React.FC = props => { const { list = [], setSelectedTag, selectedTag, addingBlock, keyword, loading } = props; const { api } = useContext(Context); const { intl } = api; const isMini = api.isMini(); const pageSize = isMini ? 6 : 8; const [currentPage, setCurrentPage] = useState(1); useEffect( () => { setSelectedTag(''); setCurrentPage(1); }, [list], ); useEffect( () => { setCurrentPage(1); }, [selectedTag], ); /** * 筛选区块列表 */ const filteredList: Block[] = useMemo( () => list.filter(({ name = '', url, description = '', category, tags: listTags = [] }) => { return ( (!selectedTag || (category ? category === selectedTag : listTags.join('').includes(selectedTag))) && (!keyword || name.toLocaleLowerCase().includes(keyword) || description.toLocaleLowerCase().includes(keyword) || url.toLocaleLowerCase().includes(keyword)) ); }), [keyword, selectedTag, list.map(({ url }) => url).join('/')], ); /** * 当前的列表项目,区块分页就是在这里做 */ const currentPageList: Block[] = useMemo( () => filteredList.slice( (currentPage - 1) * pageSize, currentPage * pageSize > filteredList.length ? filteredList.length : currentPage * pageSize, ), [filteredList, currentPage], ); /** * 是不是数据为空 */ const isEmpty = !currentPageList || currentPageList.length === 0; let contents; if (loading) { contents = (
); } else if (isEmpty) { // 切换为黑色背景图片 contents = (
); } else { contents = (
{currentPageList.map(item => ( ))} {filteredList.length > pageSize && ( )}
); } return
{contents}
; }; export default BlockList;