/**
 * PostList component
 *
 * Generated by coz on 2016-12-11,
 * from a template provided by apeman-asset-templates.
 *
 * @function PostList
 */
'use strict'

import React from 'react'
import defineDebug from 'debug'
import PostListItem from './post_list_item'
import classnames from 'classnames'
import ReactCSSTransitionGroup from 'react/lib/ReactCSSTransitionGroup'
import { uniqueEntities } from 'ore-fol-helpers'
import { ApButton } from 'apeman-react-basic'
import { asPure } from '../../wrappers'

const debug = defineDebug('project:fragment:post-list')

/** @lends PostList */
const PostList = ({
  heading,
  posts,
  spinning = false,
  starActiveHash = {},
  starSpinHash = {},
  ellipsesOpenHash = {},
  tipOpenHash = {},
  bannableHash = {},
  destroyableHash = {},
  onDetail,
  onStar,
  onComments,
  onTip,
  onBan,
  onEllipses,
  onShare,
  onReport,
  onTag,
  onDestroy,
  hasMore,
  moreSpinning,
  simple = false,
  moreText,
  onMore,
  alt,
  wrap
}) => (
  <div className='post-list-container'>
    {
      heading ? (
          <h3 className='post-list-header ap-list-header'>{ heading }</h3>
        ) : null
    }
    <ReactCSSTransitionGroup
      component='ul'
      className={ classnames('post-list', {
        'post-list-wrap': wrap,
        'post-list-spinning': spinning
      }) }
      transitionName="post-list-animation"
      transitionEnterTimeout={ 500 }
      transitionLeaveTimeout={ 300 }>
      {
        (posts.length === 0) ? (
            <li className="post-list-alt">{ alt }</li>
          ) : (
            uniqueEntities(posts).map((post) => (
              <PostListItem key={ post.id }
                            simple={ simple }
                            post={ post }
                            starActive={ starActiveHash[ post.id ] }
                            starSpinning={ starSpinHash[ post.id ] }
                            ellipsesOpen={ ellipsesOpenHash[ post.id ] }
                            tipOpen={ tipOpenHash[ post.id ] }
                            banned={ post.banned }
                            bannable={ bannableHash[ post.id ] }
                            destroyable={ destroyableHash[ post.id ] }
                            { ...{
                              onStar,
                              onComments,
                              onTip,
                              onEllipses,
                              onShare,
                              onBan,
                              onDetail,
                              onReport,
                              onTag,
                              onDestroy
                            } }
              />
            ))
          )
      }
      {
        hasMore ? (
            <ApButton className='post-list-more-button'
                      onTap={ onMore }
                      spinning={ moreSpinning }
            >{ moreText }</ApButton>
          ) : null
      }
    </ReactCSSTransitionGroup>
  </div>
)

export default asPure()(PostList)
