aboutsummaryrefslogtreecommitdiff
path: root/src/web/js/components/Menu.react.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/web/js/components/Menu.react.js')
-rw-r--r--src/web/js/components/Menu.react.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/web/js/components/Menu.react.js b/src/web/js/components/Menu.react.js
new file mode 100644
index 00000000..caf8c3a8
--- /dev/null
+++ b/src/web/js/components/Menu.react.js
@@ -0,0 +1,119 @@
+var React = require('react');
+var MenuStore = require('../stores/MenuStore');
+var MenuActions = require('../actions/MenuActions');
+var MiddlePanelActions = require('../actions/MiddlePanelActions');
+
+var FeedItem = React.createClass({
+ propTypes: {feed_id: React.PropTypes.number.isRequired,
+ title: React.PropTypes.string.isRequired,
+ unread: React.PropTypes.number.isRequired,
+ icon_url: React.PropTypes.string,
+ },
+ getInitialState: function() {
+ return {feed_id: this.props.feed_id,
+ title: this.props.title,
+ unread: this.props.unread,
+ icon_url: this.props.icon_url,
+ };
+ },
+ render: function() {
+ var unread = undefined;
+ var icon = undefined;
+ if(this.state.icon_url){
+ icon = (<img width="16px" src={this.state.icon_url} />);
+ } else {
+ icon = (<span className="glyphicon glyphicon-ban-circle" />);
+ }
+ if(this.state.unread){
+ unread = (
+ <span className="badge pull-right">
+ {this.state.unread}
+ </span>
+ );
+ }
+ return (<li onMouseDown={this.handleClick}>
+ {icon} {this.state.title} {unread}
+ </li>
+ );
+ },
+ handleClick: function() {
+ MiddlePanelActions.setFeedFilter(this.state.feed_id);
+ },
+});
+
+var Category = React.createClass({
+ propTypes: {category_id: React.PropTypes.number.isRequired,
+ name: React.PropTypes.string.isRequired,
+ feeds: React.PropTypes.array.isRequired,
+ unread: React.PropTypes.number.isRequired,
+ },
+ getInitialState: function() {
+ return {category_id: this.props.category_id,
+ name: this.props.name,
+ feeds: this.props.feeds,
+ unread: this.props.unread,
+ };
+ },
+ render: function() {
+ unread = undefined;
+ if(this.state.unread){
+ unread = (
+ <span className="badge pull-right">
+ {this.state.unread}
+ </span>
+ );
+ }
+ return (<div>
+ <h3 onMouseDown={this.handleClick}>
+ {this.state.name} {unread}
+ </h3>
+ <ul className="nav nav-sidebar">
+ {this.state.feeds.map(function(feed){
+ return <FeedItem key={"feed" + feed.id}
+ feed_id={feed.id}
+ title={feed.title}
+ unread={feed.unread}
+ icon_url={feed.icon_url} />;})}
+ </ul>
+ </div>
+ );
+ },
+ handleClick: function() {
+ MiddlePanelActions.setCategoryFilter(this.state.category_id);
+ },
+});
+
+var Menu = React.createClass({
+ getInitialState: function() {
+ return {categories: [], all_unread_count: 0};
+ },
+ render: function() {
+ return (<div id="sidebar" data-spy="affix" role="navigation"
+ className="col-md-2 sidebar sidebar-offcanvas pre-scrollable hidden-sm hidden-xs affix">
+ {this.state.categories.map(function(category){
+ return (<Category key={"cat" + category.id}
+ category_id={category.id}
+ feeds={category.feeds}
+ name={category.name}
+ unread={category.unread} />);
+ })}
+
+ </div>
+ );
+ },
+
+ componentDidMount: function() {
+ MenuActions.reload();
+ MenuStore.addChangeListener(this._onChange);
+ },
+ componentWillUnmount: function() {
+ MenuStore.removeChangeListener(this._onChange);
+ },
+ _onChange: function() {
+ var datas = MenuStore.getAll();
+ this.setState({categories: datas.categories,
+ all_unread_count: datas.all_unread_count});
+ },
+});
+
+module.exports = Menu;
bgstack15