Update rn-fetch-blob and CBA support for iOS (#2033)

* Update rn-fetch-blob and CBA support for iOS

* remove trusty

* remove react-native-fast-image dependency
This commit is contained in:
Elias Nahum 2018-08-29 15:01:37 -03:00 committed by Harrison Healey
parent 68847d91a0
commit 96e9c6c707
27 changed files with 281 additions and 286 deletions

View file

@ -112,7 +112,7 @@ android {
defaultConfig {
applicationId "com.mattermost.rnbeta"
minSdkVersion 21
targetSdkVersion 23
targetSdkVersion 26
versionCode 133
versionName "1.11.0"
ndk {
@ -187,8 +187,8 @@ configurations.all {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "com.android.support:appcompat-v7:25.0.1"
implementation 'com.android.support:percent:25.3.1'
implementation "com.android.support:appcompat-v7:26.0.1"
implementation 'com.android.support:percent:26.0.1'
implementation "com.facebook.react:react-native:+" // From node_modules
implementation project(':react-native-document-picker')
implementation project(':react-native-keychain')
@ -211,7 +211,7 @@ dependencies {
implementation project(':react-native-youtube')
implementation project(':react-native-sentry')
implementation project(':react-native-exception-handler')
implementation project(':react-native-fetch-blob')
implementation project(':rn-fetch-blob')
// For animated GIF support
implementation 'com.facebook.fresco:animated-base-support:1.3.0'

View file

@ -13,8 +13,8 @@ include ':react-native-sentry'
project(':react-native-sentry').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-sentry/android')
include ':react-native-exception-handler'
project(':react-native-exception-handler').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-exception-handler/android')
include ':react-native-fetch-blob'
project(':react-native-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fetch-blob/android')
include ':rn-fetch-blob'
project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android')
include ':jail-monkey'
project(':jail-monkey').projectDir = new File(rootProject.projectDir, '../node_modules/jail-monkey/android')
include ':react-native-local-auth'

View file

@ -11,7 +11,7 @@ import {
handlePasswordChanged,
} from 'app/actions/views/login';
jest.mock('react-native-fetch-blob/fs', () => ({
jest.mock('rn-fetch-blob/fs', () => ({
dirs: {
DocumentDir: () => jest.fn(),
CacheDir: () => jest.fn(),

View file

@ -11,7 +11,7 @@ import {ViewTypes} from 'app/constants';
import {handleServerUrlChanged} from 'app/actions/views/select_server';
jest.mock('react-native-fetch-blob/fs', () => ({
jest.mock('rn-fetch-blob/fs', () => ({
dirs: {
DocumentDir: () => jest.fn(),
CacheDir: () => jest.fn(),

View file

@ -11,7 +11,7 @@ import {
handleCommentDraftSelectionChanged,
} from 'app/actions/views/thread';
jest.mock('react-native-fetch-blob/fs', () => ({
jest.mock('rn-fetch-blob/fs', () => ({
dirs: {
DocumentDir: () => jest.fn(),
CacheDir: () => jest.fn(),

View file

@ -10,9 +10,9 @@ import {
StyleSheet,
Text,
} from 'react-native';
import FastImage from 'react-native-fast-image';
import CustomPropTypes from 'app/constants/custom_prop_types';
import ImageCacheManager from 'app/utils/image_cache_manager';
const scaleEmojiBasedOnDevice = (size) => {
if (Platform.OS === 'ios') {
@ -46,7 +46,6 @@ export default class Emoji extends React.PureComponent {
literal: PropTypes.string,
size: PropTypes.number,
textStyle: CustomPropTypes.Style,
token: PropTypes.string.isRequired,
};
static defaultProps = {
@ -60,6 +59,7 @@ export default class Emoji extends React.PureComponent {
super(props);
this.state = {
imageUrl: null,
originalWidth: 0,
originalHeight: 0,
};
@ -67,22 +67,23 @@ export default class Emoji extends React.PureComponent {
componentWillMount() {
this.mounted = true;
if (!this.props.displayTextOnly && this.props.imageUrl && this.props.isCustomEmoji) {
this.updateImageHeight(this.props.imageUrl);
if (!this.props.displayTextOnly && this.props.imageUrl) {
ImageCacheManager.cache(this.props.imageUrl, this.props.imageUrl, this.updateImageHeight);
}
}
componentWillReceiveProps(nextProps) {
if (nextProps.emojiName !== this.props.emojiName) {
this.setState({
imageUrl: null,
originalWidth: 0,
originalHeight: 0,
});
}
if (!nextProps.displayTextOnly && nextProps.imageUrl && nextProps.isCustomEmoji &&
if (!nextProps.displayTextOnly && nextProps.imageUrl &&
nextProps.imageUrl !== this.props.imageUrl) {
this.updateImageHeight(nextProps.imageUrl);
ImageCacheManager.cache(nextProps.imageUrl, nextProps.imageUrl, this.updateImageHeight);
}
}
@ -91,24 +92,30 @@ export default class Emoji extends React.PureComponent {
}
updateImageHeight = (imageUrl) => {
Image.getSize(imageUrl, (originalWidth, originalHeight) => {
let prefix = '';
if (Platform.OS === 'android') {
prefix = 'file://';
}
const uri = `${prefix}${imageUrl}`;
Image.getSize(uri, (originalWidth, originalHeight) => {
if (this.mounted) {
this.setState({
imageUrl: uri,
originalWidth,
originalHeight,
});
}
});
}
};
render() {
const {
literal,
textStyle,
token,
imageUrl,
displayTextOnly,
} = this.props;
const {imageUrl} = this.state;
let size = this.props.size;
let fontSize = size;
@ -122,13 +129,6 @@ export default class Emoji extends React.PureComponent {
return <Text style={textStyle}>{literal}</Text>;
}
const source = {
uri: imageUrl,
headers: {
Authorization: `Bearer ${token}`,
},
};
let width = size;
let height = size;
let {originalHeight, originalWidth} = this.state;
@ -157,16 +157,9 @@ export default class Emoji extends React.PureComponent {
// force a new image to be rendered when the size changes
const key = Platform.OS === 'android' ? (height + '-' + width) : null;
let ImageComponent;
if (Platform.OS === 'android') {
ImageComponent = Image;
} else {
ImageComponent = FastImage;
}
if (!imageUrl) {
return (
<ImageComponent
<Image
key={key}
style={{width, height, marginTop}}
/>
@ -174,10 +167,10 @@ export default class Emoji extends React.PureComponent {
}
return (
<ImageComponent
<Image
key={key}
style={{width, height, marginTop}}
source={source}
source={{uri: imageUrl}}
onError={this.onError}
/>
);

View file

@ -38,7 +38,6 @@ function mapStateToProps(state, ownProps) {
imageUrl,
isCustomEmoji,
displayTextOnly,
token: state.entities.general.credentials.token,
};
}

View file

@ -14,7 +14,7 @@ import {
View,
} from 'react-native';
import OpenFile from 'react-native-doc-viewer';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {CircularProgress} from 'react-native-circular-progress';
import {intlShape} from 'react-intl';
import tinyColor from 'tinycolor2';

View file

@ -4,7 +4,7 @@
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {Platform, StyleSheet, Text, View} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {AnimatedCircularProgress} from 'react-native-circular-progress';
import {Client4} from 'mattermost-redux/client';
@ -13,7 +13,9 @@ import FileAttachmentImage from 'app/components/file_attachment_list/file_attach
import FileAttachmentIcon from 'app/components/file_attachment_list/file_attachment_icon';
import FileUploadRetry from 'app/components/file_upload_preview/file_upload_retry';
import FileUploadRemove from 'app/components/file_upload_preview/file_upload_remove';
import mattermostBucket from 'app/mattermost_bucket';
import {buildFileUploadData, encodeHeaderURIStringToUTF8} from 'app/utils/file';
import LocalConfig from 'assets/config';
export default class FileUploadItem extends PureComponent {
static propTypes = {
@ -110,7 +112,7 @@ export default class FileUploadItem extends PureComponent {
return false;
};
uploadFile = () => {
uploadFile = async () => {
const {channelId, file} = this.props;
const fileData = buildFileUploadData(file);
@ -134,7 +136,12 @@ export default class FileUploadItem extends PureComponent {
Client4.trackEvent('api', 'api_files_upload');
this.uploadPromise = RNFetchBlob.fetch('POST', Client4.getFilesRoute(), headers, data);
const certificate = await mattermostBucket.getPreference('cert', LocalConfig.AppGroupId);
const options = {
timeout: 10000,
certificate,
};
this.uploadPromise = RNFetchBlob.config(options).fetch('POST', Client4.getFilesRoute(), headers, data);
this.uploadPromise.uploadProgress(this.handleUploadProgress);
this.uploadPromise.then(this.handleUploadCompleted).catch(this.handleUploadError);
};

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import keyMirror from 'mattermost-redux/utils/key_mirror';
import RNFetchBlobFS from 'react-native-fetch-blob/fs';
import RNFetchBlobFS from 'rn-fetch-blob/fs';
const deviceTypes = keyMirror({
CONNECTION_CHANGED: null,

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import {Platform} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {Client4} from 'mattermost-redux/client';
import {General} from 'mattermost-redux/constants';
@ -100,15 +100,25 @@ Client4.doFetchWithResponse = async (url, options) => {
};
};
if (Platform.OS === 'ios') {
mattermostBucket.getPreference('cert', LocalConfig.AppGroupId).then((certificate) => {
window.fetch = new RNFetchBlob.polyfill.Fetch({
const initFetchConfig = async () => {
let fetchConfig = {};
if (Platform.OS === 'ios') {
const certificate = await mattermostBucket.getPreference('cert', LocalConfig.AppGroupId);
fetchConfig = {
auto: true,
certificate,
}).build();
});
} else {
window.fetch = new RNFetchBlob.polyfill.Fetch({
auto: true,
}).build();
}
};
window.fetch = new RNFetchBlob.polyfill.Fetch(fetchConfig).build();
} else {
fetchConfig = {
auto: true,
};
window.fetch = new RNFetchBlob.polyfill.Fetch(fetchConfig).build();
}
return true;
};
initFetchConfig();
export default initFetchConfig;

View file

@ -5,7 +5,7 @@ import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {intlShape} from 'react-intl';
import {View} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {KeyboardAwareScrollView} from 'react-native-keyboard-aware-scroll-view';
import {Client4} from 'mattermost-redux/client';
@ -20,6 +20,8 @@ import ErrorText from 'app/components/error_text';
import StatusBar from 'app/components/status_bar/index';
import ProfilePicture from 'app/components/profile_picture';
import AttachmentButton from 'app/components/attachment_button';
import mattermostBucket from 'app/mattermost_bucket';
import LocalConfig from 'assets/config';
import EditProfileItem from './edit_profile_item';
@ -191,7 +193,7 @@ export default class EditProfile extends PureComponent {
this.emitCanUpdateAccount(true);
};
uploadProfileImage = () => {
uploadProfileImage = async () => {
const {profileImage} = this.state;
const {currentUser} = this.props;
const fileData = buildFileUploadData(profileImage);
@ -208,7 +210,13 @@ export default class EditProfile extends PureComponent {
type: fileData.type,
};
return RNFetchBlob.fetch('POST', `${Client4.getUserRoute(currentUser.id)}/image`, headers, [fileInfo]);
const certificate = await mattermostBucket.getPreference('cert', LocalConfig.AppGroupId);
const options = {
timeout: 10000,
certificate,
};
return RNFetchBlob.config(options).fetch('POST', `${Client4.getUserRoute(currentUser.id)}/image`, headers, [fileInfo]);
};
updateField = (field) => {

View file

@ -10,7 +10,7 @@ import {
TouchableOpacity,
View,
} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {intlShape} from 'react-intl';
import {Client4} from 'mattermost-redux/client';

View file

@ -4,7 +4,7 @@
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import {Alert, Animated, CameraRoll, InteractionManager, StyleSheet, Text, TouchableOpacity, View} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {CircularProgress} from 'react-native-circular-progress';
import Icon from 'react-native-vector-icons/Ionicons';
import {intlShape} from 'react-intl';

View file

@ -16,7 +16,7 @@ import {
TouchableOpacity,
View,
} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import Icon from 'react-native-vector-icons/Ionicons';
import LinearGradient from 'react-native-linear-gradient';
import {intlShape} from 'react-intl';

View file

@ -11,7 +11,7 @@ import {
View,
} from 'react-native';
import Video from 'react-native-video';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {intlShape} from 'react-intl';
import EventEmitter from 'mattermost-redux/utils/event_emitter';

View file

@ -6,6 +6,7 @@ import PropTypes from 'prop-types';
import {intlShape} from 'react-intl';
import {
ActivityIndicator,
DeviceEventEmitter,
Image,
Keyboard,
KeyboardAvoidingView,
@ -17,7 +18,7 @@ import {
View,
} from 'react-native';
import Button from 'react-native-button';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {Client4} from 'mattermost-redux/client';
@ -25,6 +26,7 @@ import ErrorText from 'app/components/error_text';
import FormattedText from 'app/components/formatted_text';
import QuickTextInput from 'app/components/quick_text_input';
import {UpgradeTypes} from 'app/constants/view';
import fetchConfig from 'app/fetch_preconfig';
import mattermostBucket from 'app/mattermost_bucket';
import PushNotifications from 'app/push_notifications';
import {GlobalStyles} from 'app/styles';
@ -82,13 +84,14 @@ export default class SelectServer extends PureComponent {
if (!allowOtherServers && serverUrl) {
// If the app is managed or AutoSelectServerUrl is true in the Config, the server url is set and the user can't change it
// we automatically trigger the ping to move to the next screen
this.onClick();
this.handleConnect();
}
if (Platform.OS === 'android') {
Keyboard.addListener('keyboardDidHide', this.handleAndroidKeyboard);
}
this.certificateListener = DeviceEventEmitter.addListener('RNFetchBlobCertificate', this.selectCertificate);
this.props.navigator.setOnNavigatorEvent(this.handleNavigatorEvent);
}
@ -110,11 +113,24 @@ export default class SelectServer extends PureComponent {
}
componentWillUnmount() {
this.certificateListener.remove();
if (Platform.OS === 'android') {
Keyboard.removeListener('keyboardDidHide', this.handleAndroidKeyboard);
}
}
blur = () => {
if (this.textInput) {
this.textInput.blur();
}
};
getUrl = () => {
const urlParse = require('url-parse');
const preUrl = urlParse(this.state.url, true);
return stripTrailingSlashes(preUrl.protocol + '//' + preUrl.host + preUrl.pathname);
};
goToNextScreen = (screen, title) => {
const {navigator, theme} = this.props;
navigator.push({
@ -132,11 +148,84 @@ export default class SelectServer extends PureComponent {
});
};
handleAndroidKeyboard = () => {
this.blur();
};
handleConnect = preventDoubleTap(async () => {
const url = this.getUrl();
Keyboard.dismiss();
if (this.state.connecting || this.state.connected) {
this.cancelPing();
return;
}
if (!isValidUrl(url)) {
this.setState({
error: {
intl: {
id: 'mobile.server_url.invalid_format',
defaultMessage: 'URL must start with http:// or https://',
},
},
});
return;
}
mattermostBucket.removePreference('cert', LocalConfig.AppGroupId);
await fetchConfig();
this.pingServer(url);
});
handleLoginOptions = (props = this.props) => {
const {intl} = this.context;
const {config, license} = props;
const samlEnabled = config.EnableSaml === 'true' && license.IsLicensed === 'true' && license.SAML === 'true';
const gitlabEnabled = config.EnableSignUpWithGitLab === 'true';
let options = 0;
if (samlEnabled || gitlabEnabled) {
options += 1;
}
let screen;
let title;
if (options) {
screen = 'LoginOptions';
title = intl.formatMessage({id: 'mobile.routes.loginOptions', defaultMessage: 'Login Chooser'});
} else {
screen = 'Login';
title = intl.formatMessage({id: 'mobile.routes.login', defaultMessage: 'Login'});
}
this.props.actions.resetPing();
if (Platform.OS === 'ios') {
if (config.ExperimentalClientSideCertEnable === 'true' && config.ExperimentalClientSideCertCheck === 'primary') {
// log in automatically and send directly to the channel screen
this.loginWithCertificate();
return;
}
setTimeout(() => {
this.goToNextScreen(screen, title);
}, 350);
} else {
this.goToNextScreen(screen, title);
}
};
handleNavigatorEvent = (event) => {
if (event.id === 'didDisappear') {
switch (event.id) {
case 'didDisappear':
this.setState({
connected: false,
});
break;
}
};
@ -164,52 +253,14 @@ export default class SelectServer extends PureComponent {
});
};
handleLoginOptions = (props = this.props) => {
const {intl} = this.context;
const {config, license} = props;
const samlEnabled = config.EnableSaml === 'true' && license.IsLicensed === 'true' && license.SAML === 'true';
const gitlabEnabled = config.EnableSignUpWithGitLab === 'true';
let options = 0;
if (samlEnabled || gitlabEnabled) {
options += 1;
}
let screen;
let title;
if (options) {
screen = 'LoginOptions';
title = intl.formatMessage({id: 'mobile.routes.loginOptions', defaultMessage: 'Login Chooser'});
} else {
screen = 'Login';
title = intl.formatMessage({id: 'mobile.routes.login', defaultMessage: 'Login'});
}
this.props.actions.resetPing();
if (Platform.OS === 'ios' && LocalConfig.ExperimentalClientSideCertEnable) {
if (config.ExperimentalClientSideCertEnable === 'true' && config.ExperimentalClientSideCertCheck === 'primary') {
// log in automatically and send directly to the channel screen
this.loginWithCertificate();
return;
}
setTimeout(() => {
this.goToNextScreen(screen, title);
}, 350);
} else {
this.goToNextScreen(screen, title);
}
};
handleAndroidKeyboard = () => {
this.blur();
};
handleTextChanged = (url) => {
this.setState({url});
};
inputRef = (ref) => {
this.textInput = ref;
};
loginWithCertificate = async () => {
const {intl, navigator} = this.props;
@ -248,48 +299,6 @@ export default class SelectServer extends PureComponent {
});
};
onClick = preventDoubleTap(async () => {
const urlParse = require('url-parse');
const preUrl = urlParse(this.state.url, true);
const url = stripTrailingSlashes(preUrl.protocol + '//' + preUrl.host + preUrl.pathname);
Keyboard.dismiss();
if (this.state.connecting || this.state.connected) {
this.cancelPing();
return;
}
if (!isValidUrl(url)) {
this.setState({
error: {
intl: {
id: 'mobile.server_url.invalid_format',
defaultMessage: 'URL must start with http:// or https://',
},
},
});
return;
}
if (LocalConfig.ExperimentalClientSideCertEnable && Platform.OS === 'ios') {
RNFetchBlob.cba.selectCertificate((certificate) => {
if (certificate) {
mattermostBucket.setPreference('cert', certificate, LocalConfig.AppGroupId);
window.fetch = new RNFetchBlob.polyfill.Fetch({
auto: true,
certificate,
}).build();
this.pingServer(url);
}
});
} else {
this.pingServer(url);
}
});
pingServer = (url) => {
const {
getPing,
@ -345,14 +354,16 @@ export default class SelectServer extends PureComponent {
});
};
inputRef = (ref) => {
this.textInput = ref;
};
blur = () => {
if (this.textInput) {
this.textInput.blur();
}
selectCertificate = () => {
const url = this.getUrl();
RNFetchBlob.cba.selectCertificate((certificate) => {
if (certificate) {
mattermostBucket.setPreference('cert', certificate, LocalConfig.AppGroupId);
fetchConfig().then(() => {
this.pingServer(url);
});
}
});
};
render() {
@ -426,7 +437,7 @@ export default class SelectServer extends PureComponent {
value={url}
editable={!inputDisabled}
onChangeText={this.handleTextChanged}
onSubmitEditing={this.onClick}
onSubmitEditing={this.handleConnect}
style={inputStyle}
autoCapitalize='none'
autoCorrect={false}
@ -440,7 +451,7 @@ export default class SelectServer extends PureComponent {
disableFullscreenUI={true}
/>
<Button
onPress={this.onClick}
onPress={this.handleConnect}
containerStyle={[GlobalStyles.signupButton, style.connectButton]}
>
{buttonIcon}

View file

@ -8,7 +8,7 @@ import assert from 'assert';
import {ViewTypes} from 'app/constants';
import {messageRetention} from 'app/store/middleware';
jest.mock('react-native-fetch-blob/fs', () => ({
jest.mock('rn-fetch-blob/fs', () => ({
dirs: {
DocumentDir: () => jest.fn(),
CacheDir: () => jest.fn(),

View file

@ -2,7 +2,7 @@
// See LICENSE.txt for license information.
import {Platform} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import mimeDB from 'mime-db';
import {lookupMimeType} from 'mattermost-redux/utils/file_utils';

View file

@ -3,7 +3,7 @@
// Based on the work done by https://github.com/wcandillon/react-native-expo-image-cache/
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {DeviceTypes} from 'app/constants';
import mattermostBucket from 'app/mattermost_bucket';
@ -27,7 +27,7 @@ export default class ImageCacheManager {
listener(path);
} else {
addListener(uri, listener);
if (uri.startsWith('file://')) {
if (!uri.startsWith('http')) {
// In case the uri we are trying to cache is already a local file just notify and return
notifyAll(uri, uri);
return;

View file

@ -1,26 +1,45 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {NetInfo} from 'react-native';
import RNFetchBlob from 'react-native-fetch-blob';
import {NetInfo, Platform} from 'react-native';
import RNFetchBlob from 'rn-fetch-blob';
import {Client4} from 'mattermost-redux/client';
import mattermostBucket from 'app/mattermost_bucket';
import LocalConfig from 'assets/config';
const PING_TIMEOUT = 10000;
let certificate = '';
let checking = false;
export async function checkConnection(isConnected) {
if (!Client4.getBaseRoute().startsWith('http')) {
if (!Client4.getBaseRoute().startsWith('http') || checking) {
// If we don't have a server yet, return the default implementation
return isConnected;
}
// Ping the Mattermost server to detect if the we have network connection even if the websocket cannot connect
checking = true;
const server = `${Client4.getBaseRoute()}/system/ping?time=${Date.now()}`;
const config = {
timeout: PING_TIMEOUT,
auto: true,
};
if (Platform.OS === 'ios' && certificate === '') {
certificate = await mattermostBucket.getPreference('cert', LocalConfig.AppGroupId);
config.certificate = certificate;
}
try {
await RNFetchBlob.config({timeout: PING_TIMEOUT}).fetch('GET', server);
await RNFetchBlob.config(config).fetch('GET', server);
checking = false;
return true;
} catch (error) {
checking = false;
return false;
}
}

View file

@ -12,7 +12,6 @@
"MobileNoticeURL": "https://about.mattermost.com/mobile-notice-txt/",
"SegmentApiKey": "oPPT2MA24VYZTBGDyXtUDa7u50lkPIE4",
"ExperimentalUsernamePressIsMention": false,
"ExperimentalClientSideCertEnable": false,
"HideEmailLoginExperimental": false,
"HideGitLabLoginExperimental": false,

View file

@ -5,7 +5,6 @@
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
@ -50,8 +49,6 @@
7F43D5D61F6BF8C2001FC614 /* libRNLocalAuth.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F8C49871F3DFC30003A22BA /* libRNLocalAuth.a */; };
7F43D5D71F6BF8D0001FC614 /* libRNPasscodeStatus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F8C49F81F3E0710003A22BA /* libRNPasscodeStatus.a */; };
7F43D5D81F6BF8E9001FC614 /* libJailMonkey.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F8C4A621F3E21FB003A22BA /* libJailMonkey.a */; };
7F43D5D91F6BF8F4001FC614 /* libFastImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F8AAB3C1F4E0FEB00F5A52C /* libFastImage.a */; };
7F43D5DA1F6BF92C001FC614 /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 375218411F4B9E320035444B /* libRNFetchBlob.a */; };
7F43D5DB1F6BF93B001FC614 /* libReactNativeExceptionHandler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FA7950B1F61A1A500C02924 /* libReactNativeExceptionHandler.a */; };
7F43D5DC1F6BF946001FC614 /* libRNSentry.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FA795061F61A1A500C02924 /* libRNSentry.a */; };
7F43D5DD1F6BF95F001FC614 /* libRNCookieManagerIOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 372E25671F5F0E1800A2BFAB /* libRNCookieManagerIOS.a */; };
@ -69,7 +66,6 @@
7F6C47A51FE87E8C00F5A912 /* PerformRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F6C47A41FE87E8C00F5A912 /* PerformRequests.m */; };
7F7D7F98201645E100D31155 /* libReactNativePermissions.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7F7D7F87201645D300D31155 /* libReactNativePermissions.a */; };
7F95132F208646CE00616E3E /* 0155-keys.png in Resources */ = {isa = PBXBuildFile; fileRef = 7F9512EA208646CD00616E3E /* 0155-keys.png */; };
7FB6006B1FE3116800DB284F /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 375218411F4B9E320035444B /* libRNFetchBlob.a */; };
7FBB5E9B1E1F5A4B000DE18A /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FDF290C1E1F4B4E00DBBE56 /* libRNVectorIcons.a */; };
7FC200E81EBB65370099331B /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FC200DF1EBB65100099331B /* libReactNativeNavigation.a */; };
7FC649EE1FE983660074E4C7 /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 349FBA7338E74D9BBD709528 /* EvilIcons.ttf */; };
@ -80,6 +76,8 @@
7FEB109D1F61019C0039A015 /* MattermostManaged.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB109A1F61019C0039A015 /* MattermostManaged.m */; };
7FEB109E1F61019C0039A015 /* UIImage+ImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB109C1F61019C0039A015 /* UIImage+ImageEffects.m */; };
7FF2AF8B2086483E00FFBDF4 /* KeyShareConsumer.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7FF2AF8A2086483E00FFBDF4 /* KeyShareConsumer.storyboard */; };
7FF31C1421330B7900680B75 /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FF31C1321330B4200680B75 /* libRNFetchBlob.a */; };
7FF31C1521330BAD00680B75 /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7FF31C1321330B4200680B75 /* libRNFetchBlob.a */; };
7FF7BE2C1FDEE4AE005E55FE /* MattermostManaged.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FEB109A1F61019C0039A015 /* MattermostManaged.m */; };
7FF7BE6D1FDEE5E8005E55FE /* MattermostBucket.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FF7BE6C1FDEE5E8005E55FE /* MattermostBucket.m */; };
7FF7BE6E1FDEE5E8005E55FE /* MattermostBucket.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FF7BE6C1FDEE5E8005E55FE /* MattermostBucket.m */; };
@ -185,13 +183,6 @@
remoteGlobalIDString = 1BD725DA1CF77A8B005DBD79;
remoteInfo = RNCookieManagerIOS;
};
375218401F4B9E320035444B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 546CB0A5BB8F453890CBA559 /* RNFetchBlob.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = A15C300E1CD25C330074CB35;
remoteInfo = RNFetchBlob;
};
3752184E1F4B9E980035444B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 3752184A1F4B9E980035444B /* RCTCameraRoll.xcodeproj */;
@ -500,13 +491,6 @@
remoteGlobalIDString = 9D23B34F1C767B80008B4819;
remoteInfo = ReactNativePermissions;
};
7F8AAB3B1F4E0FEB00F5A52C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 50ECB1D221E44F51B5690DF2 /* FastImage.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = A287971D1DE0C0A60081BDFA;
remoteInfo = FastImage;
};
7F8C49861F3DFC30003A22BA /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = D0281D64B98143668D6AD42B /* RNLocalAuth.xcodeproj */;
@ -591,6 +575,13 @@
remoteGlobalIDString = 5DBEB1501B18CEA900B34395;
remoteInfo = RNVectorIcons;
};
7FF31C1221330B4200680B75 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 7FF31C0E21330B4200680B75 /* RNFetchBlob.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = A15C300E1CD25C330074CB35;
remoteInfo = RNFetchBlob;
};
7FFE328F1FD9CAF40038C7A0 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 41898656FAE24E0BB390D0E4 /* RNReactNativeDocViewer.xcodeproj */;
@ -657,7 +648,6 @@
00E356F21AD99517003FC87E /* MattermostTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MattermostTests.m; sourceTree = "<group>"; };
04AA5E8EF3B54735A11E3B95 /* MaterialCommunityIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = MaterialCommunityIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/MaterialCommunityIcons.ttf"; sourceTree = "<group>"; };
0A091BF1A3D04650AD306A0D /* Zocial.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Zocial.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Zocial.ttf"; sourceTree = "<group>"; };
0C0C75A424714EAC8E876A8F /* libFastImage.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libFastImage.a; sourceTree = "<group>"; };
0E617BF0F36D4E738F51D169 /* OpenSans-SemiboldItalic.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = "OpenSans-SemiboldItalic.ttf"; path = "../assets/fonts/OpenSans-SemiboldItalic.ttf"; sourceTree = "<group>"; };
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
@ -688,9 +678,7 @@
4246DC09024BB33A3E491E25 /* libPods-MattermostTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-MattermostTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
4A22BC320BA04E18A7F2A4E6 /* libReactNativeExceptionHandler.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libReactNativeExceptionHandler.a; sourceTree = "<group>"; };
4B19E38FBCB94C57BB03B8E6 /* libRNFetchBlob.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFetchBlob.a; sourceTree = "<group>"; };
50ECB1D221E44F51B5690DF2 /* FastImage.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = FastImage.xcodeproj; path = "../node_modules/react-native-fast-image/ios/FastImage.xcodeproj"; sourceTree = "<group>"; };
51F5A483EA9F4A9A87ACFB59 /* Foundation.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Foundation.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Foundation.ttf"; sourceTree = "<group>"; };
546CB0A5BB8F453890CBA559 /* RNFetchBlob.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFetchBlob.xcodeproj; path = "../node_modules/react-native-fetch-blob/ios/RNFetchBlob.xcodeproj"; sourceTree = "<group>"; };
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
62A58E5E984E4CF1811620B8 /* RNCookieManagerIOS.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNCookieManagerIOS.xcodeproj; path = "../node_modules/react-native-cookies/ios/RNCookieManagerIOS.xcodeproj"; sourceTree = "<group>"; };
634A8F047C73D24A87850EC0 /* Pods-Mattermost.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Mattermost.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Mattermost/Pods-Mattermost.debug.xcconfig"; sourceTree = "<group>"; };
@ -732,6 +720,7 @@
7FEB109B1F61019C0039A015 /* UIImage+ImageEffects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+ImageEffects.h"; path = "Mattermost/UIImage+ImageEffects.h"; sourceTree = "<group>"; };
7FEB109C1F61019C0039A015 /* UIImage+ImageEffects.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ImageEffects.m"; path = "Mattermost/UIImage+ImageEffects.m"; sourceTree = "<group>"; };
7FF2AF8A2086483E00FFBDF4 /* KeyShareConsumer.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = KeyShareConsumer.storyboard; sourceTree = "<group>"; };
7FF31C0E21330B4200680B75 /* RNFetchBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNFetchBlob.xcodeproj; path = "../node_modules/rn-fetch-blob/ios/RNFetchBlob.xcodeproj"; sourceTree = "<group>"; };
7FF7BE6B1FDEE5E8005E55FE /* MattermostBucket.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MattermostBucket.h; sourceTree = "<group>"; };
7FF7BE6C1FDEE5E8005E55FE /* MattermostBucket.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MattermostBucket.m; sourceTree = "<group>"; };
7FFE329A1FD9CB640038C7A0 /* MattermostShare.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = MattermostShare.appex; sourceTree = BUILT_PRODUCTS_DIR; };
@ -801,6 +790,7 @@
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
7FF31C1421330B7900680B75 /* libRNFetchBlob.a in Frameworks */,
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
@ -813,8 +803,6 @@
7F43D5D71F6BF8D0001FC614 /* libRNPasscodeStatus.a in Frameworks */,
7F7D7F98201645E100D31155 /* libReactNativePermissions.a in Frameworks */,
7F43D5D81F6BF8E9001FC614 /* libJailMonkey.a in Frameworks */,
7F43D5D91F6BF8F4001FC614 /* libFastImage.a in Frameworks */,
7F43D5DA1F6BF92C001FC614 /* libRNFetchBlob.a in Frameworks */,
7F43D5DB1F6BF93B001FC614 /* libReactNativeExceptionHandler.a in Frameworks */,
7F43D5DC1F6BF946001FC614 /* libRNSentry.a in Frameworks */,
DEBCF44F1F46413BB407D316 /* libz.tbd in Frameworks */,
@ -839,7 +827,6 @@
7FFE32E71FD9CCD00038C7A0 /* libART.a in Frameworks */,
7F3F66101FE4281A0085CA0E /* libRNSentry.a in Frameworks */,
7F642DF1209353A400F3165E /* libRNDeviceInfo.a in Frameworks */,
7FB6006B1FE3116800DB284F /* libRNFetchBlob.a in Frameworks */,
7FF7BE6F1FDF3CE4005E55FE /* libRNVectorIcons.a in Frameworks */,
7F380D0B1FDB3CFC0061AAD2 /* libRCTVideo.a in Frameworks */,
7FFE32F11FD9D64E0038C7A0 /* libRCTWebSocket.a in Frameworks */,
@ -847,6 +834,7 @@
7FFE32EF1FD9CD800038C7A0 /* libRNPasscodeStatus.a in Frameworks */,
7F3F66021FE426EE0085CA0E /* libRNSVG.a in Frameworks */,
7FFE32ED1FD9CD450038C7A0 /* libRCTNetwork.a in Frameworks */,
7FF31C1521330BAD00680B75 /* libRNFetchBlob.a in Frameworks */,
7FFE32EC1FD9CD360038C7A0 /* libRCTText.a in Frameworks */,
7FFE32EB1FD9CD170038C7A0 /* libRCTImage.a in Frameworks */,
7FFE32E91FD9CCF40038C7A0 /* libRCTAnimation.a in Frameworks */,
@ -1021,14 +1009,6 @@
name = Products;
sourceTree = "<group>";
};
3752181C1F4B9E320035444B /* Products */ = {
isa = PBXGroup;
children = (
375218411F4B9E320035444B /* libRNFetchBlob.a */,
);
name = Products;
sourceTree = "<group>";
};
3752184B1F4B9E980035444B /* Products */ = {
isa = PBXGroup;
children = (
@ -1196,14 +1176,6 @@
name = Products;
sourceTree = "<group>";
};
7F8AAB371F4E0FEB00F5A52C /* Products */ = {
isa = PBXGroup;
children = (
7F8AAB3C1F4E0FEB00F5A52C /* libFastImage.a */,
);
name = Products;
sourceTree = "<group>";
};
7F8C49621F3DFC30003A22BA /* Products */ = {
isa = PBXGroup;
children = (
@ -1294,6 +1266,14 @@
name = Products;
sourceTree = "<group>";
};
7FF31C0F21330B4200680B75 /* Products */ = {
isa = PBXGroup;
children = (
7FF31C1321330B4200680B75 /* libRNFetchBlob.a */,
);
name = Products;
sourceTree = "<group>";
};
7FFE328C1FD9CAF40038C7A0 /* Products */ = {
isa = PBXGroup;
children = (
@ -1329,10 +1309,10 @@
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
7FF31C0E21330B4200680B75 /* RNFetchBlob.xcodeproj */,
7F5CA956208FE38F004F91CE /* RNDocumentPicker.xcodeproj */,
7F642DE72093530B00F3165E /* RNDeviceInfo.xcodeproj */,
74D116A4208A8D3000CF8A79 /* RNKeychain.xcodeproj */,
546CB0A5BB8F453890CBA559 /* RNFetchBlob.xcodeproj */,
7FD8DE972029ECDE001AAC5E /* RNTableView.xcodeproj */,
7F7D7F52201645D300D31155 /* ReactNativePermissions.xcodeproj */,
7FDB92751F706F45006CDFD1 /* RNImagePicker.xcodeproj */,
@ -1359,7 +1339,6 @@
D0281D64B98143668D6AD42B /* RNLocalAuth.xcodeproj */,
EBA6063A99C141098D40C67A /* RNPasscodeStatus.xcodeproj */,
27A6EA89298440439DA9F98D /* JailMonkey.xcodeproj */,
50ECB1D221E44F51B5690DF2 /* FastImage.xcodeproj */,
3B1E210BF3B649BBBF427977 /* ReactNativeExceptionHandler.xcodeproj */,
9552041247E749308CE7B412 /* RNSentry.xcodeproj */,
62A58E5E984E4CF1811620B8 /* RNCookieManagerIOS.xcodeproj */,
@ -1544,10 +1523,6 @@
ProductGroup = 37D8FEBE1E80B5230091F3BD /* Products */;
ProjectRef = 7DCC3D826CE640AF8F491692 /* BVLinearGradient.xcodeproj */;
},
{
ProductGroup = 7F8AAB371F4E0FEB00F5A52C /* Products */;
ProjectRef = 50ECB1D221E44F51B5690DF2 /* FastImage.xcodeproj */;
},
{
ProductGroup = 7F8C4A5D1F3E21FB003A22BA /* Products */;
ProjectRef = 27A6EA89298440439DA9F98D /* JailMonkey.xcodeproj */;
@ -1637,8 +1612,8 @@
ProjectRef = 7F5CA956208FE38F004F91CE /* RNDocumentPicker.xcodeproj */;
},
{
ProductGroup = 3752181C1F4B9E320035444B /* Products */;
ProjectRef = 546CB0A5BB8F453890CBA559 /* RNFetchBlob.xcodeproj */;
ProductGroup = 7FF31C0F21330B4200680B75 /* Products */;
ProjectRef = 7FF31C0E21330B4200680B75 /* RNFetchBlob.xcodeproj */;
},
{
ProductGroup = 7FDB92761F706F45006CDFD1 /* Products */;
@ -1762,13 +1737,6 @@
remoteRef = 372E25661F5F0E1800A2BFAB /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
375218411F4B9E320035444B /* libRNFetchBlob.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNFetchBlob.a;
remoteRef = 375218401F4B9E320035444B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
3752184F1F4B9E980035444B /* libRCTCameraRoll.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -2077,13 +2045,6 @@
remoteRef = 7F7D7F86201645D300D31155 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
7F8AAB3C1F4E0FEB00F5A52C /* libFastImage.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libFastImage.a;
remoteRef = 7F8AAB3B1F4E0FEB00F5A52C /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
7F8C49871F3DFC30003A22BA /* libRNLocalAuth.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -2168,6 +2129,13 @@
remoteRef = 7FDF290B1E1F4B4E00DBBE56 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
7FF31C1321330B4200680B75 /* libRNFetchBlob.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libRNFetchBlob.a;
remoteRef = 7FF31C1221330B4200680B75 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
7FFE32901FD9CAF40038C7A0 /* libRNReactNativeDocViewer.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@ -2410,10 +2378,6 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"$(inherited)",
@ -2443,10 +2407,6 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"$(inherited)",
@ -2479,8 +2439,7 @@
"$(SRCROOT)/../node_modules/react-native-passcode-status/ios",
"$(SRCROOT)/../node_modules/jail-monkey/JailMonkey",
"$(SRCROOT)/../node_modules/react-native/Libraries/**",
"$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**",
"$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/react-native-exception-handler/ios",
"$(SRCROOT)/../node_modules/react-native-sentry/ios/**",
"$(SRCROOT)/../node_modules/react-native-cookies/ios/RNCookieManagerIOS",
@ -2529,8 +2488,7 @@
"$(SRCROOT)/../node_modules/react-native-passcode-status/ios",
"$(SRCROOT)/../node_modules/jail-monkey/JailMonkey",
"$(SRCROOT)/../node_modules/react-native/Libraries/**",
"$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**",
"$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/react-native-exception-handler/ios",
"$(SRCROOT)/../node_modules/react-native-sentry/ios/**",
"$(SRCROOT)/../node_modules/react-native-cookies/ios/RNCookieManagerIOS",
@ -2592,8 +2550,7 @@
"$(SRCROOT)/../node_modules/react-native-local-auth/**",
"$(SRCROOT)/../node_modules/react-native-passcode-status/ios/**",
"$(SRCROOT)/../node_modules/jail-monkey/JailMonkey/**",
"$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**",
"$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/react-native-sentry/ios/**",
"$(SRCROOT)/../node_modules/react-native-cookies/ios/RNCookieManagerIOS/**",
"$(SRCROOT)/../node_modules/react-native-video/ios/**",
@ -2651,8 +2608,7 @@
"$(SRCROOT)/../node_modules/react-native-local-auth/**",
"$(SRCROOT)/../node_modules/react-native-passcode-status/ios/**",
"$(SRCROOT)/../node_modules/jail-monkey/JailMonkey/**",
"$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**",
"$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**",
"$(SRCROOT)/../node_modules/react-native-sentry/ios/**",
"$(SRCROOT)/../node_modules/react-native-cookies/ios/RNCookieManagerIOS/**",
"$(SRCROOT)/../node_modules/react-native-video/ios/**",

58
package-lock.json generated
View file

@ -10806,6 +10806,7 @@
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
"optional": true,
"requires": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
@ -12114,7 +12115,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
"dev": true
"dev": true,
"optional": true
},
"loose-envify": {
"version": "1.3.1",
@ -14779,37 +14781,6 @@
"resolved": "https://registry.npmjs.org/react-native-exception-handler/-/react-native-exception-handler-2.7.5.tgz",
"integrity": "sha1-lQjlIefKtWHau6XyujUBmWEHc7s="
},
"react-native-fast-image": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/react-native-fast-image/-/react-native-fast-image-4.0.8.tgz",
"integrity": "sha512-/FC2M3ZDqmQRERQpYlyMhyr7eX5euvi9bXkowNY5A7t/bRB09LSsfQbk8FtI2stgSgA6d0YUXHt3ll7m/ZB0SQ==",
"requires": {
"prop-types": "^15.5.10"
}
},
"react-native-fetch-blob": {
"version": "github:enahum/react-native-fetch-blob#383d8dd2e46e370026c10d9b94a5943ee5fda002",
"from": "github:enahum/react-native-fetch-blob#383d8dd2e46e370026c10d9b94a5943ee5fda002",
"requires": {
"base-64": "0.1.0",
"glob": "7.0.6"
},
"dependencies": {
"glob": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
"integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.2",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
}
}
},
"react-native-image-gallery": {
"version": "github:enahum/react-native-image-gallery#a98b1051e94f5a394541ca1ff9b15e2c9ffed84f",
"from": "react-native-image-gallery@github:enahum/react-native-image-gallery#a98b1051e94f5a394541ca1ff9b15e2c9ffed84f",
@ -15798,6 +15769,29 @@
"glob": "^7.0.5"
}
},
"rn-fetch-blob": {
"version": "github:enahum/react-native-fetch-blob#c754e92c0d4193de65ec23bba4844980be37c496",
"from": "github:enahum/react-native-fetch-blob#c754e92c0d4193de65ec23bba4844980be37c496",
"requires": {
"base-64": "0.1.0",
"glob": "7.0.6"
},
"dependencies": {
"glob": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
"integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.2",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
}
}
},
"rn-host-detect": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.1.3.tgz",

View file

@ -10,7 +10,7 @@
"@types/react-native-calendars": "1.20.2",
"analytics-react-native": "1.2.0",
"commonmark": "github:mattermost/commonmark.js#e5c34706cafa2924370772ff47937b833648a6de",
"commonmark-react-renderer": "mattermost/commonmark-react-renderer#86fa63f898802953842526c2030f3b63c5d1ae7a",
"commonmark-react-renderer": "github:mattermost/commonmark-react-renderer#86fa63f898802953842526c2030f3b63c5d1ae7a",
"deep-equal": "1.0.1",
"fuse.js": "^3.2.0",
"intl": "1.2.5",
@ -28,21 +28,19 @@
"react-native-calendars": "1.20.0",
"react-native-circular-progress": "0.2.0",
"react-native-cookies": "3.2.0",
"react-native-device-info": "enahum/react-native-device-info.git#a7bb3cff1086780b2c791a3e43e5b826fdf3ab11",
"react-native-device-info": "github:enahum/react-native-device-info#a7bb3cff1086780b2c791a3e43e5b826fdf3ab11",
"react-native-doc-viewer": "2.7.8",
"react-native-document-picker": "2.1.0",
"react-native-drawer-layout": "2.0.0",
"react-native-exception-handler": "2.7.5",
"react-native-fast-image": "4.0.8",
"react-native-fetch-blob": "enahum/react-native-fetch-blob.git#383d8dd2e46e370026c10d9b94a5943ee5fda002",
"react-native-image-gallery": "enahum/react-native-image-gallery#a98b1051e94f5a394541ca1ff9b15e2c9ffed84f",
"react-native-image-gallery": "github:enahum/react-native-image-gallery#a98b1051e94f5a394541ca1ff9b15e2c9ffed84f",
"react-native-image-picker": "0.26.7",
"react-native-keyboard-aware-scroll-view": "0.5.0",
"react-native-keychain": "3.0.0-rc.3",
"react-native-linear-gradient": "2.4.0",
"react-native-local-auth": "enahum/react-native-local-auth.git#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab",
"react-native-local-auth": "github:enahum/react-native-local-auth#cc9ce2f468fbf7b431dfad3191a31aaa9227a6ab",
"react-native-navigation": "1.1.450",
"react-native-notifications": "enahum/react-native-notifications.git#663ffe3c4403b185093920c4551f117801499b73",
"react-native-notifications": "github:enahum/react-native-notifications#663ffe3c4403b185093920c4551f117801499b73",
"react-native-passcode-status": "1.1.1",
"react-native-permissions": "1.1.1",
"react-native-safe-area": "0.2.3",
@ -55,7 +53,7 @@
"react-native-tooltip": "5.2.0",
"react-native-vector-icons": "4.6.0",
"react-native-video": "3.2.0",
"react-native-youtube": "enahum/react-native-youtube#3f395b620ae4e05a3f1c6bdeef3a1158e78daadc",
"react-native-youtube": "github:enahum/react-native-youtube#3f395b620ae4e05a3f1c6bdeef3a1158e78daadc",
"react-navigation": "1.5.11",
"react-redux": "5.0.7",
"redux": "4.0.0",
@ -64,6 +62,7 @@
"redux-persist-transform-filter": "0.0.16",
"redux-thunk": "2.2.0",
"reselect": "3.0.1",
"rn-fetch-blob": "github:enahum/react-native-fetch-blob#c754e92c0d4193de65ec23bba4844980be37c496",
"rn-placeholder": "github:enahum/rn-placeholder#4b065f892d7a7f9d921a969f2e72e609ebc0a212",
"semver": "5.5.0",
"shallow-equals": "1.0.0",

View file

@ -18,7 +18,7 @@ import {
import MaterialIcon from 'react-native-vector-icons/MaterialIcons';
import Video from 'react-native-video';
import LocalAuth from 'react-native-local-auth';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {Preferences} from 'mattermost-redux/constants';
import {getFormattedFileSize, lookupMimeType} from 'mattermost-redux/utils/file_utils';

View file

@ -18,7 +18,7 @@ import {
import IonIcon from 'react-native-vector-icons/Ionicons';
import Video from 'react-native-video';
import LocalAuth from 'react-native-local-auth';
import RNFetchBlob from 'react-native-fetch-blob';
import RNFetchBlob from 'rn-fetch-blob';
import {Client4} from 'mattermost-redux/client';
import {General} from 'mattermost-redux/constants';