Inital support for multi-tab loging

Этот коммит содержится в:
=Corey Hulen
2015-10-16 09:10:54 -07:00
родитель c890e21cef
Коммит 6a1755d2e3
64 изменённых файлов: 409 добавлений и 313 удалений

Просмотреть файл

@@ -1,12 +1,12 @@
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
// See License.txt for license information.
var UserStore;
function getPrefix() {
if (!UserStore) {
UserStore = require('./user_store.jsx'); //eslint-disable-line global-require
if (global.window.mm_user) {
return global.window.mm_user.id + '_';
}
return UserStore.getCurrentId() + '_';
return 'unknown_';
}
class BrowserStoreClass {
@@ -17,32 +17,50 @@ class BrowserStoreClass {
this.setGlobalItem = this.setGlobalItem.bind(this);
this.getGlobalItem = this.getGlobalItem.bind(this);
this.removeGlobalItem = this.removeGlobalItem.bind(this);
this.clear = this.clear.bind(this);
this.actionOnItemsWithPrefix = this.actionOnItemsWithPrefix.bind(this);
this.actionOnGlobalItemsWithPrefix = this.actionOnGlobalItemsWithPrefix.bind(this);
this.isLocalStorageSupported = this.isLocalStorageSupported.bind(this);
this.getLastServerVersion = this.getLastServerVersion.bind(this);
this.setLastServerVersion = this.setLastServerVersion.bind(this);
this.clear = this.clear.bind(this);
var currentVersion = localStorage.getItem('local_storage_version');
if (currentVersion !== global.window.config.Version) {
this.clear();
localStorage.setItem('local_storage_version', global.window.config.Version);
var currentVersion = sessionStorage.getItem('storage_version');
if (currentVersion !== global.window.mm_config.Version) {
sessionStorage.clear();
sessionStorage.setItem('storage_version', global.window.mm_config.Version);
}
}
getItem(name, defaultValue) {
return this.getGlobalItem(getPrefix() + name, defaultValue);
var result = null;
try {
result = JSON.parse(sessionStorage.getItem(getPrefix() + name));
} catch (err) {
result = null;
}
if (result === null && typeof defaultValue !== 'undefined') {
result = defaultValue;
}
return result;
}
setItem(name, value) {
this.setGlobalItem(getPrefix() + name, value);
sessionStorage.setItem(getPrefix() + name, JSON.stringify(value));
}
removeItem(name) {
localStorage.removeItem(getPrefix() + name);
sessionStorage.removeItem(getPrefix() + name);
}
setGlobalItem(name, value) {
try {
localStorage.setItem(name, JSON.stringify(value));
if (this.isLocalStorageSupported()) {
localStorage.setItem(name, JSON.stringify(value));
} else {
sessionStorage.setItem(name, JSON.stringify(value));
}
} catch (err) {
console.log('An error occurred while setting local storage, clearing all props'); //eslint-disable-line no-console
localStorage.clear();
@@ -53,7 +71,11 @@ class BrowserStoreClass {
getGlobalItem(name, defaultValue) {
var result = null;
try {
result = JSON.parse(localStorage.getItem(name));
if (this.isLocalStorageSupported()) {
result = JSON.parse(localStorage.getItem(name));
} else {
result = JSON.parse(sessionStorage.getItem(name));
}
} catch (err) {
result = null;
}
@@ -66,19 +88,26 @@ class BrowserStoreClass {
}
removeGlobalItem(name) {
localStorage.removeItem(name);
if (this.isLocalStorageSupported()) {
localStorage.removeItem(name);
} else {
sessionStorage.removeItem(name);
}
}
clear() {
localStorage.clear();
sessionStorage.clear();
getLastServerVersion() {
return sessionStorage.getItem('last_server_version');
}
setLastServerVersion(version) {
sessionStorage.setItem('last_server_version', version);
}
/**
* Preforms the given action on each item that has the given prefix
* Signature for action is action(key, value)
*/
actionOnItemsWithPrefix(prefix, action) {
actionOnGlobalItemsWithPrefix(prefix, action) {
var globalPrefix = getPrefix();
var globalPrefixiLen = globalPrefix.length;
for (var key in localStorage) {
@@ -89,6 +118,21 @@ class BrowserStoreClass {
}
}
actionOnItemsWithPrefix(prefix, action) {
var globalPrefix = getPrefix();
var globalPrefixiLen = globalPrefix.length;
for (var key in sessionStorage) {
if (key.lastIndexOf(globalPrefix + prefix, 0) === 0) {
var userkey = key.substring(globalPrefixiLen);
action(userkey, this.getGlobalItem(key));
}
}
}
clear() {
sessionStorage.clear();
}
isLocalStorageSupported() {
try {
sessionStorage.setItem('testSession', '1');

Просмотреть файл

@@ -34,9 +34,11 @@ class ErrorStoreClass extends EventEmitter {
removeChangeListener(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
handledError() {
BrowserStore.removeItem('last_error');
}
getLastError() {
return BrowserStore.getItem('last_error');
}

Просмотреть файл

@@ -283,10 +283,10 @@ class PostStoreClass extends EventEmitter {
return 0;
});
BrowserStore.setItem('pending_posts_' + channelId, postList);
BrowserStore.setGlobalItem('pending_posts_' + channelId, postList);
}
getPendingPosts(channelId) {
return BrowserStore.getItem('pending_posts_' + channelId);
return BrowserStore.getGlobalItem('pending_posts_' + channelId);
}
storeUnseenDeletedPost(post) {
var posts = this.getUnseenDeletedPosts(post.channel_id);
@@ -330,7 +330,7 @@ class PostStoreClass extends EventEmitter {
this.pStorePendingPosts(channelId, postList);
}
clearPendingPosts() {
BrowserStore.actionOnItemsWithPrefix('pending_posts_', function clearPending(key) {
BrowserStore.actionOnGlobalItemsWithPrefix('pending_posts_', function clearPending(key) {
BrowserStore.removeItem(key);
});
}
@@ -373,26 +373,26 @@ class PostStoreClass extends EventEmitter {
}
storeCurrentDraft(draft) {
var channelId = ChannelStore.getCurrentId();
BrowserStore.setItem('draft_' + channelId, draft);
BrowserStore.setGlobalItem('draft_' + channelId, draft);
}
getCurrentDraft() {
var channelId = ChannelStore.getCurrentId();
return this.getDraft(channelId);
}
storeDraft(channelId, draft) {
BrowserStore.setItem('draft_' + channelId, draft);
BrowserStore.setGlobalItem('draft_' + channelId, draft);
}
getDraft(channelId) {
return BrowserStore.getItem('draft_' + channelId, this.getEmptyDraft());
return BrowserStore.getGlobalItem('draft_' + channelId, this.getEmptyDraft());
}
storeCommentDraft(parentPostId, draft) {
BrowserStore.setItem('comment_draft_' + parentPostId, draft);
BrowserStore.setGlobalItem('comment_draft_' + parentPostId, draft);
}
getCommentDraft(parentPostId) {
return BrowserStore.getItem('comment_draft_' + parentPostId, this.getEmptyDraft());
return BrowserStore.getGlobalItem('comment_draft_' + parentPostId, this.getEmptyDraft());
}
clearDraftUploads() {
BrowserStore.actionOnItemsWithPrefix('draft_', function clearUploads(key, value) {
BrowserStore.actionOnGlobalItemsWithPrefix('draft_', function clearUploads(key, value) {
if (value) {
value.uploadsInProgress = [];
BrowserStore.setItem(key, value);
@@ -400,7 +400,7 @@ class PostStoreClass extends EventEmitter {
});
}
clearCommentDraftUploads() {
BrowserStore.actionOnItemsWithPrefix('comment_draft_', function clearUploads(key, value) {
BrowserStore.actionOnGlobalItemsWithPrefix('comment_draft_', function clearUploads(key, value) {
if (value) {
value.uploadsInProgress = [];
BrowserStore.setItem(key, value);

Просмотреть файл

@@ -28,29 +28,31 @@ class TeamStoreClass extends EventEmitter {
this.get = this.get.bind(this);
this.getByName = this.getByName.bind(this);
this.getAll = this.getAll.bind(this);
this.setCurrentId = this.setCurrentId.bind(this);
this.getCurrentId = this.getCurrentId.bind(this);
this.getCurrent = this.getCurrent.bind(this);
this.getCurrentTeamUrl = this.getCurrentTeamUrl.bind(this);
this.storeTeam = this.storeTeam.bind(this);
this.pStoreTeams = this.pStoreTeams.bind(this);
this.pGetTeams = this.pGetTeams.bind(this);
this.saveTeam = this.saveTeam.bind(this);
}
emitChange() {
this.emit(CHANGE_EVENT);
}
addChangeListener(callback) {
this.on(CHANGE_EVENT, callback);
}
removeChangeListener(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
get(id) {
var c = this.pGetTeams();
var c = this.getAll();
return c[id];
}
getByName(name) {
var t = this.pGetTeams();
var t = this.getAll();
for (var id in t) {
if (t[id].name === name) {
@@ -60,59 +62,51 @@ class TeamStoreClass extends EventEmitter {
return null;
}
getAll() {
return this.pGetTeams();
}
setCurrentId(id) {
if (id === null) {
BrowserStore.removeItem('current_team_id');
} else {
BrowserStore.setItem('current_team_id', id);
}
}
getCurrentId() {
return BrowserStore.getItem('current_team_id');
}
getCurrent() {
var currentId = this.getCurrentId();
if (currentId !== null) {
return this.get(currentId);
getAll() {
return BrowserStore.getItem('user_teams', {});
}
getCurrentId() {
var team = global.window.mm_team;
if (team) {
return team.id;
}
return null;
}
getCurrent() {
if (global.window.mm_team != null && this.get(global.window.mm_team.id) == null) {
this.saveTeam(global.window.mm_team);
}
return global.window.mm_team;
}
getCurrentTeamUrl() {
if (this.getCurrent()) {
return getWindowLocationOrigin() + '/' + this.getCurrent().name;
}
return null;
}
storeTeam(team) {
var teams = this.pGetTeams();
saveTeam(team) {
var teams = this.getAll();
teams[team.id] = team;
this.pStoreTeams(teams);
}
pStoreTeams(teams) {
BrowserStore.setItem('user_teams', teams);
}
pGetTeams() {
return BrowserStore.getItem('user_teams', {});
}
}
var TeamStore = new TeamStoreClass();
TeamStore.dispatchToken = AppDispatcher.register(function registry(payload) {
TeamStore.dispatchToken = AppDispatcher.register((payload) => {
var action = payload.action;
switch (action.type) {
case ActionTypes.CLICK_TEAM:
TeamStore.setCurrentId(action.id);
TeamStore.emitChange();
break;
case ActionTypes.RECIEVED_TEAM:
TeamStore.storeTeam(action.team);
TeamStore.saveTeam(action.team);
TeamStore.emitChange();
break;

Просмотреть файл

@@ -3,7 +3,6 @@
var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
var EventEmitter = require('events').EventEmitter;
var client = require('../utils/client.jsx');
var Constants = require('../utils/constants.jsx');
var ActionTypes = Constants.ActionTypes;
@@ -38,13 +37,11 @@ class UserStoreClass extends EventEmitter {
this.emitToggleImportModal = this.emitToggleImportModal.bind(this);
this.addImportModalListener = this.addImportModalListener.bind(this);
this.removeImportModalListener = this.removeImportModalListener.bind(this);
this.setCurrentId = this.setCurrentId.bind(this);
this.getCurrentId = this.getCurrentId.bind(this);
this.getCurrentUser = this.getCurrentUser.bind(this);
this.setCurrentUser = this.setCurrentUser.bind(this);
this.getLastEmail = this.getLastEmail.bind(this);
this.setLastEmail = this.setLastEmail.bind(this);
this.removeCurrentUser = this.removeCurrentUser.bind(this);
this.hasProfile = this.hasProfile.bind(this);
this.getProfile = this.getProfile.bind(this);
this.getProfileByUsername = this.getProfileByUsername.bind(this);
@@ -52,9 +49,6 @@ class UserStoreClass extends EventEmitter {
this.getProfiles = this.getProfiles.bind(this);
this.getActiveOnlyProfiles = this.getActiveOnlyProfiles.bind(this);
this.saveProfile = this.saveProfile.bind(this);
this.pStoreProfiles = this.pStoreProfiles.bind(this);
this.pGetProfiles = this.pGetProfiles.bind(this);
this.pGetProfilesUsernameMap = this.pGetProfilesUsernameMap.bind(this);
this.setSessions = this.setSessions.bind(this);
this.getSessions = this.getSessions.bind(this);
this.setAudits = this.setAudits.bind(this);
@@ -62,138 +56,155 @@ class UserStoreClass extends EventEmitter {
this.setTeams = this.setTeams.bind(this);
this.getTeams = this.getTeams.bind(this);
this.getCurrentMentionKeys = this.getCurrentMentionKeys.bind(this);
this.getLastVersion = this.getLastVersion.bind(this);
this.setLastVersion = this.setLastVersion.bind(this);
this.setStatuses = this.setStatuses.bind(this);
this.pSetStatuses = this.pSetStatuses.bind(this);
this.setStatus = this.setStatus.bind(this);
this.getStatuses = this.getStatuses.bind(this);
this.getStatus = this.getStatus.bind(this);
this.gCurrentId = null;
}
emitChange(userId) {
this.emit(CHANGE_EVENT, userId);
}
addChangeListener(callback) {
this.on(CHANGE_EVENT, callback);
}
removeChangeListener(callback) {
this.removeListener(CHANGE_EVENT, callback);
}
emitSessionsChange() {
this.emit(CHANGE_EVENT_SESSIONS);
}
addSessionsChangeListener(callback) {
this.on(CHANGE_EVENT_SESSIONS, callback);
}
removeSessionsChangeListener(callback) {
this.removeListener(CHANGE_EVENT_SESSIONS, callback);
}
emitAuditsChange() {
this.emit(CHANGE_EVENT_AUDITS);
}
addAuditsChangeListener(callback) {
this.on(CHANGE_EVENT_AUDITS, callback);
}
removeAuditsChangeListener(callback) {
this.removeListener(CHANGE_EVENT_AUDITS, callback);
}
emitTeamsChange() {
this.emit(CHANGE_EVENT_TEAMS);
}
addTeamsChangeListener(callback) {
this.on(CHANGE_EVENT_TEAMS, callback);
}
removeTeamsChangeListener(callback) {
this.removeListener(CHANGE_EVENT_TEAMS, callback);
}
emitStatusesChange() {
this.emit(CHANGE_EVENT_STATUSES);
}
addStatusesChangeListener(callback) {
this.on(CHANGE_EVENT_STATUSES, callback);
}
removeStatusesChangeListener(callback) {
this.removeListener(CHANGE_EVENT_STATUSES, callback);
}
emitToggleImportModal(value) {
this.emit(TOGGLE_IMPORT_MODAL_EVENT, value);
}
addImportModalListener(callback) {
this.on(TOGGLE_IMPORT_MODAL_EVENT, callback);
}
removeImportModalListener(callback) {
this.removeListener(TOGGLE_IMPORT_MODAL_EVENT, callback);
}
setCurrentId(id) {
this.gCurrentId = id;
if (id == null) {
BrowserStore.removeGlobalItem('current_user_id');
getCurrentUser() {
if (this.getProfiles()[global.window.mm_user.id] == null) {
this.saveProfile(global.window.mm_user);
}
return global.window.mm_user;
}
setCurrentUser(user) {
var oldUser = global.window.mm_user;
if (oldUser.id === user.id) {
global.window.mm_user = user;
this.saveProfile(user);
} else {
BrowserStore.setGlobalItem('current_user_id', id);
throw new Error('Problem with setCurrentUser old_user_id=' + oldUser.id + ' new_user_id=' + user.id);
}
}
getCurrentId(skipFetch) {
var currentId = this.gCurrentId;
if (currentId == null) {
currentId = BrowserStore.getGlobalItem('current_user_id');
this.gCurrentId = currentId;
getCurrentId() {
var user = global.window.mm_user;
if (user) {
return user.id;
}
// this is a special case to force fetch the
// current user if it's missing
// it's synchronous to block rendering
if (currentId == null && !skipFetch) {
var me = client.getMeSynchronous();
if (me != null) {
this.setCurrentUser(me);
currentId = me.id;
return null;
}
getLastEmail() {
return BrowserStore.getGlobalItem('last_email', '');
}
setLastEmail(email) {
BrowserStore.setGlobalItem('last_email', email);
}
hasProfile(userId) {
return this.getProfiles()[userId] != null;
}
getProfile(userId) {
return this.getProfiles()[userId];
}
getProfileByUsername(username) {
return this.getProfilesUsernameMap()[username];
}
getProfilesUsernameMap() {
var profileUsernameMap = {};
var profiles = this.getProfiles();
for (var key in profiles) {
if (profiles.hasOwnProperty(key)) {
var profile = profiles[key];
profileUsernameMap[profile.username] = profile;
}
}
return currentId;
return profileUsernameMap;
}
getCurrentUser() {
if (this.getCurrentId() == null) {
return null;
}
return this.pGetProfiles()[this.getCurrentId()];
}
setCurrentUser(user) {
this.setCurrentId(user.id);
this.saveProfile(user);
}
getLastEmail() {
return BrowserStore.getItem('last_email', '');
}
setLastEmail(email) {
BrowserStore.setItem('last_email', email);
}
removeCurrentUser() {
this.setCurrentId(null);
}
hasProfile(userId) {
return this.pGetProfiles()[userId] != null;
}
getProfile(userId) {
return this.pGetProfiles()[userId];
}
getProfileByUsername(username) {
return this.pGetProfilesUsernameMap()[username];
}
getProfilesUsernameMap() {
return this.pGetProfilesUsernameMap();
}
getProfiles() {
return this.pGetProfiles();
return BrowserStore.getItem('profiles', {});
}
getActiveOnlyProfiles() {
var active = {};
var current = this.pGetProfiles();
var current = this.getProfiles();
for (var key in current) {
if (current[key].delete_at === 0) {
@@ -203,45 +214,37 @@ class UserStoreClass extends EventEmitter {
return active;
}
saveProfile(profile) {
var ps = this.pGetProfiles();
var ps = this.getProfiles();
ps[profile.id] = profile;
this.pStoreProfiles(ps);
}
pStoreProfiles(profiles) {
BrowserStore.setItem('profiles', profiles);
var profileUsernameMap = {};
for (var id in profiles) {
if (profiles.hasOwnProperty(id)) {
profileUsernameMap[profiles[id].username] = profiles[id];
}
}
BrowserStore.setItem('profileUsernameMap', profileUsernameMap);
}
pGetProfiles() {
return BrowserStore.getItem('profiles', {});
}
pGetProfilesUsernameMap() {
return BrowserStore.getItem('profileUsernameMap', {});
BrowserStore.setItem('profiles', ps);
}
setSessions(sessions) {
BrowserStore.setItem('sessions', sessions);
}
getSessions() {
return BrowserStore.getItem('sessions', {loading: true});
}
setAudits(audits) {
BrowserStore.setItem('audits', audits);
}
getAudits() {
return BrowserStore.getItem('audits', {loading: true});
}
setTeams(teams) {
BrowserStore.setItem('teams', teams);
}
getTeams() {
return BrowserStore.getItem('teams', []);
}
getCurrentMentionKeys() {
var user = this.getCurrentUser();
@@ -269,28 +272,27 @@ class UserStoreClass extends EventEmitter {
return keys;
}
getLastVersion() {
return BrowserStore.getItem('last_version', '');
}
setLastVersion(version) {
BrowserStore.setItem('last_version', version);
}
setStatuses(statuses) {
this.pSetStatuses(statuses);
this.emitStatusesChange();
}
pSetStatuses(statuses) {
BrowserStore.setItem('statuses', statuses);
}
setStatus(userId, status) {
var statuses = this.getStatuses();
statuses[userId] = status;
this.pSetStatuses(statuses);
this.emitStatusesChange();
}
getStatuses() {
return BrowserStore.getItem('statuses', {});
}
getStatus(id) {
return this.getStatuses()[id];
}
@@ -299,7 +301,7 @@ class UserStoreClass extends EventEmitter {
var UserStore = new UserStoreClass();
UserStore.setMaxListeners(0);
UserStore.dispatchToken = AppDispatcher.register(function registry(payload) {
UserStore.dispatchToken = AppDispatcher.register((payload) => {
var action = payload.action;
switch (action.type) {