summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2017-03-08 04:13:16 -0500
committerGeorge Goldberg <george@gberg.me>2017-03-08 09:13:16 +0000
commitdb7540b111f8b9f983adcfc73fd897e5d83c2fef (patch)
treec26c39b4e7063dda503bd55dd75360c135145ae4
parent2bea17251ef90ab62381ebecaa97fc41c2c94f99 (diff)
downloadchat-db7540b111f8b9f983adcfc73fd897e5d83c2fef.tar.gz
chat-db7540b111f8b9f983adcfc73fd897e5d83c2fef.tar.bz2
chat-db7540b111f8b9f983adcfc73fd897e5d83c2fef.zip
Add sync logic for DMs/GMs when network reconnects (#5676)
-rw-r--r--webapp/actions/channel_actions.jsx29
-rw-r--r--webapp/actions/global_actions.jsx4
-rw-r--r--webapp/actions/websocket_actions.jsx20
-rw-r--r--webapp/components/needs_team.jsx4
-rw-r--r--webapp/utils/async_client.jsx41
5 files changed, 74 insertions, 24 deletions
diff --git a/webapp/actions/channel_actions.jsx b/webapp/actions/channel_actions.jsx
index df7bacac6..e3563d79c 100644
--- a/webapp/actions/channel_actions.jsx
+++ b/webapp/actions/channel_actions.jsx
@@ -9,14 +9,14 @@ import ChannelStore from 'stores/channel_store.jsx';
import * as ChannelUtils from 'utils/channel_utils.jsx';
import PreferenceStore from 'stores/preference_store.jsx';
-import {loadProfilesForSidebar} from 'actions/user_actions.jsx';
+import {loadProfilesForSidebar, loadNewDMIfNeeded, loadNewGMIfNeeded} from 'actions/user_actions.jsx';
import {trackEvent} from 'actions/diagnostics_actions.jsx';
import Client from 'client/web_client.jsx';
import * as AsyncClient from 'utils/async_client.jsx';
import * as UserAgent from 'utils/user_agent.jsx';
import * as Utils from 'utils/utils.jsx';
-import {Preferences, ActionTypes} from 'utils/constants.jsx';
+import {Constants, Preferences, ActionTypes} from 'utils/constants.jsx';
import {browserHistory} from 'react-router/es6';
@@ -283,8 +283,29 @@ export function unmarkFavorite(channelId) {
}
export function loadChannelsForCurrentUser() {
- AsyncClient.getChannels();
- AsyncClient.getMyChannelMembers();
+ AsyncClient.getChannels().then(() => {
+ AsyncClient.getMyChannelMembers().then(() => {
+ loadDMsAndGMsForUnreads();
+ });
+ });
+}
+
+export function loadDMsAndGMsForUnreads() {
+ const unreads = ChannelStore.getUnreadCounts();
+ for (const id in unreads) {
+ if (!unreads.hasOwnProperty(id)) {
+ continue;
+ }
+
+ if (unreads[id].msgs > 0 || unreads[id].mentions > 0) {
+ const channel = ChannelStore.get(id);
+ if (channel && channel.type === Constants.DM_CHANNEL) {
+ loadNewDMIfNeeded(Utils.getUserIdFromChannelName(channel));
+ } else if (channel && channel.type === Constants.GM_CHANNEL) {
+ loadNewGMIfNeeded(channel.id);
+ }
+ }
+ }
}
export function joinChannel(channel, success, error) {
diff --git a/webapp/actions/global_actions.jsx b/webapp/actions/global_actions.jsx
index e22c94294..c81478069 100644
--- a/webapp/actions/global_actions.jsx
+++ b/webapp/actions/global_actions.jsx
@@ -46,10 +46,10 @@ export function emitChannelClickEvent(channel) {
}
function switchToChannel(chan) {
const channelMember = ChannelStore.getMyMember(chan.id);
- const getMyChannelMembersPromise = AsyncClient.getChannelMember(chan.id, UserStore.getCurrentId());
+ const getMyChannelMemberPromise = AsyncClient.getChannelMember(chan.id, UserStore.getCurrentId());
const oldChannelId = ChannelStore.getCurrentId();
- getMyChannelMembersPromise.then(() => {
+ getMyChannelMemberPromise.then(() => {
AsyncClient.getChannelStats(chan.id, true);
AsyncClient.viewChannel(chan.id, oldChannelId);
loadPosts(chan.id);
diff --git a/webapp/actions/websocket_actions.jsx b/webapp/actions/websocket_actions.jsx
index 913a89221..e36d11fde 100644
--- a/webapp/actions/websocket_actions.jsx
+++ b/webapp/actions/websocket_actions.jsx
@@ -89,6 +89,26 @@ export function reconnect(includeWebSocket = true) {
ErrorStore.emitChange();
}
+let intervalId = '';
+const SYNC_INTERVAL_MILLISECONDS = 1000 * 60 * 15; // 15 minutes
+
+export function startPeriodicSync() {
+ clearInterval(intervalId);
+
+ intervalId = setInterval(
+ () => {
+ if (UserStore.getCurrentUser() != null) {
+ reconnect(false);
+ }
+ },
+ SYNC_INTERVAL_MILLISECONDS
+ );
+}
+
+export function stopPeriodicSync() {
+ clearInterval(intervalId);
+}
+
function handleFirstConnect() {
ErrorStore.clearLastError();
ErrorStore.emitChange();
diff --git a/webapp/components/needs_team.jsx b/webapp/components/needs_team.jsx
index fb6029c2b..5cb714ebc 100644
--- a/webapp/components/needs_team.jsx
+++ b/webapp/components/needs_team.jsx
@@ -14,6 +14,8 @@ import PreferenceStore from 'stores/preference_store.jsx';
import ChannelStore from 'stores/channel_store.jsx';
import * as GlobalActions from 'actions/global_actions.jsx';
import {startPeriodicStatusUpdates, stopPeriodicStatusUpdates} from 'actions/status_actions.jsx';
+import {startPeriodicSync, stopPeriodicSync} from 'actions/websocket_actions.jsx';
+
import Constants from 'utils/constants.jsx';
const TutorialSteps = Constants.TutorialSteps;
const Preferences = Constants.Preferences;
@@ -94,6 +96,7 @@ export default class NeedsTeam extends React.Component {
GlobalActions.viewLoggedIn();
startPeriodicStatusUpdates();
+ startPeriodicSync();
// Set up tracking for whether the window is active
window.isActive = true;
@@ -140,6 +143,7 @@ export default class NeedsTeam extends React.Component {
iNoBounce.disable();
}
stopPeriodicStatusUpdates();
+ stopPeriodicSync();
}
render() {
diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx
index e1449e3c5..9ba853238 100644
--- a/webapp/utils/async_client.jsx
+++ b/webapp/utils/async_client.jsx
@@ -64,26 +64,31 @@ export function checkVersion() {
}
export function getChannels() {
- if (isCallInProgress('getChannels')) {
- return null;
- }
+ return new Promise((resolve, reject) => {
+ if (isCallInProgress('getChannels')) {
+ resolve();
+ return;
+ }
- callTracker.getChannels = utils.getTimestamp();
+ callTracker.getChannels = utils.getTimestamp();
- return Client.getChannels(
- (data) => {
- callTracker.getChannels = 0;
+ Client.getChannels(
+ (data) => {
+ callTracker.getChannels = 0;
- AppDispatcher.handleServerAction({
- type: ActionTypes.RECEIVED_CHANNELS,
- channels: data
- });
- },
- (err) => {
- callTracker.getChannels = 0;
- dispatchError(err, 'getChannels');
- }
- );
+ AppDispatcher.handleServerAction({
+ type: ActionTypes.RECEIVED_CHANNELS,
+ channels: data
+ });
+ resolve();
+ },
+ (err) => {
+ callTracker.getChannels = 0;
+ dispatchError(err, 'getChannels');
+ reject();
+ }
+ );
+ });
}
export function getChannel(id) {
@@ -130,7 +135,7 @@ export function getMyChannelMembers() {
resolve();
},
(err) => {
- callTracker.getChannelsUnread = 0;
+ callTracker.getMyChannelMembers = 0;
dispatchError(err, 'getMyChannelMembers');
reject();
}