From 190833952099eb23cd430e62272cc978d1eefad6 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 3 Mar 2022 17:48:16 -0300 Subject: [PATCH 1/8] Patch to stop awaiting for all subscription promises to be resolved before emitting login --- patches/@rocket.chat+sdk+1.2.0-mobile.patch | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 patches/@rocket.chat+sdk+1.2.0-mobile.patch diff --git a/patches/@rocket.chat+sdk+1.2.0-mobile.patch b/patches/@rocket.chat+sdk+1.2.0-mobile.patch new file mode 100644 index 00000000000..a018f8279ae --- /dev/null +++ b/patches/@rocket.chat+sdk+1.2.0-mobile.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts +index e751551..02703a0 100644 +--- a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts ++++ b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts +@@ -298,7 +298,7 @@ export class Socket extends EventEmitter { + login = async (credentials: any) => { + const params = this.loginParams(credentials) + this.resume = (await this.call('login', params) as ILoginResult) +- await this.subscribeAll() ++ this.subscribeAll().catch(console.log) + this.emit('login', this.resume) + return this.resume + } From 0233a1112dadb2533e5e0149e01ed080eb9ac4d7 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 3 Mar 2022 18:35:54 -0300 Subject: [PATCH 2/8] Apply https://github.com/RocketChat/Rocket.Chat.ReactNative/pull/3685 --- app/lib/methods/subscriptions/room.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/app/lib/methods/subscriptions/room.ts b/app/lib/methods/subscriptions/room.ts index f72137c2257..ce2bf766af0 100644 --- a/app/lib/methods/subscriptions/room.ts +++ b/app/lib/methods/subscriptions/room.ts @@ -103,9 +103,16 @@ export default class RoomSubscription { } }; - handleConnection = () => { - reduxStore.dispatch(clearUserTyping()); - RocketChat.loadMissedMessages({ rid: this.rid }).catch(e => console.log(e)); + handleConnection = async () => { + try { + reduxStore.dispatch(clearUserTyping()); + await RocketChat.loadMissedMessages({ rid: this.rid }); + const _lastOpen = new Date(); + this.read(_lastOpen); + this.lastOpen = _lastOpen; + } catch (e) { + log(e); + } }; handleNotifyRoomReceived = protectedFunction((ddpMessage: IDDPMessage) => { From 1a4e6de758f49fd5e92c03214fa76261c797eb23 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Wed, 9 Mar 2022 15:27:27 -0300 Subject: [PATCH 3/8] Remove protectedFunction --- app/sagas/rooms.js | 57 +++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/app/sagas/rooms.js b/app/sagas/rooms.js index bc6fd21c729..28cb12fc0a3 100644 --- a/app/sagas/rooms.js +++ b/app/sagas/rooms.js @@ -9,8 +9,6 @@ import log from '../utils/log'; import mergeSubscriptionsRooms from '../lib/methods/helpers/mergeSubscriptionsRooms'; import RocketChat from '../lib/rocketchat'; import buildMessage from '../lib/methods/helpers/buildMessage'; -import protectedFunction from '../lib/methods/helpers/protectedFunction'; -import UserPreferences from '../lib/userPreferences'; const updateRooms = function* updateRooms({ server, newRoomsUpdatedAt }) { const serversDB = database.servers; @@ -82,33 +80,46 @@ const handleRoomsRequest = function* handleRoomsRequest({ params }) { }) ), ...subsToUpdate.map(subscription => { - const newSub = subscriptions.find(s => s._id === subscription._id); - return subscription.prepareUpdate(() => { - if (newSub.announcement) { - if (newSub.announcement !== subscription.announcement) { - subscription.bannerClosed = false; + try { + const newSub = subscriptions.find(s => s._id === subscription._id); + return subscription.prepareUpdate(() => { + if (newSub.announcement) { + if (newSub.announcement !== subscription.announcement) { + subscription.bannerClosed = false; + } } - } - Object.assign(subscription, newSub); - }); + Object.assign(subscription, newSub); + }); + } catch (e) { + log(e); + return null; + } + }), + ...subsToDelete.map(subscription => { + try { + return subscription.prepareDestroyPermanently(); + } catch (e) { + log(e); + return null; + } }), - ...subsToDelete.map(subscription => subscription.prepareDestroyPermanently()), ...messagesToCreate.map(message => - messagesCollection.prepareCreate( - protectedFunction(m => { - m._raw = sanitizedRaw({ id: message._id }, messagesCollection.schema); - m.subscription.id = message.rid; - return Object.assign(m, message); - }) - ) + messagesCollection.prepareCreate(m => { + m._raw = sanitizedRaw({ id: message._id }, messagesCollection.schema); + m.subscription.id = message.rid; + return Object.assign(m, message); + }) ), ...messagesToUpdate.map(message => { const newMessage = lastMessages.find(m => m._id === message.id); - return message.prepareUpdate( - protectedFunction(() => { - Object.assign(message, newMessage); - }) - ); + return message.prepareUpdate(() => { + try { + return Object.assign(message, newMessage); + } catch (e) { + log(e); + return null; + } + }); }) ]; From 696bffac720cba80ec1e4ce1793440a27273ddaf Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 10 Mar 2022 11:30:02 -0300 Subject: [PATCH 4/8] Add clearUser action to Redux --- app/actions/actionsTypes.ts | 2 +- app/actions/login.ts | 6 ++++++ app/reducers/login.test.ts | 7 +++++++ app/reducers/login.ts | 7 +++++++ app/sagas/selectServer.js | 5 +++-- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/actions/actionsTypes.ts b/app/actions/actionsTypes.ts index 1367b225180..a920e27e2fa 100644 --- a/app/actions/actionsTypes.ts +++ b/app/actions/actionsTypes.ts @@ -11,7 +11,7 @@ function createRequestTypes(base = {}, types = defaultTypes): Record): ISetUser { }; } +export function clearUser(): Action { + return { + type: types.USER.CLEAR + }; +} + export function setLoginServices(data: Record): ISetServices { return { type: types.LOGIN.SET_SERVICES, diff --git a/app/reducers/login.test.ts b/app/reducers/login.test.ts index abab2ebaf24..2c92b8879b4 100644 --- a/app/reducers/login.test.ts +++ b/app/reducers/login.test.ts @@ -1,4 +1,5 @@ import { + clearUser, loginFailure, loginRequest, loginSuccess, @@ -81,6 +82,12 @@ describe('test selectedUsers reducer', () => { expect(state).toEqual(user.username); }); + it('should clear user after clearUser', () => { + mockedStore.dispatch(clearUser()); + const state = mockedStore.getState().login.user; + expect(state).toEqual({}); + }); + // TODO PREFERENCE REDUCER WITH EMPTY PREFERENCE - NON USED? // it('should return modified store after setPreference', () => { // mockedStore.dispatch(setPreference({ showAvatar: true })); diff --git a/app/reducers/login.ts b/app/reducers/login.ts index 2969d0c2815..8d4026112be 100644 --- a/app/reducers/login.ts +++ b/app/reducers/login.ts @@ -80,6 +80,13 @@ export default function login(state = initialState, action: TActionsLogin): ILog ...action.user } }; + case types.USER.CLEAR: + return { + ...state, + user: {}, + isAuthenticated: false, + isLocalAuthenticated: false + }; case types.LOGIN.SET_SERVICES: return { ...state, diff --git a/app/sagas/selectServer.js b/app/sagas/selectServer.js index 492191ee437..ab18c1779c0 100644 --- a/app/sagas/selectServer.js +++ b/app/sagas/selectServer.js @@ -9,7 +9,7 @@ import Navigation from '../lib/Navigation'; import { SERVER } from '../actions/actionsTypes'; import { selectServerFailure, selectServerRequest, selectServerSuccess, serverFailure } from '../actions/server'; import { clearSettings } from '../actions/settings'; -import { setUser } from '../actions/login'; +import { clearUser, setUser } from '../actions/login'; import { clearActiveUsers } from '../actions/activeUsers'; import RocketChat from '../lib/rocketchat'; import database from '../lib/database'; @@ -111,10 +111,11 @@ const handleSelectServer = function* handleSelectServer({ server, version, fetch if (user) { yield put(clearSettings()); - yield RocketChat.connect({ server, user, logoutOnError: true }); yield put(setUser(user)); + yield RocketChat.connect({ server, user, logoutOnError: true }); yield put(appStart({ root: RootEnum.ROOT_INSIDE })); } else { + yield put(clearUser()); yield RocketChat.connect({ server }); yield put(appStart({ root: RootEnum.ROOT_OUTSIDE })); } From e76b9f40b475d101837a4d49f81b1f0c0c90a042 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 10 Mar 2022 14:19:54 -0300 Subject: [PATCH 5/8] Remove unnecessary user param on connect --- app/lib/rocketchat/services/connect.ts | 8 ++++---- app/sagas/selectServer.js | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/lib/rocketchat/services/connect.ts b/app/lib/rocketchat/services/connect.ts index e7f24d0a878..e7689708e4c 100644 --- a/app/lib/rocketchat/services/connect.ts +++ b/app/lib/rocketchat/services/connect.ts @@ -38,8 +38,8 @@ interface IServices { // FIXME: Remove `this` context function connect( this: IRocketChat, - { server, user, logoutOnError = false }: { server: string; user: IUser; logoutOnError: boolean } -) { + { server, logoutOnError = false }: { server: string; logoutOnError: boolean } +): Promise { return new Promise(resolve => { if (sdk.current?.client?.host === server) { return resolve(); @@ -107,8 +107,8 @@ function connect( return; } store.dispatch(connectSuccess()); - const { server: currentServer } = store.getState().server; - if (user?.token && server === currentServer) { + const { user } = store.getState().login; + if (user?.token) { store.dispatch(loginRequest({ resume: user.token }, logoutOnError)); } }); diff --git a/app/sagas/selectServer.js b/app/sagas/selectServer.js index ab18c1779c0..0d0adcda471 100644 --- a/app/sagas/selectServer.js +++ b/app/sagas/selectServer.js @@ -112,7 +112,7 @@ const handleSelectServer = function* handleSelectServer({ server, version, fetch if (user) { yield put(clearSettings()); yield put(setUser(user)); - yield RocketChat.connect({ server, user, logoutOnError: true }); + yield RocketChat.connect({ server, logoutOnError: true }); yield put(appStart({ root: RootEnum.ROOT_INSIDE })); } else { yield put(clearUser()); From 0b3b09c08704e3aa11c4d7ab7cc62e8c55ca0bbb Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Thu, 10 Mar 2022 14:58:38 -0300 Subject: [PATCH 6/8] lint --- app/lib/rocketchat/services/connect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/rocketchat/services/connect.ts b/app/lib/rocketchat/services/connect.ts index e7689708e4c..1cb34d96404 100644 --- a/app/lib/rocketchat/services/connect.ts +++ b/app/lib/rocketchat/services/connect.ts @@ -18,7 +18,7 @@ import { loginRequest, setLoginServices, setUser } from '../../../actions/login' import sdk from './sdk'; import I18n from '../../../i18n'; import RocketChat, { MIN_ROCKETCHAT_VERSION, STATUSES } from '../rocketchat'; -import { ICredentials, ILoggedUser, IRocketChat, IUser } from '../../../definitions'; +import { ICredentials, ILoggedUser, IRocketChat } from '../../../definitions'; import { isIOS } from '../../../utils/deviceInfo'; import { connectRequest, connectSuccess, disconnect as disconnectAction } from '../../../actions/connect'; import { updatePermission } from '../../../actions/permissions'; From 76fba9e72aed8d32877d65e75872b8779b464dc8 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Mar 2022 09:55:02 -0300 Subject: [PATCH 7/8] Point to SDK branch --- package.json | 2 +- patches/@rocket.chat+sdk+1.2.0-mobile.patch | 13 ------------- yarn.lock | 6 +++--- 3 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 patches/@rocket.chat+sdk+1.2.0-mobile.patch diff --git a/package.json b/package.json index cd28c186e45..78a4055d0a8 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@react-navigation/stack": "5.14.5", "@rocket.chat/message-parser": "0.30.0", "@rocket.chat/react-native-fast-image": "^8.2.0", - "@rocket.chat/sdk": "RocketChat/Rocket.Chat.js.SDK#mobile", + "@rocket.chat/sdk": "RocketChat/Rocket.Chat.js.SDK#fix.subscribeall-reconnection", "@rocket.chat/ui-kit": "0.13.0", "bytebuffer": "^5.0.1", "color2k": "1.2.4", diff --git a/patches/@rocket.chat+sdk+1.2.0-mobile.patch b/patches/@rocket.chat+sdk+1.2.0-mobile.patch deleted file mode 100644 index a018f8279ae..00000000000 --- a/patches/@rocket.chat+sdk+1.2.0-mobile.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts -index e751551..02703a0 100644 ---- a/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts -+++ b/node_modules/@rocket.chat/sdk/lib/drivers/ddp.ts -@@ -298,7 +298,7 @@ export class Socket extends EventEmitter { - login = async (credentials: any) => { - const params = this.loginParams(credentials) - this.resume = (await this.call('login', params) as ILoginResult) -- await this.subscribeAll() -+ this.subscribeAll().catch(console.log) - this.emit('login', this.resume) - return this.resume - } diff --git a/yarn.lock b/yarn.lock index 5e789fb72ed..01649de8a6a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3758,9 +3758,9 @@ resolved "https://registry.yarnpkg.com/@rocket.chat/react-native-fast-image/-/react-native-fast-image-8.2.0.tgz#4f48858f95f40afcb10b39cee9b1239c150d6c51" integrity sha512-NF5KlFt642ZucP/KHnYGBNYLD6O7bcrZMKfRQlH5Y3/1xpnPX1g4wuygtiV7XArMU1FopQT+qmCUPPj8IMDTcw== -"@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#mobile": - version "1.2.0-mobile" - resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/9d18d628b87742302bfa0789d38bbd0c66118941" +"@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#fix.subscribeall-reconnection": + version "1.3.0-mobile" + resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/1471ae123ad56b27959fa9e0848ede30ef2da3e5" dependencies: js-sha256 "^0.9.0" lru-cache "^4.1.1" From 32144a0b77896ea82aba06266e30e0aa496bcf39 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Fri, 11 Mar 2022 10:48:48 -0300 Subject: [PATCH 8/8] Point to SDK after merge --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 78a4055d0a8..cd28c186e45 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "@react-navigation/stack": "5.14.5", "@rocket.chat/message-parser": "0.30.0", "@rocket.chat/react-native-fast-image": "^8.2.0", - "@rocket.chat/sdk": "RocketChat/Rocket.Chat.js.SDK#fix.subscribeall-reconnection", + "@rocket.chat/sdk": "RocketChat/Rocket.Chat.js.SDK#mobile", "@rocket.chat/ui-kit": "0.13.0", "bytebuffer": "^5.0.1", "color2k": "1.2.4", diff --git a/yarn.lock b/yarn.lock index 01649de8a6a..e39d74cf83a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3758,9 +3758,9 @@ resolved "https://registry.yarnpkg.com/@rocket.chat/react-native-fast-image/-/react-native-fast-image-8.2.0.tgz#4f48858f95f40afcb10b39cee9b1239c150d6c51" integrity sha512-NF5KlFt642ZucP/KHnYGBNYLD6O7bcrZMKfRQlH5Y3/1xpnPX1g4wuygtiV7XArMU1FopQT+qmCUPPj8IMDTcw== -"@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#fix.subscribeall-reconnection": +"@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#mobile": version "1.3.0-mobile" - resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/1471ae123ad56b27959fa9e0848ede30ef2da3e5" + resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/454b4ba784095057b8de862eb99340311b672e15" dependencies: js-sha256 "^0.9.0" lru-cache "^4.1.1"