Skip to content
Snippets Groups Projects
rocketchat.js 33.6 KiB
Newer Older
import { AsyncStorage, InteractionManager } from 'react-native';
import semver from 'semver';
import { Rocketchat as RocketchatClient } from '@rocket.chat/sdk';
import RNUserDefaults from 'rn-user-defaults';
import { Q } from '@nozbe/watermelondb';
import * as FileSystem from 'expo-file-system';
import reduxStore from './createStore';
import defaultSettings from '../constants/settings';
import messagesStatus from '../constants/messagesStatus';
import database from './database';
import log from '../utils/log';
import { isIOS, getBundleId } from '../utils/deviceInfo';
import { extractHostname } from '../utils/server';
import fetch, { BASIC_AUTH_KEY } from '../utils/fetch';
Guilherme Gazzo's avatar
Guilherme Gazzo committed

import { setUser, setLoginServices, loginRequest } from '../actions/login';
Diego Mello's avatar
Diego Mello committed
import { disconnect, connectSuccess, connectRequest } from '../actions/connect';
import {
	shareSelectServer, shareSetUser
} from '../actions/share';
Guilherme Gazzo's avatar
Guilherme Gazzo committed
import subscribeRooms from './methods/subscriptions/rooms';
import getUsersPresence, { getUserPresence, subscribeUsersPresence } from './methods/getUsersPresence';
Guilherme Gazzo's avatar
Guilherme Gazzo committed

Guilherme Gazzo's avatar
Guilherme Gazzo committed
import protectedFunction from './methods/helpers/protectedFunction';
import readMessages from './methods/readMessages';
import getSettings, { getLoginSettings, setSettings } from './methods/getSettings';
Guilherme Gazzo's avatar
Guilherme Gazzo committed
import getRooms from './methods/getRooms';
import getPermissions from './methods/getPermissions';
import { getCustomEmojis, setCustomEmojis } from './methods/getCustomEmojis';
import getSlashCommands from './methods/getSlashCommands';
import getRoles from './methods/getRoles';
Diego Mello's avatar
Diego Mello committed
import canOpenRoom from './methods/canOpenRoom';
import triggerBlockAction, { triggerSubmitView, triggerCancel } from './methods/actions';
Guilherme Gazzo's avatar
Guilherme Gazzo committed

import loadMessagesForRoom from './methods/loadMessagesForRoom';
import loadMissedMessages from './methods/loadMissedMessages';
Diego Mello's avatar
Diego Mello committed
import loadThreadMessages from './methods/loadThreadMessages';
import sendMessage, { sendMessageCall } from './methods/sendMessage';
import { sendFileMessage, cancelUpload, isUploadActive } from './methods/sendFileMessage';
Guilherme Gazzo's avatar
Guilherme Gazzo committed

import callJitsi from './methods/callJitsi';

import { getDeviceToken } from '../notifications/push';
import { SERVERS, SERVER_URL } from '../constants/userDefaults';
import { setActiveUsers } from '../actions/activeUsers';
import I18n from '../i18n';
import { twoFactor } from '../utils/twoFactor';
Guilherme Gazzo's avatar
Guilherme Gazzo committed
const TOKEN_KEY = 'reactnativemeteor_usertoken';
const SORT_PREFS_KEY = 'RC_SORT_PREFS_KEY';
Diego Mello's avatar
Diego Mello committed
export const THEME_PREFERENCES_KEY = 'RC_THEME_PREFERENCES_KEY';
export const CRASH_REPORT_KEY = 'RC_CRASH_REPORT_KEY';
Guilherme Gazzo's avatar
Guilherme Gazzo committed
const returnAnArray = obj => obj || [];
const MIN_ROCKETCHAT_VERSION = '0.70.0';
const STATUSES = ['offline', 'online', 'away', 'busy'];

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
const RocketChat = {
Diego Mello's avatar
Diego Mello committed
	TOKEN_KEY,
	async subscribeRooms() {
		if (!this.roomsSub) {
			try {
				this.roomsSub = await subscribeRooms.call(this);
			} catch (e) {
				log(e);
			}
Diego Mello's avatar
Diego Mello committed
	canOpenRoom,
	createChannel({
		name, users, type, readOnly, broadcast
	}) {
		// RC 0.51.0
		return this.methodCall(type ? 'createPrivateGroup' : 'createChannel', name, users, readOnly, {}, { broadcast });
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
	async getUserToken() {
		try {
			return await RNUserDefaults.get(TOKEN_KEY);
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
		} catch (error) {
			console.warn(`RNUserDefaults error: ${ error.message }`);
	async getWebsocketInfo({ server }) {
		// Use useSsl: false only if server url starts with http://
		const useSsl = !/http:\/\//.test(server);

		const sdk = new RocketchatClient({ host: server, protocol: 'ddp', useSsl });

		try {
			await sdk.connect();
		} catch (err) {
			if (err.message && err.message.includes('400')) {
				return {
					success: false,
					message: 'Websocket_disabled',
					messageOptions: {
						contact: I18n.t('Contact_your_server_admin')
					}
				};
			}
		}

		sdk.disconnect();

		return {
			success: true
		};
	},
Diego Mello's avatar
Diego Mello committed
	async getServerInfo(server) {
		const notRCServer = {
			success: false,
			message: 'Not_RC_Server',
			messageOptions: {
				contact: I18n.t('Contact_your_server_admin')
			}
		};
			const result = await fetch(`${ server }/api/info`).then(async(response) => {
				let res = notRCServer;
				try {
					res = await response.json();
					if (!(res && res.success)) {
						return notRCServer;
					}
				} catch (e) {
					// do nothing
				}
				return res;
			});
Diego Mello's avatar
Diego Mello committed
			if (result.success) {
				if (semver.lt(result.version, MIN_ROCKETCHAT_VERSION)) {
					return {
						success: false,
						message: 'Invalid_server_version',
						messageOptions: {
Diego Mello's avatar
Diego Mello committed
							currentVersion: result.version,
							minVersion: MIN_ROCKETCHAT_VERSION
						}
					};
				}
		} catch (e) {
		return {
			success: false,
			message: 'The_URL_is_invalid',
			messageOptions: {
				contact: I18n.t('Contact_your_server_admin')
			}
	stopListener(listener) {
		return listener && listener.stop();
Diego Mello's avatar
Diego Mello committed
	},
	connect({ server, user, logoutOnError = false }) {
		return new Promise((resolve) => {
			if (!this.sdk || this.sdk.client.host !== server) {
				database.setActiveDB(server);
			}
			reduxStore.dispatch(connectRequest());
Guilherme Gazzo's avatar
Guilherme Gazzo committed

			if (this.connectTimeout) {
				clearTimeout(this.connectTimeout);
			}
			if (this.connectedListener) {
				this.connectedListener.then(this.stopListener);
			}

			if (this.closeListener) {
				this.closeListener.then(this.stopListener);
			}

			if (this.usersListener) {
				this.usersListener.then(this.stopListener);
			}

			if (this.notifyLoggedListener) {
				this.notifyLoggedListener.then(this.stopListener);
			}

			if (this.roomsSub) {
				this.roomsSub.stop();
			if (this.sdk) {
				this.sdk.disconnect();
				this.sdk = null;
			}
			if (this.code) {
				this.code = null;
Loading
Loading full blame...