ilp-plugin-virtual
Version:
ILP virtual ledger plugin for directly transacting connectors
113 lines (96 loc) • 3.66 kB
JavaScript
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { CSSTransitionGroup } from 'react-transition-group'
import ReactPaginate from 'react-paginate'
import { getPage } from 'redux/actions/activity'
import { initActionCreators } from 'redux-pagination'
import ActivityPayment from 'containers/ActivityPayment/ActivityPayment'
import ActivitySettlement from 'containers/ActivitySettlement/ActivitySettlement'
import ActivityWithdrawal from 'containers/ActivityWithdrawal/ActivityWithdrawal'
import classNames from 'classnames/bind'
import styles from './Activity.scss'
const cx = classNames.bind(styles)
// TODO not sure the component is the best place for this
const paginationActionCreators = initActionCreators({
limit: 20,
path: '/activity_logs'
})
(
state => ({
activity: state.activity.list,
totalPages: state.activity.totalPages,
loadingPage: state.activity.loadingPage,
initialLoad: state.activity.initialLoad
}),
{getPage, ...paginationActionCreators})
export default class Home extends Component {
static propTypes = {
activity: PropTypes.array,
totalPages: PropTypes.number,
loadingPage: PropTypes.bool,
initialLoad: PropTypes.bool,
getPage: PropTypes.func
}
// Load the activity
componentWillMount () {
if (!this.props.initialLoad) {
this.props.getPage(1)
}
}
componentWillReceiveProps (nextProps) {
if (this.props.loadingPage === nextProps.loadingPage) return
window.scrollTo(0, 0)
}
handlePageClick = data => {
this.props.getPage(data.selected + 1)
tracker.track('Activity paginate')
}
render () {
const {activity, totalPages, loadingPage, initialLoad} = this.props
// TODO: Removed some ugly hacks related to the CSS transitions - probably
// need to go back later to fix transitions, hopefully with a cleaner
// method.
return (
<div className={cx('container')}>
<ul className={cx('list')}>
{activity.length > 0 && <CSSTransitionGroup transitionName={{
appear: cx('enter'),
appearActive: cx('enter-active'),
enter: cx('enter'),
enterActive: cx('enter-active'),
leave: cx('leave'),
leaveActive: cx('leave-active')
}} transitionAppearTimeout={1000} transitionEnterTimeout={1000} transitionLeaveTimeout={50}>
{activity.map(activity => (
<li key={activity.id}>
{activity.Payments.length > 0 &&
<ActivityPayment activity={activity} />}
{activity.Settlements.length > 0 &&
<ActivitySettlement activity={activity} />}
{activity.Withdrawals.length > 0 &&
<ActivityWithdrawal activity={activity} />}
</li>
))}
</CSSTransitionGroup>}
{initialLoad && activity.length === 0 && <li className={cx('loading')}>No payments to show</li>}
</ul>
{activity && activity.length > 0 &&
<div className={cx('pagination')}>
<ReactPaginate
pageCount={totalPages || 1}
pageRangeDisplayed={5}
marginPagesDisplayed={1}
previousLabel='«'
nextLabel='»'
onPageChange={this.handlePageClick}
breakLabel={<span>...</span>}
containerClassName='pagination'
activeClassName='active'
/>
{loadingPage && <span className={cx('loading')}>Loading...</span>}
</div>}
</div>
)
}
}