From cf7a05f80f68b5b1c8bcc0089679dd497cec2506 Mon Sep 17 00:00:00 2001 From: =Corey Hulen Date: Sun, 14 Jun 2015 23:53:32 -0800 Subject: first commit --- web/react/stores/channel_store.jsx | 255 +++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 web/react/stores/channel_store.jsx (limited to 'web/react/stores/channel_store.jsx') diff --git a/web/react/stores/channel_store.jsx b/web/react/stores/channel_store.jsx new file mode 100644 index 000000000..3f259bc7d --- /dev/null +++ b/web/react/stores/channel_store.jsx @@ -0,0 +1,255 @@ +// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. +// See License.txt for license information. + +var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); +var EventEmitter = require('events').EventEmitter; +var assign = require('object-assign'); + +var Constants = require('../utils/constants.jsx'); +var ActionTypes = Constants.ActionTypes; + + +var CHANGE_EVENT = 'change'; +var MORE_CHANGE_EVENT = 'change'; +var EXTRA_INFO_EVENT = 'extra_info'; + +var ChannelStore = assign({}, EventEmitter.prototype, { + emitChange: function() { + this.emit(CHANGE_EVENT); + }, + addChangeListener: function(callback) { + this.on(CHANGE_EVENT, callback); + }, + removeChangeListener: function(callback) { + this.removeListener(CHANGE_EVENT, callback); + }, + emitMoreChange: function() { + this.emit(MORE_CHANGE_EVENT); + }, + addMoreChangeListener: function(callback) { + this.on(MORE_CHANGE_EVENT, callback); + }, + removeMoreChangeListener: function(callback) { + this.removeListener(MORE_CHANGE_EVENT, callback); + }, + emitExtraInfoChange: function() { + this.emit(EXTRA_INFO_EVENT); + }, + addExtraInfoChangeListener: function(callback) { + this.on(EXTRA_INFO_EVENT, callback); + }, + removeExtraInfoChangeListener: function(callback) { + this.removeListener(EXTRA_INFO_EVENT, callback); + }, + get: function(id) { + var current = null; + var c = this._getChannels(); + + c.some(function(channel) { + if (channel.id == id) { + current = channel; + return true; + } + return false; + }); + + return current; + }, + getMember: function(id) { + var current = null; + return this.getAllMembers()[id]; + }, + getByName: function(name) { + var current = null; + var c = this._getChannels(); + + c.some(function(channel) { + if (channel.name == name) { + current = channel; + return true; + } + + return false; + + }); + + return current; + + }, + getAll: function() { + return this._getChannels(); + }, + getAllMembers: function() { + return this._getChannelMembers(); + }, + getMoreAll: function() { + return this._getMoreChannels(); + }, + setCurrentId: function(id) { + if (id == null) + sessionStorage.removeItem("current_channel_id"); + else + sessionStorage.setItem("current_channel_id", id); + }, + setLastVisitedName: function(name) { + if (name == null) + localStorage.removeItem("last_visited_name"); + else + localStorage.setItem("last_visited_name", name); + }, + getLastVisitedName: function() { + return localStorage.getItem("last_visited_name"); + }, + resetCounts: function(id) { + var cm = this._getChannelMembers(); + for (var cmid in cm) { + if (cm[cmid].channel_id == id) { + var c = this.get(id); + if (c) { + cm[cmid].msg_count = this.get(id).total_msg_count; + cm[cmid].mention_count = 0; + } + break; + } + } + this._storeChannelMembers(cm); + }, + getCurrentId: function() { + return sessionStorage.getItem("current_channel_id"); + }, + getCurrent: function() { + var currentId = ChannelStore.getCurrentId(); + + if (currentId != null) + return this.get(currentId); + else + return null; + }, + getCurrentMember: function() { + var currentId = ChannelStore.getCurrentId(); + + if (currentId != null) + return this.getAllMembers()[currentId]; + else + return null; + }, + setChannelMember: function(member) { + var members = this._getChannelMembers(); + members[member.channel_id] = member; + this._storeChannelMembers(members); + this.emitChange(); + }, + getCurrentExtraInfo: function() { + var currentId = ChannelStore.getCurrentId(); + var extra = null; + + if (currentId != null) + extra = this._getExtraInfos()[currentId]; + + if (extra == null) + extra = {members: []}; + + return extra; + }, + getExtraInfo: function(channel_id) { + var extra = null; + + if (channel_id != null) + extra = this._getExtraInfos()[channel_id]; + + if (extra == null) + extra = {members: []}; + + return extra; + }, + _storeChannels: function(channels) { + sessionStorage.setItem("channels", JSON.stringify(channels)); + }, + _getChannels: function() { + var channels = []; + try { + channels = JSON.parse(sessionStorage.channels); + } + catch (err) { + } + + return channels; + }, + _storeChannelMembers: function(channelMembers) { + sessionStorage.setItem("channel_members", JSON.stringify(channelMembers)); + }, + _getChannelMembers: function() { + var members = {}; + try { + members = JSON.parse(sessionStorage.channel_members); + } + catch (err) { + } + + return members; + }, + _storeMoreChannels: function(channels) { + sessionStorage.setItem("more_channels", JSON.stringify(channels)); + }, + _getMoreChannels: function() { + var channels = []; + try { + channels = JSON.parse(sessionStorage.more_channels); + } + catch (err) { + } + + return channels; + }, + _storeExtraInfos: function(extraInfos) { + sessionStorage.setItem("extra_infos", JSON.stringify(extraInfos)); + }, + _getExtraInfos: function() { + var members = {}; + try { + members = JSON.parse(sessionStorage.extra_infos); + } + catch (err) { + } + + return members; + } +}); + +ChannelStore.dispatchToken = AppDispatcher.register(function(payload) { + var action = payload.action; + + switch(action.type) { + + case ActionTypes.CLICK_CHANNEL: + ChannelStore.setCurrentId(action.id); + ChannelStore.setLastVisitedName(action.name); + ChannelStore.resetCounts(action.id); + ChannelStore.emitChange(); + break; + + case ActionTypes.RECIEVED_CHANNELS: + ChannelStore._storeChannels(action.channels); + ChannelStore._storeChannelMembers(action.members); + var currentId = ChannelStore.getCurrentId(); + if (currentId) ChannelStore.resetCounts(currentId); + ChannelStore.emitChange(); + break; + + case ActionTypes.RECIEVED_MORE_CHANNELS: + ChannelStore._storeMoreChannels(action.channels); + ChannelStore.emitMoreChange(); + break; + + case ActionTypes.RECIEVED_CHANNEL_EXTRA_INFO: + var extra_infos = ChannelStore._getExtraInfos(); + extra_infos[action.extra_info.id] = action.extra_info; + ChannelStore._storeExtraInfos(extra_infos); + ChannelStore.emitExtraInfoChange(); + break; + + default: + } +}); + +module.exports = ChannelStore; -- cgit v1.2.3-1-g7c22