import React from 'react'; import classNames from 'classnames'; export interface ListItemProps { className?: string; children?: React.ReactNode; prefixCls?: string; style?: React.CSSProperties; extra: React.ReactNode; actions?: Array; Meta: React.ReactNode; Content: React.ReactNode; } export interface ListItemMetaProps { avatar?: React.ReactNode; className?: string; children?: React.ReactNode; description: React.ReactNode; prefixCls?: string; style?: React.CSSProperties; title: React.ReactNode; } export const Meta = (props: ListItemMetaProps) => { const { prefixCls = 'ant-list', className, avatar, title, description, ...others, } = props; const classString = classNames(`${prefixCls}-item-meta`, className); const content = (
{title &&

{title}

} {description &&

{description}

}
); return (
{avatar &&
{avatar}
} {(title || description) && content}
); }; export default class Item extends React.Component { static Meta: typeof Meta = Meta; _id: number = new Date().getTime(); render() { const { prefixCls = 'ant-list', children, actions, extra, className, ...others } = this.props; const classString = classNames(`${prefixCls}-item`, className); const metaContent: React.ReactElement[] = []; const otherContent: React.ReactElement[] = []; React.Children.forEach(children, (element: React.ReactElement) => { if (element && element.type && element.type === Meta) { metaContent.push(element); } else { otherContent.push(element); } }); const content = (
{otherContent}
); let actionsContent; if (actions && actions.length > 0) { const actionsContentItem = (action, i) => (
  • {action} {i !== (actions.length - 1) && }
  • ); actionsContent = (
      {actions.map((action, i) => actionsContentItem(action, i))}
    ); } const extraContent = (
    {metaContent} {content} {actionsContent}
    {extra}
    ); return (
    {extra && extraContent} {!extra && metaContent} {!extra && content} {!extra && actionsContent}
    ); } }