summaryrefslogtreecommitdiffstats
path: root/web/react/stores/channel_store.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'web/react/stores/channel_store.jsx')
-rw-r--r--web/react/stores/channel_store.jsx255
1 files changed, 255 insertions, 0 deletions
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;