.map(function(update) {
            var moment = Moment(update.closed_at);
            var url = 'https://github.com/gabrielflorit/livecoding/issues/' + update.number;

            return (<li key={update.number}>
               <time dateTime={update.closed_at}>{moment.fromNow()}</time>
               <a href={url}>{update.title}</a>
            </li>);
         })
         .value();

  • Should we close the drawer?

          var closeDrawer = !this.state.open || !newUpdateNumbers.length;
  • If we close the drawer, return null. We need this so React knows how to add an exit transition before removing component from DOM.

          var drawer = closeDrawer ? null :
                <div className='updates' key={'drawer'}>
                   <header>
                      <h3>Updates</h3>
                      <button className='close' onClick={this.onButtonClick.bind(this, newUpdateNumbers)}>×</button>
                   </header>
                   <ul>
                      {updates}
                   </ul>
                </div>;
    
          var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup;
    
          return (
             <ReactCSSTransitionGroup transitionName='drawer' transitionEnter={false}>
                {drawer}
             </ReactCSSTransitionGroup>
          );
       },
    
    
  • Handle clicking the close button.

       onButtonClick: function(newUpdateNumbers) {
  • Save dismissed update numbers in local storage, so we don’t display them again.

          var dismissedUpdateNumbers = [];
          var localNumbers = localStorage.getItem(Updates.DISMISSED_UPDATE_NUMBERS);
          if (localNumbers) {
             dismissedUpdateNumbers = localNumbers.split(',').map(function(v) {
                return +v;
             });
          }
    
          var allDismissedNumbers = _.uniq(dismissedUpdateNumbers.concat(newUpdateNumbers));
    
          localStorage.setItem(Updates.DISMISSED_UPDATE_NUMBERS, allDismissedNumbers);
  • Change this component’s state to closed. This will trigger a re-render.

          this.setState({open: false});
       }
    
    });
    
    module.exports = Updates;