var GatherCounter = React.createClass({ render: function () { return (
  • Gatherers {this.props.count}
  • ); } }); var Gatherer = React.createClass({ render: function () { return (
  • {this.props.gatherer.username}
  • ); } }); var GathererMenu = React.createClass({ componentDidMount: function () { socket.on('gatherCount', this.updateGatherers); }, updateGatherers: function (data) { this.setProps({ count: data.count, gatherers: data.gatherers }); }, render: function () { var gatherers = this.props.gatherers.map(function (gatherer) { return ( ); }); return ( ); } }); var Chatroom = React.createClass({ componentDidMount: function () { var self = this; var TIMER_INTERVAL = 60000; // Every minute socket.on("message:new", function (data) { var history = self.props.history; history.push(data); self.setProps({ history: history }); self.scrollToBottom(); }); // Message History Retrieved socket.on("message:refresh", function (data) { self.setProps({ history: data.chatHistory }); self.scrollToBottom(); }); socket.emit("message:refresh", {}); self.timer = setInterval(function () { self.refs.messages.refreshTime(); }, TIMER_INTERVAL); }, componentDidUnmount: function () { clearInterval(this.timer); }, sendMessage: function (message) { socket.emit("newMessage", {message: message}); }, scrollToBottom: function () { var node = React.findDOMNode(this.refs.messageContainer); console.log(node) node.scrollTop = node.scrollHeight; }, render: function () { var messages = this.props.history.map(function (message) { return ( ); }); return (
    Gather Chat
      {messages}
    ); } }); var ChatMessage = React.createClass({ getInitialState: function () { return { timeAgo: $.timeago(this.props.createdAt) } }, refreshTime: function () { var self = this; self.setState({ timeAgo: $.timeago(self.props.createdAt) }); }, render: function () { return (
  • User Avatar
    {this.props.username} {this.state.timeAgo}

    {this.props.content}

  • ); } }); var MessageBar = React.createClass({ sendMessage: function (content) { socket.emit("message:new", { content: content }); }, handleSubmit: function (e) { e.preventDefault(); var content = React.findDOMNode(this.refs.content).value.trim(); if (!content) return; React.findDOMNode(this.refs.content).value = ''; this.sendMessage(content); return; }, render: function () { return (
    ); } }); React.render(, document.getElementById('side-menu')); React.render(, document.getElementById('chatroom'));