1
0
mirror of https://github.com/fazo96/ipfs-boards synced 2025-01-10 12:24:20 +01:00
ipfs-boards/webapp/components/postlist.jsx
Enrico Fasoli 58af5f5e71 bugfixing
2015-12-21 16:27:08 +01:00

84 lines
2.5 KiB
JavaScript

var React = require('react')
var sortedIndex = require('lodash.sortedindex')
var Icon = require('icon.jsx')
var Post = require('post.jsx')
module.exports = React.createClass({
getInitialState () {
return { posts: [] }
},
sortFn (a, b) {
return (b.date || 0) - (a.date || 0)
},
componentWillReceiveProps (props) {
if (props.api && (this.props.board !== props.board || this.props.admin !== props.admin)) {
this.init(props.api, props)
}
},
init (boards, props) {
var onPost = (hash, date, post) => {
if (!this.isMounted()) return true
var now = parseInt((new Date()).getTime() / 1000, 10)
var posts = this.state.posts
if (date === undefined || date <= 0) {
posts.push(hash)
} else /* if (date <= now) */ {
var i = sortedIndex(posts, post, (p) => now - date || now)
posts.splice(i, 0, hash)
} /* else {
console.log('Post discarded cause date in the future:', hash)
}*/
this.setState({ posts })
}
props = props || this.props
boards.getEventEmitter().on('post in ' + props.board + (props.admin ? '@' + props.admin : ''), onPost)
this.setState({ api: boards, limited: boards.limited })
if (boards.isInit) {
boards.getPostsInBoard(props.admin, props.board)
} else {
boards.getEventEmitter().on('init', (err, limited) => {
if (!err) {
boards.getPostsInBoard(props.admin, props.board)
} else {
this.setState({ limited })
}
})
}
},
componentDidMount () {
var boards = this.props.api
if (boards) {
if (boards.isInit || boards.limited) {
this.init(boards)
} else {
boards.getEventEmitter().on('init', (err, limited) => {
if ((!err || limited) && this.isMounted()) this.init(boards)
})
}
}
},
getPosts () {
if (this.state.posts.length > 0 || this.state.api) {
return this.state.posts.map(hash => {
return <Post key={hash} board={this.props.board} admin={this.props.admin} hash={hash} api={this.props.api} />
})
} else {
return <div className="center-block text-center">
<Icon name="refresh" className="fa-3x center-block light fa-spin" />
</div>
}
},
render () {
if (this.state.limited) {
return <div className="text-center">
<h5 className="light"><Icon name="ban" /></h5>
<p>Posts in a board can't be shown in limited mode. Sorry!</p>
</div>
} else {
return <div className="postList">
{this.getPosts()}
</div>
}
}
})