diff --git a/client/routes/router.coffee b/client/routes/router.coffee index cc3d1b2a7166..fc8fe2136188 100644 --- a/client/routes/router.coffee +++ b/client/routes/router.coffee @@ -6,7 +6,6 @@ BlazeLayout.setRoot 'body' FlowRouter.subscriptions = -> Tracker.autorun => if Meteor.userId() - RoomManager.init() @register 'userData', Meteor.subscribe('userData') @register 'activeUsers', Meteor.subscribe('activeUsers') diff --git a/packages/rocketchat-authorization/client/lib/ChatPermissions.coffee b/packages/rocketchat-authorization/client/lib/ChatPermissions.coffee index a80b72ced119..fa88eb213115 100644 --- a/packages/rocketchat-authorization/client/lib/ChatPermissions.coffee +++ b/packages/rocketchat-authorization/client/lib/ChatPermissions.coffee @@ -1,4 +1,2 @@ -RocketChat.authz.cachedCollection = new RocketChat.CachedCollection({ name: 'permissions', eventType: 'onAll' }) +RocketChat.authz.cachedCollection = new RocketChat.CachedCollection({ name: 'permissions', eventType: 'onAll', initOnLogin: true }) @ChatPermissions = RocketChat.authz.cachedCollection.collection - -RocketChat.authz.cachedCollection.init() diff --git a/packages/rocketchat-lib/client/lib/cachedCollection.js b/packages/rocketchat-lib/client/lib/cachedCollection.js index a201270b9de9..5e6cd5b46bec 100644 --- a/packages/rocketchat-lib/client/lib/cachedCollection.js +++ b/packages/rocketchat-lib/client/lib/cachedCollection.js @@ -4,12 +4,26 @@ class CachedCollectionManager { constructor() { this.items = []; this._syncEnabled = false; + this.loginCb = []; + this.logged = false; const _unstoreLoginToken = Accounts._unstoreLoginToken; Accounts._unstoreLoginToken = (...args) => { _unstoreLoginToken.apply(Accounts, args); - this.clearAllCache(); + this.clearAllCacheOnLogout(); }; + + Tracker.autorun(() => { + if (Meteor.userId() !== null) { + if (this.logged === false) { + for (const cb of this.loginCb) { + cb(); + } + } + } + + this.logged = Meteor.userId() !== null; + }); } register(cachedCollection) { @@ -22,6 +36,12 @@ class CachedCollectionManager { } } + clearAllCacheOnLogout() { + for (const item of this.items) { + item.clearCacheOnLogout(); + } + } + countQueries() { for (const item of this.items) { item.countQueries(); @@ -36,6 +56,13 @@ class CachedCollectionManager { get syncEnabled() { return this._syncEnabled; } + + onLogin(cb) { + this.loginCb.push(cb); + if (this.logged) { + cb(); + } + } } RocketChat.CachedCollectionManager = new CachedCollectionManager; @@ -49,6 +76,7 @@ class CachedCollection { syncMethodName, eventName, eventType = 'onUser', + initOnLogin = false, useSync = true, useCache = true, debug = true, @@ -67,10 +95,21 @@ class CachedCollection { this.useCache = useCache; this.debug = debug; this.version = version; + this.initOnLogin = initOnLogin; this.updatedAt = new Date(0); this.maxCacheTime = maxCacheTime; RocketChat.CachedCollectionManager.register(this); + + if (initOnLogin === true) { + RocketChat.CachedCollectionManager.onLogin(() => { + this.log('Init on login'); + this.ready.set(false); + this.updatedAt = new Date(0); + this.initiated = false; + this.init(); + }); + } } log(...args) { @@ -209,9 +248,16 @@ class CachedCollection { this.log('saving cache (done)'); } + clearCacheOnLogout() { + if (this.initOnLogin === true) { + this.clearCache(); + } + } + clearCache() { this.log('clearing cache'); localforage.removeItem(this.name); + this.collection.remove({}); } setupListener(eventType, eventName) { diff --git a/packages/rocketchat-ui/lib/RoomManager.coffee b/packages/rocketchat-ui/lib/RoomManager.coffee index 68ead10c1c1d..a29280f5d854 100644 --- a/packages/rocketchat-ui/lib/RoomManager.coffee +++ b/packages/rocketchat-ui/lib/RoomManager.coffee @@ -55,14 +55,6 @@ Tracker.autorun -> Dep = new Tracker.Dependency - init = -> - if CachedChatSubscription.ready.get() - return - - CachedChatSubscription.init() - - return - close = (typeName) -> if openedRooms[typeName] if openedRooms[typeName].sub? @@ -245,7 +237,6 @@ Tracker.autorun -> open: open close: close closeAllRooms: closeAllRooms - init: init getDomOfRoom: getDomOfRoom existsDomOfRoom: existsDomOfRoom msgStream: msgStream diff --git a/packages/rocketchat-ui/lib/collections.coffee b/packages/rocketchat-ui/lib/collections.coffee index 171d6dcf631e..7ee8ca9ab69f 100644 --- a/packages/rocketchat-ui/lib/collections.coffee +++ b/packages/rocketchat-ui/lib/collections.coffee @@ -1,7 +1,7 @@ @ChatMessage = new Meteor.Collection null @ChatRoom = new Meteor.Collection 'rocketchat_room' -@CachedChatSubscription = new RocketChat.CachedCollection({ name: 'subscriptions' }) +@CachedChatSubscription = new RocketChat.CachedCollection({ name: 'subscriptions', initOnLogin: true }) @ChatSubscription = CachedChatSubscription.collection @UserRoles = new Mongo.Collection null @RoomRoles = new Mongo.Collection null