import classNames from 'classnames'; import * as React from 'react'; import type { KeyWiseTransferItem } from '.'; import type { PaginationType } from './interface'; import type { RenderedItem, TransferListProps } from './list'; import Pagination from '../pagination'; import ListItem from './ListItem'; export const OmitProps = ['handleFilter', 'handleClear', 'checkedKeys'] as const; export type OmitProp = typeof OmitProps[number]; type PartialTransferListProps = Omit, OmitProp>; export interface TransferListBodyProps extends PartialTransferListProps { filteredItems: RecordType[]; filteredRenderItems: RenderedItem[]; selectedKeys: string[]; } const parsePagination = (pagination?: PaginationType) => { if (!pagination) { return null; } const defaultPagination: PaginationType = { pageSize: 10, simple: true, showSizeChanger: false, showLessItems: false, }; if (typeof pagination === 'object') { return { ...defaultPagination, ...pagination }; } return defaultPagination; }; export interface ListBodyRef { items?: RenderedItem[]; } const TransferListBody: React.ForwardRefRenderFunction< ListBodyRef, TransferListBodyProps > = ( props: TransferListBodyProps, ref: React.ForwardedRef>, ) => { const { prefixCls, filteredRenderItems, selectedKeys, disabled: globalDisabled, showRemove, pagination, onScroll, onItemSelect, onItemRemove, } = props; const [current, setCurrent] = React.useState(1); React.useEffect(() => { const mergedPagination = parsePagination(pagination); if (mergedPagination) { const maxPageCount = Math.ceil(filteredRenderItems.length / mergedPagination.pageSize!); setCurrent(Math.min(current, maxPageCount)); } }, [filteredRenderItems, pagination]); const onClick = (item: RecordType) => { onItemSelect?.(item.key, !selectedKeys.includes(item.key)); }; const onRemove = (item: RecordType) => { onItemRemove?.([item.key]); }; const onPageChange = (cur: number) => { setCurrent(cur); }; const memoizedItems = React.useMemo[]>(() => { const mergedPagination = parsePagination(pagination); const displayItems = mergedPagination ? filteredRenderItems.slice( (current - 1) * mergedPagination.pageSize!, current * mergedPagination.pageSize!, ) : filteredRenderItems; return displayItems; }, [current, filteredRenderItems, pagination]); React.useImperativeHandle(ref, () => ({ items: memoizedItems })); const mergedPagination = parsePagination(pagination); const paginationNode: React.ReactNode = mergedPagination ? ( ) : null; const cls = classNames(`${prefixCls}-content`, { [`${prefixCls}-content-show-remove`]: showRemove, }); return ( <>
    {(memoizedItems || []).map(({ renderedEl, renderedText, item }) => ( ))}
{paginationNode} ); }; if (process.env.NODE_ENV !== 'production') { TransferListBody.displayName = 'TransferListBody'; } export default React.forwardRef< ListBodyRef, TransferListBodyProps >(TransferListBody);