diff --git a/android/app/build.gradle b/android/app/build.gradle
index 75b4490f1..524eebd82 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -144,7 +144,7 @@ android {
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode VERSIONCODE as Integer
- versionName "4.22.0"
+ versionName "4.23.0"
vectorDrawables.useSupportLibrary = true
if (!isFoss) {
manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
diff --git a/app/ee/omnichannel/lib/subscriptions/inquiry.js b/app/ee/omnichannel/lib/subscriptions/inquiry.js
index 00d320828..d10d5c892 100644
--- a/app/ee/omnichannel/lib/subscriptions/inquiry.js
+++ b/app/ee/omnichannel/lib/subscriptions/inquiry.js
@@ -6,7 +6,6 @@ import { inquiryQueueAdd, inquiryQueueRemove, inquiryQueueUpdate, inquiryRequest
const removeListener = listener => listener.stop();
let connectedListener;
-let disconnectedListener;
let queueListener;
const streamTopic = 'stream-livechat-inquiry-queue-observer';
@@ -48,10 +47,6 @@ export default function subscribeInquiry() {
connectedListener.then(removeListener);
connectedListener = false;
}
- if (disconnectedListener) {
- disconnectedListener.then(removeListener);
- disconnectedListener = false;
- }
if (queueListener) {
queueListener.then(removeListener);
queueListener = false;
@@ -59,7 +54,6 @@ export default function subscribeInquiry() {
};
connectedListener = RocketChat.onStreamData('connected', handleConnection);
- disconnectedListener = RocketChat.onStreamData('close', handleConnection);
queueListener = RocketChat.onStreamData(streamTopic, handleQueueMessageReceived);
try {
diff --git a/app/lib/methods/subscriptions/rooms.js b/app/lib/methods/subscriptions/rooms.js
index 4dd84adfc..c2fc9fcdf 100644
--- a/app/lib/methods/subscriptions/rooms.js
+++ b/app/lib/methods/subscriptions/rooms.js
@@ -8,7 +8,6 @@ import messagesStatus from '../../../constants/messagesStatus';
import log from '../../../utils/log';
import random from '../../../utils/random';
import store from '../../createStore';
-import { roomsRequest } from '../../../actions/rooms';
import { handlePayloadUserInteraction } from '../actions';
import buildMessage from '../helpers/buildMessage';
import RocketChat from '../../rocketchat';
@@ -21,8 +20,6 @@ import { E2E_MESSAGE_TYPE } from '../../encryption/constants';
const removeListener = listener => listener.stop();
-let connectedListener;
-let disconnectedListener;
let streamListener;
let subServer;
let queue = {};
@@ -255,10 +252,6 @@ const debouncedUpdate = subscription => {
};
export default function subscribeRooms() {
- const handleConnection = () => {
- store.dispatch(roomsRequest());
- };
-
const handleStreamMessageReceived = protectedFunction(async ddpMessage => {
const db = database.active;
@@ -388,14 +381,6 @@ export default function subscribeRooms() {
});
const stop = () => {
- if (connectedListener) {
- connectedListener.then(removeListener);
- connectedListener = false;
- }
- if (disconnectedListener) {
- disconnectedListener.then(removeListener);
- disconnectedListener = false;
- }
if (streamListener) {
streamListener.then(removeListener);
streamListener = false;
@@ -407,8 +392,6 @@ export default function subscribeRooms() {
}
};
- connectedListener = this.sdk.onStreamData('connected', handleConnection);
- // disconnectedListener = this.sdk.onStreamData('close', handleConnection);
streamListener = this.sdk.onStreamData('stream-notify-user', handleStreamMessageReceived);
try {
diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js
index 5bf94d085..174eaf9a7 100644
--- a/app/lib/rocketchat.js
+++ b/app/lib/rocketchat.js
@@ -239,37 +239,34 @@ const RocketChat = {
this.code = null;
}
- this.sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl: useSsl(server) });
+ // The app can't reconnect if reopen interval is 5s while in development
+ this.sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl: useSsl(server), reopen: __DEV__ ? 20000 : 5000 });
this.getSettings();
- const sdkConnect = () =>
- this.sdk
- .connect()
- .then(() => {
- const { server: currentServer } = reduxStore.getState().server;
- if (user && user.token && server === currentServer) {
- reduxStore.dispatch(loginRequest({ resume: user.token }, logoutOnError));
- }
- })
- .catch(err => {
- console.log('connect error', err);
-
- // when `connect` raises an error, we try again in 10 seconds
- this.connectTimeout = setTimeout(() => {
- if (this.sdk?.client?.host === server) {
- sdkConnect();
- }
- }, 10000);
- });
-
- sdkConnect();
+ this.sdk
+ .connect()
+ .then(() => {
+ console.log('connected');
+ })
+ .catch(err => {
+ console.log('connect error', err);
+ });
this.connectingListener = this.sdk.onStreamData('connecting', () => {
reduxStore.dispatch(connectRequest());
});
this.connectedListener = this.sdk.onStreamData('connected', () => {
+ const { connected } = reduxStore.getState().meteor;
+ if (connected) {
+ return;
+ }
reduxStore.dispatch(connectSuccess());
+ const { server: currentServer } = reduxStore.getState().server;
+ const { user } = reduxStore.getState().login;
+ if (user?.token && server === currentServer) {
+ reduxStore.dispatch(loginRequest({ resume: user.token }, logoutOnError));
+ }
});
this.closeListener = this.sdk.onStreamData('close', () => {
diff --git a/app/utils/sslPinning.js b/app/utils/sslPinning.js
index 50f944e63..c3e2128c9 100644
--- a/app/utils/sslPinning.js
+++ b/app/utils/sslPinning.js
@@ -7,6 +7,21 @@ import I18n from '../i18n';
import { extractHostname } from './server';
const { SSLPinning } = NativeModules;
+const { documentDirectory } = FileSystem;
+
+const extractFileScheme = path => path.replace('file://', ''); // file:// isn't allowed by obj-C
+
+const getPath = name => `${documentDirectory}/${name}`;
+
+const persistCertificate = async (name, password) => {
+ const certificatePath = getPath(name);
+ const certificate = {
+ path: extractFileScheme(certificatePath),
+ password
+ };
+ await UserPreferences.setMapAsync(name, certificate);
+ return certificate;
+};
const RCSSLPinning = Platform.select({
ios: {
@@ -25,17 +40,9 @@ const RCSSLPinning = Platform.select({
text: 'OK',
onPress: async password => {
try {
- const certificatePath = `${FileSystem.documentDirectory}/${name}`;
-
+ const certificatePath = getPath(name);
await FileSystem.copyAsync({ from: uri, to: certificatePath });
-
- const certificate = {
- path: certificatePath.replace('file://', ''), // file:// isn't allowed by obj-C
- password
- };
-
- await UserPreferences.setMapAsync(name, certificate);
-
+ await persistCertificate(name, password);
resolve(name);
} catch (e) {
reject(e);
@@ -49,16 +56,19 @@ const RCSSLPinning = Platform.select({
reject(e);
}
}),
- setCertificate: async (alias, server) => {
- if (alias) {
- const certificate = await UserPreferences.getMapAsync(alias);
+ setCertificate: async (name, server) => {
+ if (name) {
+ let certificate = await UserPreferences.getMapAsync(name);
+ if (!certificate.path.match(extractFileScheme(documentDirectory))) {
+ certificate = await persistCertificate(name, certificate.password);
+ }
await UserPreferences.setMapAsync(extractHostname(server), certificate);
}
}
},
android: {
pickCertificate: () => SSLPinning?.pickCertificate(),
- setCertificate: alias => SSLPinning?.setCertificate(alias)
+ setCertificate: name => SSLPinning?.setCertificate(name)
}
});
diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj
index d9ff1460e..f1ac13c9f 100644
--- a/ios/RocketChatRN.xcodeproj/project.pbxproj
+++ b/ios/RocketChatRN.xcodeproj/project.pbxproj
@@ -1682,7 +1682,7 @@
INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
- MARKETING_VERSION = 4.22.0;
+ MARKETING_VERSION = 4.23.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
@@ -1719,7 +1719,7 @@
INFOPLIST_FILE = NotificationService/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
- MARKETING_VERSION = 4.22.0;
+ MARKETING_VERSION = 4.23.0;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = chat.rocket.reactnative.NotificationService;
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist
index 201436c42..93504495a 100644
--- a/ios/RocketChatRN/Info.plist
+++ b/ios/RocketChatRN/Info.plist
@@ -26,7 +26,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 4.22.0
+ 4.23.0
CFBundleSignature
????
CFBundleURLTypes
diff --git a/ios/ShareRocketChatRN/Info.plist b/ios/ShareRocketChatRN/Info.plist
index f38c9140c..c363596be 100644
--- a/ios/ShareRocketChatRN/Info.plist
+++ b/ios/ShareRocketChatRN/Info.plist
@@ -26,7 +26,7 @@
CFBundlePackageType
XPC!
CFBundleShortVersionString
- 4.22.0
+ 4.23.0
CFBundleVersion
1
KeychainGroup
diff --git a/package.json b/package.json
index 1582969f2..f807f6166 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "rocket-chat-reactnative",
- "version": "4.22.0",
+ "version": "4.23.0",
"private": true,
"scripts": {
"start": "react-native start",
diff --git a/yarn.lock b/yarn.lock
index 4325aa75a..b4ca2beb5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3760,7 +3760,7 @@
"@rocket.chat/sdk@RocketChat/Rocket.Chat.js.SDK#mobile":
version "1.1.0-mobile"
- resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/0ee2ded22b08b34ce7ab62b26e42a713dca0d1ac"
+ resolved "https://codeload.github.com/RocketChat/Rocket.Chat.js.SDK/tar.gz/c64e69ea22514ae3bbe24e36ca77868fdae76157"
dependencies:
js-sha256 "^0.9.0"
lru-cache "^4.1.1"