assemblymade/meta

View on GitHub
app/assets/javascripts/stores/love_store.js

Summary

Maintainability
D
1 day
Test Coverage
var DiscussionStore = require('./discussion_store');
var Store = require('./es6_store')

var _heartables = {}
var _userHearts = {}

var Dispatcher = require('../dispatcher')
var ActionTypes = require('../constants').ActionTypes;
var LoveActionCreators = require('../actions/love_action_creators');

class LoveStore extends Store {
  constructor() {
    super()

    this.dispatchToken = Dispatcher.register((action) => {
      switch(action.type) {
        case ActionTypes.COMMENT_ADDED:
          var comment = action.data
          _heartables[comment.id] = {
            heartable_type: 'NewsFeedItemComment',
            heartable_id: comment.id,
            hearts_count: 0
          }
          break

        case ActionTypes.DISCUSSION_RECEIVE:
          setHeartables(action.comments);
          setUserHearts(action.userHearts);
          break

        case ActionTypes.NEWS_FEED_ITEM_CONFIRM_COMMENT:
          var data = action.data
          _heartables[data.comment.id] = {
            heartable_type: 'NewsFeedItemComment',
            heartable_id: data.comment.id,
            hearts_count: 0
          }
          break

        case ActionTypes.LOVE_RECEIVE_HEARTABLES:
          _heartables = _.reduce(
            action.heartables,
            function(memo, h) {
              memo[h.id] = h;
              return memo
            },
            {}
          );
          break

        case ActionTypes.LOVE_RECEIVE_ALL_HEARTS:
          break

        case ActionTypes.LOVE_RECEIVE_USER_HEARTS:
          _userHearts = _.reduce(
            action.userHearts,
            function(memo, h) {
              memo[h.heartable_id] = h;
              return memo
            },
            {}
          );
          break

        case ActionTypes.LOVE_CLICKED:
          _heartables[action.heartable_id].hearts_count += 1
          _userHearts[action.heartable_id] = {} // optimistic heart
          break

        case ActionTypes.LOVE_UNCLICKED:
          _heartables[action.heartable_id].hearts_count -= 1
          delete _userHearts[action.heartable_id]
          break

        case ActionTypes.LOVE_RECEIVE_RECENT_HEARTS:
          _(action.recent_hearts).each(function(heart) {
            if (!_heartables[heart.heartable_id]) {
              _heartables[heart.heartable_id] = {};
            }

            if (!_heartables[heart.heartable_id].hearts) {
              _heartables[heart.heartable_id].hearts = []
            }

            _heartables[heart.heartable_id].hearts.push(heart)
          })

          _(action.user_hearts).each(function(heart){
            _userHearts[heart.heartable_id] = heart
          })
          break

        case ActionTypes.WIP_EVENT_CREATED:
          var event = action.event
          _heartables[event.news_feed_item_comment_id] = {
            heartable_type: 'Event',
            heartable_id: event.news_feed_item_comment_id,
            hearts_count: 0
          }
          break

        case ActionTypes.NEWS_FEED_RECEIVE_RAW_ITEMS:
          var items = action.data.items
          _(items).each(function(item){
            var heartables = [item].concat(item.last_comment)
            _(heartables).each(function(h){
              if (h) {
                _heartables[h.heartable_id] = {
                  heartable_type: h.heartable_type,
                  heartable_id: h.heartable_id,
                  hearts_count: h.hearts_count
                }
              }
            })
          })
          var userHearts = action.data.user_hearts
          _(userHearts || []).each(function(h){
            _userHearts[h.heartable_id] = h
          })

          break

        case ActionTypes.CHAT_MESSAGE_RECEIVE_ACTIVITIES:
          _(action.activities).each(function(activity){
            _heartables[activity.id] = {
              heartable_type: 'Activity',
              heartable_id: activity.id,
              hearts_count: activity.hearts_count
            }
          })
          break

        default:
          return
      } // switch
      this.emitChange()
    }) // register
  }

  get(heartable_id) {
    var heartable = _.extend({}, _heartables[heartable_id])
    if (_userHearts[heartable_id]) {
      heartable.user_heart = _userHearts[heartable_id]
    }
    return heartable
  }

  getAllHeartableIds() {
    return _.keys(_heartables)
  }
}

var store = new LoveStore();

function setHeartables(heartables) {
  _heartables = _.extend(_heartables, _.reduce(heartables, _reduceHeartables, {}));
}

function setUserHearts(heartables) {
  _userHearts = _.extend(_userHearts, _.reduce(heartables, _reduceHeartables, {}));
}

function _reduceHeartables(memo, h) {
  memo[h.heartable_id || h.id] = h;
  return memo;
}

// Load initial data from script tags on the page (if they're present)
// TODO: Separate LoveStore and UserLoveStore

var loveStoreDataTag = document.getElementById('LoveStore')
if (loveStoreDataTag) {
  Dispatcher.dispatch({
    type: ActionTypes.LOVE_RECEIVE_HEARTABLES,
    heartables: JSON.parse(loveStoreDataTag.innerHTML)
  })
}
var userLoveStoreDataTag = document.getElementById('UserLoveStore')
if (userLoveStoreDataTag) {
  Dispatcher.dispatch({
    type: ActionTypes.LOVE_RECEIVE_USER_HEARTS,
    userHearts: JSON.parse(userLoveStoreDataTag.innerHTML)
  })
}

module.exports = store;