diff --git a/android/app/build.gradle b/android/app/build.gradle index d224d8bbe286d6bb27bc98e12220b17d8f01a05d..b5061cd0c6a0984469b878ffa995a453b33f50fd 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -103,6 +103,7 @@ android { abiFilters "armeabi-v7a", "x86" } missingDimensionStrategy "RNN.reactNativeVersion", "reactNative55" + vectorDrawables.useSupportLibrary = true } compileOptions { @@ -178,17 +179,17 @@ repositories { } dependencies { + implementation project(':react-native-image-crop-picker') implementation project(':react-native-i18n') implementation project(':react-native-fabric') implementation project(':react-native-audio') implementation project(":reactnativekeyboardinput") implementation project(':react-native-video') implementation project(':react-native-svg') - implementation project(':react-native-image-picker') implementation project(':react-native-vector-icons') - implementation project(':react-native-fetch-blob') + implementation project(':rn-fetch-blob') implementation project(':react-native-zeroconf') - implementation project(':react-native-toast') + implementation project(':@remobile/react-native-toast') implementation project(':react-native-fast-image') implementation project(':realm') implementation project(':react-native-navigation') diff --git a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf index 69404e3d9758bf3d6a7e4ce27e5362089366542f..82524a0c1223bfc2bf060a9b16390c3cc21577c1 100644 Binary files a/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf and b/android/app/src/main/assets/fonts/MaterialCommunityIcons.ttf differ diff --git a/android/app/src/main/assets/fonts/Octicons.ttf b/android/app/src/main/assets/fonts/Octicons.ttf index 5b1f7d6ea2c870df4f29f4b40a300334844d2214..09f5a96c05af2c82a0002f0d8b0fca6ba3f08fc7 100644 Binary files a/android/app/src/main/assets/fonts/Octicons.ttf and b/android/app/src/main/assets/fonts/Octicons.ttf differ diff --git a/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java b/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java index 6f4059c825c132f8f4c92a40b94558b2207286d5..fdd50ce076238085b671c5c7939ad5e370a411e5 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java +++ b/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java @@ -4,6 +4,7 @@ import android.content.Context; import android.os.Bundle; import com.AlexanderZaytsev.RNI18n.RNI18nPackage; +import com.reactnative.ivpusic.imagepicker.PickerPackage; import com.RNFetchBlob.RNFetchBlobPackage; import com.balthazargronon.RCTZeroconf.ZeroconfReactPackage; import com.brentvatne.react.ReactVideoPackage; @@ -12,7 +13,6 @@ import com.dylanvann.fastimage.FastImageViewPackage; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.horcrux.svg.SvgPackage; -import com.imagepicker.ImagePickerPackage; import com.oblador.vectoricons.VectorIconsPackage; import com.reactnativenavigation.NavigationApplication; import com.remobile.toast.RCTToastPackage; @@ -57,8 +57,8 @@ public class MainApplication extends NavigationApplication implements INotificat public List<ReactPackage> createAdditionalReactPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), + new PickerPackage(), new SvgPackage(), - new ImagePickerPackage(), new VectorIconsPackage(), new RNFetchBlobPackage(), new ZeroconfReactPackage(), diff --git a/android/build.gradle b/android/build.gradle index d6cd4cf1bf879858654854146780e83a95082e22..7b1e283f5e8a322ed2b7636a57f3c49811ec5414 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -25,6 +25,7 @@ allprojects { maven { url 'https://maven.google.com' } + maven { url "https://jitpack.io" } maven { // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm url "$rootDir/../node_modules/react-native/android" diff --git a/android/settings.gradle b/android/settings.gradle index 0cc5136b62e89a82bcb7bd16f4cd8a9cf08d52ab..7a757615370bcc20c6b1d44672932b45a515905c 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,4 +1,10 @@ rootProject.name = 'RocketChatRN' +include ':@remobile/react-native-toast' +project(':@remobile/react-native-toast').projectDir = new File(rootProject.projectDir, '../node_modules/@remobile/react-native-toast/android') +include ':rn-fetch-blob' +project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android') +include ':react-native-image-crop-picker' +project(':react-native-image-crop-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-crop-picker/android') include ':react-native-i18n' project(':react-native-i18n').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-i18n/android') include ':react-native-fast-image' @@ -13,18 +19,12 @@ include ':react-native-video' project(':react-native-video').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-video/android') include ':react-native-svg' project(':react-native-svg').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-svg/android') -include ':react-native-image-picker' -project(':react-native-image-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-image-picker/android') include ':react-native-vector-icons' project(':react-native-vector-icons').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-vector-icons/android') -include ':react-native-fetch-blob' -project(':react-native-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-fetch-blob/android') include ':react-native-zeroconf' project(':react-native-zeroconf').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-zeroconf/android') include ':realm' project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android') -include ':react-native-toast' -project(':react-native-toast').projectDir = new File(settingsDir, '../node_modules/@remobile/react-native-toast/android') include ':react-native-navigation' project(':react-native-navigation').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-navigation/android/app/') include ':reactnativenotifications' diff --git a/app/containers/Button/index.js b/app/containers/Button/index.js index f72880b2cc6a622b0dc3049b5e86f8f27119274d..32eb7de947eee26d60c93729f0db28594b7358da 100644 --- a/app/containers/Button/index.js +++ b/app/containers/Button/index.js @@ -16,8 +16,7 @@ const colors = { const styles = StyleSheet.create({ container: { paddingHorizontal: 15, - paddingVertical: 10, - borderRadius: 2 + paddingVertical: 10 }, text: { textAlign: 'center', @@ -40,6 +39,9 @@ const styles = StyleSheet.create({ }, disabled: { opacity: 0.5 + }, + border: { + borderRadius: 2 } }); @@ -48,7 +50,9 @@ export default class Button extends React.PureComponent { title: PropTypes.string, type: PropTypes.string, onPress: PropTypes.func, - disabled: PropTypes.bool + disabled: PropTypes.bool, + margin: PropTypes.any, + backgroundColor: PropTypes.string } static defaultProps = { @@ -60,21 +64,22 @@ export default class Button extends React.PureComponent { render() { const { - title, type, onPress, disabled, ...otherProps + title, type, onPress, disabled, margin, backgroundColor, ...otherProps } = this.props; return ( <Touch onPress={onPress} accessibilityTraits='button' - style={Platform.OS === 'ios' && styles.margin} + style={Platform.OS === 'ios' && [(margin || styles.margin), styles.border]} disabled={disabled} {...otherProps} > <View style={[ styles.container, - styles[`background_${ type }`], - Platform.OS === 'android' && styles.margin, + styles.border, + backgroundColor ? { backgroundColor } : styles[`background_${ type }`], + Platform.OS === 'android' && (margin || styles.margin), disabled && styles.disabled ]} > diff --git a/app/containers/MessageBox/FilesActions.js b/app/containers/MessageBox/FilesActions.js new file mode 100644 index 0000000000000000000000000000000000000000..e7def299d146207b26fcaa636573af2fd71f79a6 --- /dev/null +++ b/app/containers/MessageBox/FilesActions.js @@ -0,0 +1,59 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import ActionSheet from 'react-native-actionsheet'; + +import I18n from '../../i18n'; + +export default class FilesActions extends Component { + static propTypes = { + hideActions: PropTypes.func.isRequired, + takePhoto: PropTypes.func.isRequired, + chooseFromLibrary: PropTypes.func.isRequired + } + + constructor(props) { + super(props); + + // Cancel + this.options = [I18n.t('Cancel')]; + this.CANCEL_INDEX = 0; + + // Photo + this.options.push(I18n.t('Take_a_photo')); + this.PHOTO_INDEX = 1; + + // Library + this.options.push(I18n.t('Choose_from_library')); + this.LIBRARY_INDEX = 2; + + setTimeout(() => { + this.ActionSheet.show(); + }); + } + + handleActionPress = (actionIndex) => { + const { takePhoto, chooseFromLibrary } = this.props; + switch (actionIndex) { + case this.PHOTO_INDEX: + takePhoto(); + break; + case this.LIBRARY_INDEX: + chooseFromLibrary(); + break; + default: + break; + } + this.props.hideActions(); + } + + render() { + return ( + <ActionSheet + ref={o => this.ActionSheet = o} + options={this.options} + cancelButtonIndex={this.CANCEL_INDEX} + onPress={this.handleActionPress} + /> + ); + } +} diff --git a/app/containers/MessageBox/UploadModal.js b/app/containers/MessageBox/UploadModal.js new file mode 100644 index 0000000000000000000000000000000000000000..53f91ed456e7169a661c0c01b10a4e1efdb76168 --- /dev/null +++ b/app/containers/MessageBox/UploadModal.js @@ -0,0 +1,133 @@ +import React, { Component } from 'react'; +import { View, Text, StyleSheet, Image, ScrollView, Platform } from 'react-native'; +import PropTypes from 'prop-types'; +import Modal from 'react-native-modal'; +import { responsive } from 'react-native-responsive-ui'; +import equal from 'deep-equal'; + +import TextInput from '../TextInput'; +import Button from '../Button'; +import I18n from '../../i18n'; + +const cancelButtonColor = '#f7f8fa'; + +const styles = StyleSheet.create({ + titleContainer: { + flexDirection: 'row', + paddingHorizontal: 16, + paddingTop: 16 + }, + title: { + fontWeight: 'bold' + }, + container: { + height: Platform.OS === 'ios' ? 404 : 430, + backgroundColor: '#ffffff', + flexDirection: 'column' + }, + scrollView: { + flex: 1, + padding: 16 + }, + image: { + height: 150, + flex: 1, + marginBottom: 16, + resizeMode: 'contain' + }, + buttonContainer: { + flexDirection: 'row', + justifyContent: 'space-between', + padding: 16, + backgroundColor: '#f7f8fa' + }, + buttonMargin: { + margin: 0 + } +}); + +@responsive +export default class UploadModal extends Component { + static propTypes = { + isVisible: PropTypes.bool, + file: PropTypes.object, + close: PropTypes.func, + submit: PropTypes.func, + window: PropTypes.object + } + + state = { + name: '', + description: '', + file: {} + }; + + static getDerivedStateFromProps(props, state) { + if (!equal(props.file, state.file) && props.file && props.file.path) { + return { + file: props.file, + name: props.file.filename || 'Filename', + description: '' + }; + } + return null; + } + + _submit = () => { + const { file, submit } = this.props; + const { name, description } = this.state; + submit({ ...file, name, description }); + } + + render() { + const { window: { width }, isVisible, close } = this.props; + const { name, description, file } = this.state; + return ( + <Modal + isVisible={isVisible} + style={{ alignItems: 'center' }} // TODO: need this? + onBackdropPress={() => this.props.close()} + onBackButtonPress={() => this.props.close()} + animationIn='fadeIn' + animationOut='fadeOut' + useNativeDriver + hideModalContentWhileAnimating + > + <View style={[styles.container, { width: width - 32 }]}> + <View style={styles.titleContainer}> + <Text style={styles.title}>Upload file?</Text> + </View> + + <ScrollView style={styles.scrollView}> + <Image source={{ isStatic: true, uri: file.path }} style={styles.image} /> + <TextInput + placeholder='File name' + value={name} + onChangeText={value => this.setState({ name: value })} + /> + <TextInput + placeholder='File description' + value={description} + onChangeText={value => this.setState({ description: value })} + /> + </ScrollView> + <View style={styles.buttonContainer}> + <Button + title={I18n.t('Cancel')} + type='secondary' + backgroundColor={cancelButtonColor} + margin={styles.buttonMargin} + onPress={close} + /> + <Button + title={I18n.t('Send')} + type='primary' + margin={styles.buttonMargin} + onPress={this._submit} + /> + </View> + </View> + </Modal> + ); + } +} diff --git a/app/containers/MessageBox/index.js b/app/containers/MessageBox/index.js index 25925ad5f92396302da8bf5a9140a1e8998d92bb..c16cc3f81f601a5e34e57b057de2eee5b859a3ab 100644 --- a/app/containers/MessageBox/index.js +++ b/app/containers/MessageBox/index.js @@ -2,10 +2,10 @@ import React from 'react'; import PropTypes from 'prop-types'; import { View, TextInput, FlatList, Text, TouchableOpacity, Alert } from 'react-native'; import Icon from 'react-native-vector-icons/MaterialIcons'; -import ImagePicker from 'react-native-image-picker'; import { connect } from 'react-redux'; import { emojify } from 'react-emojione'; import { KeyboardAccessoryView } from 'react-native-keyboard-input'; +import ImagePicker from 'react-native-image-crop-picker'; import { userTyping } from '../../actions/room'; import RocketChat from '../../lib/rocketchat'; @@ -17,6 +17,8 @@ import Avatar from '../Avatar'; import CustomEmoji from '../EmojiPicker/CustomEmoji'; import { emojis } from '../../emojis'; import Recording from './Recording'; +import FilesActions from './FilesActions'; +import UploadModal from './UploadModal'; import './EmojiKeyboard'; import log from '../../utils/log'; import I18n from '../../i18n'; @@ -28,6 +30,14 @@ const onlyUnique = function onlyUnique(value, index, self) { return self.indexOf(({ _id }) => value._id === _id) === index; }; +const imagePickerConfig = { + cropping: true, + compressImageQuality: 0.8, + cropperAvoidEmptySpaceAroundImage: false, + cropperChooseText: I18n.t('Choose'), + cropperCancelText: I18n.t('Cancel') +}; + @connect(state => ({ room: state.room, message: state.messages.message, @@ -58,7 +68,11 @@ export default class MessageBox extends React.PureComponent { text: '', mentions: [], showEmojiKeyboard: false, - recording: false + showFilesAction: false, + recording: false, + file: { + isVisible: false + } }; this.users = []; this.rooms = []; @@ -160,43 +174,60 @@ export default class MessageBox extends React.PureComponent { key='fileIcon' accessibilityLabel={I18n.t('Message actions')} accessibilityTraits='button' - onPress={() => this.addFile()} + onPress={this.toggleFilesActions} testID='messagebox-actions' />); return icons; } - addFile = () => { - const options = { - maxHeight: 1960, - maxWidth: 1960, - quality: 0.8 + toggleFilesActions = () => { + this.setState(prevState => ({ showFilesAction: !prevState.showFilesAction })); + } + + sendImageMessage = async(file) => { + this.setState({ file: { isVisible: false } }); + const fileInfo = { + name: file.name, + description: file.description, + size: file.size, + type: file.mime, + store: 'Uploads', + path: file.path }; - ImagePicker.showImagePicker(options, async(response) => { - if (response.didCancel) { - console.warn('User cancelled image picker'); - } else if (response.error) { - log('ImagePicker Error', response.error); - } else { - const fileInfo = { - name: response.fileName, - size: response.fileSize, - type: response.type || 'image/jpeg', - // description: '', - store: 'Uploads' - }; - try { - await RocketChat.sendFileMessage(this.props.rid, fileInfo, response.data); - } catch (e) { - log('addFile', e); - } - } - }); + try { + await RocketChat.sendFileMessage(this.props.rid, fileInfo); + } catch (e) { + log('sendImageMessage', e); + } } + + takePhoto = async() => { + try { + const image = await ImagePicker.openCamera(imagePickerConfig); + this.showUploadModal(image); + } catch (e) { + log('takePhoto', e); + } + } + + chooseFromLibrary = async() => { + try { + const image = await ImagePicker.openPicker(imagePickerConfig); + this.showUploadModal(image); + } catch (e) { + log('chooseFromLibrary', e); + } + } + + showUploadModal = (file) => { + this.setState({ file: { ...file, isVisible: true } }); + } + editCancel() { this.props.editCancel(); this.setState({ text: '' }); } + async openEmoji() { await this.setState({ showEmojiKeyboard: true @@ -489,6 +520,20 @@ export default class MessageBox extends React.PureComponent { ); }; + renderFilesActions = () => { + if (!this.state.showFilesAction) { + return null; + } + return ( + <FilesActions + key='files-actions' + hideActions={this.toggleFilesActions} + takePhoto={this.takePhoto} + chooseFromLibrary={this.chooseFromLibrary} + /> + ); + } + renderContent() { if (this.state.recording) { return (<Recording onFinish={this.finishAudioMessage} />); @@ -525,18 +570,28 @@ export default class MessageBox extends React.PureComponent { render() { return ( - <KeyboardAccessoryView - key='input' - renderContent={() => this.renderContent()} - kbInputRef={this.component} - kbComponent={this.state.showEmojiKeyboard ? 'EmojiKeyboard' : null} - onKeyboardResigned={() => this.onKeyboardResigned()} - onItemSelected={this._onEmojiSelected} - trackInteractive - // revealKeyboardInteractive - requiresSameParentToManageScrollView - addBottomView - /> + [ + <KeyboardAccessoryView + key='input' + renderContent={() => this.renderContent()} + kbInputRef={this.component} + kbComponent={this.state.showEmojiKeyboard ? 'EmojiKeyboard' : null} + onKeyboardResigned={() => this.onKeyboardResigned()} + onItemSelected={this._onEmojiSelected} + trackInteractive + // revealKeyboardInteractive + requiresSameParentToManageScrollView + addBottomView + />, + this.renderFilesActions(), + <UploadModal + key='upload-modal' + isVisible={(this.state.file && this.state.file.isVisible)} + file={this.state.file} + close={() => this.setState({ file: {} })} + submit={this.sendImageMessage} + /> + ] ); } } diff --git a/app/containers/message/Image.js b/app/containers/message/Image.js index 1cbdf3a1f79736efe8d49c8845cf342cf788049d..7ef8eefa222f9e318f743691b887855424c71fd7 100644 --- a/app/containers/message/Image.js +++ b/app/containers/message/Image.js @@ -66,6 +66,7 @@ export default class extends React.PureComponent { <PhotoModal key='modal' title={this.props.file.title} + description={this.props.file.description} image={img} isVisible={this.state.modalVisible} onClose={() => this.setState({ modalVisible: false })} diff --git a/app/containers/message/PhotoModal.js b/app/containers/message/PhotoModal.js index 0bb21888e2f0ad388c4c6fa17ae2226d96fd8d88..c3b83480bc5669b3f9bb05d4bef2b9a7d6e3cc3a 100644 --- a/app/containers/message/PhotoModal.js +++ b/app/containers/message/PhotoModal.js @@ -1,15 +1,13 @@ import React from 'react'; -import { ScrollView, View, Text, TouchableWithoutFeedback } from 'react-native'; +import { View, Text, TouchableWithoutFeedback, ActivityIndicator, StyleSheet } from 'react-native'; import FastImage from 'react-native-fast-image'; import PropTypes from 'prop-types'; import Modal from 'react-native-modal'; +import ImageViewer from 'react-native-image-zoom-viewer'; +import { responsive } from 'react-native-responsive-ui'; -const styles = { +const styles = StyleSheet.create({ imageWrapper: { - alignItems: 'stretch', - flex: 1 - }, - image: { flex: 1 }, titleContainer: { @@ -22,42 +20,67 @@ const styles = { textAlign: 'center', fontSize: 16, fontWeight: '600' + }, + description: { + color: '#ffffff', + textAlign: 'center', + fontSize: 14, + fontWeight: '500' + }, + indicatorContainer: { + alignItems: 'center', + justifyContent: 'center' } -}; +}); + +const margin = 40; +@responsive export default class PhotoModal extends React.PureComponent { static propTypes = { title: PropTypes.string.isRequired, + description: PropTypes.string, image: PropTypes.string.isRequired, isVisible: PropTypes.bool, - onClose: PropTypes.func.isRequired + onClose: PropTypes.func.isRequired, + window: PropTypes.object } render() { const { - image, isVisible, onClose, title + image, isVisible, onClose, title, description, window: { width, height } } = this.props; return ( <Modal isVisible={isVisible} + style={{ alignItems: 'center' }} onBackdropPress={onClose} onBackButtonPress={onClose} + animationIn='fadeIn' + animationOut='fadeOut' > - <TouchableWithoutFeedback onPress={onClose}> - <View style={styles.titleContainer}> - <Text style={styles.title}>{title}</Text> + <View style={{ width: width - margin, height: height - margin }}> + <TouchableWithoutFeedback onPress={onClose}> + <View style={styles.titleContainer}> + <Text style={styles.title}>{title}</Text> + <Text style={styles.description}>{description}</Text> + </View> + </TouchableWithoutFeedback> + <View style={styles.imageWrapper}> + <ImageViewer + imageUrls={[{ url: encodeURI(image) }]} + onClick={onClose} + backgroundColor='transparent' + enableSwipeDown + onSwipeDown={onClose} + renderIndicator={() => {}} + renderImage={props => <FastImage {...props} />} + loadingRender={() => ( + <View style={[styles.indicatorContainer, { width, height }]}> + <ActivityIndicator /> + </View> + )} + /> </View> - </TouchableWithoutFeedback> - <View style={styles.imageWrapper}> - <ScrollView contentContainerStyle={styles.imageWrapper} maximumZoomScale={5}> - <TouchableWithoutFeedback onPress={onClose}> - <FastImage - style={styles.image} - source={{ uri: encodeURI(image) }} - mutable - resizeMode='contain' - /> - </TouchableWithoutFeedback> - </ScrollView> </View> </Modal> ); diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index 79702e574bef50f8afaefa9e2d09f5472aefbbc8..ef81753406d65124ed75a9b3f4ac12672cba4375 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -111,6 +111,8 @@ export default { Chats: 'Chats', Close: 'Close', Close_emoji_selector: 'Close emoji selector', + Choose: 'Choose', + Choose_from_library: 'Choose from library', Code: 'Code', Colaborative: 'Colaborative', Connect: 'Connect', @@ -136,6 +138,7 @@ export default { Email: 'Email', Enable_notifications: 'Enable notifications', Everyone_can_access_this_channel: 'Everyone can access this channel', + Error_uploading: 'Error uploading', Files: 'Files', Finish_recording: 'Finish recording', For_your_security_you_must_enter_your_current_password_to_continue: 'For your security, you must enter your current password to continue', @@ -246,6 +249,7 @@ export default { Search: 'Search', Select_Avatar: 'Select Avatar', Select_Users: 'Select Users', + Send: 'Send', Send_audio_message: 'Send audio message', Send_message: 'Send message', Servers: 'Servers', @@ -266,6 +270,7 @@ export default { Starred: 'Starred', Start_of_conversation: 'Start of conversation', Submit: 'Submit', + Take_a_photo: 'Take a photo', tap_to_change_status: 'tap to change status', Tap_to_view_servers_list: 'Tap to view servers list', Terms_of_Service: ' Terms of Service ', @@ -276,6 +281,7 @@ export default { Toggle_Drawer: 'Toggle_Drawer', topic: 'topic', Topic: 'Topic', + Try_again: 'Try again', Type_the_channel_name_here: 'Type the channel name here', unarchive: 'unarchive', UNARCHIVE: 'UNARCHIVE', @@ -285,6 +291,7 @@ export default { Unpin: 'Unpin', unread_messages: 'unread messages', Unstar: 'Unstar', + Uploading: 'Uploading', User_added_by: 'User {{userAdded}} added by {{userBy}}', User_has_been_key: 'User has been {{key}}!', User_is_no_longer_role_by_: '{{user}} is no longer {{role}} by {{userBy}}', diff --git a/app/lib/createStore.js b/app/lib/createStore.js index 24106225d94e43bf16127a2220026b2049675869..c9188f0821232b477799bd5cc91c249420e1d759 100644 --- a/app/lib/createStore.js +++ b/app/lib/createStore.js @@ -14,7 +14,7 @@ if (__DEV__) { /* eslint-disable global-require */ const reduxImmutableStateInvariant = require('redux-immutable-state-invariant').default(); sagaMiddleware = createSagaMiddleware({ - // sagaMonitor: Reactotron.createSagaMonitor() + sagaMonitor: Reactotron.createSagaMonitor() }); enhancers = compose( diff --git a/app/lib/methods/sendFileMessage.js b/app/lib/methods/sendFileMessage.js new file mode 100644 index 0000000000000000000000000000000000000000..4e813eaf772c31f3b45eac1b10e99f79548db0de --- /dev/null +++ b/app/lib/methods/sendFileMessage.js @@ -0,0 +1,89 @@ +import RNFetchBlob from 'rn-fetch-blob'; + +import reduxStore from '../createStore'; +import database from '../realm'; + +const promises = {}; + +function _ufsCreate(fileInfo) { + return this.ddp.call('ufsCreate', fileInfo); +} + +function _ufsComplete(fileId, store, token) { + return this.ddp.call('ufsComplete', fileId, store, token); +} + +function _sendFileMessage(rid, data, msg = {}) { + return this.ddp.call('sendFileMessage', rid, null, data, msg); +} + +export function isUploadActive(path) { + return !!promises[path]; +} + +export async function cancelUpload(path) { + if (promises[path]) { + await promises[path].cancel(); + } +} + +export async function sendFileMessage(rid, fileInfo) { + try { + const data = await RNFetchBlob.wrap(fileInfo.path); + if (!fileInfo.size) { + const fileStat = await RNFetchBlob.fs.stat(fileInfo.path); + fileInfo.size = fileStat.size; + fileInfo.name = fileStat.filename; + } + + const { FileUpload_MaxFileSize } = reduxStore.getState().settings; + + // -1 maxFileSize means there is no limit + if (FileUpload_MaxFileSize > -1 && fileInfo.size > FileUpload_MaxFileSize) { + return Promise.reject({ error: 'error-file-too-large' }); // eslint-disable-line + } + + fileInfo.rid = rid; + + database.write(() => { + database.create('uploads', fileInfo, true); + }); + + const result = await _ufsCreate.call(this, fileInfo); + + promises[fileInfo.path] = RNFetchBlob.fetch('POST', result.url, { + 'Content-Type': 'octet-stream' + }, data); + // Workaround for https://github.com/joltup/rn-fetch-blob/issues/96 + setTimeout(() => { + promises[fileInfo.path].uploadProgress((loaded, total) => { + database.write(() => { + fileInfo.progress = Math.floor((loaded / total) * 100); + database.create('uploads', fileInfo, true); + }); + }); + }); + await promises[fileInfo.path]; + + const completeResult = await _ufsComplete.call(this, result.fileId, fileInfo.store, result.token); + + await _sendFileMessage.call(this, completeResult.rid, { + _id: completeResult._id, + type: completeResult.type, + size: completeResult.size, + name: completeResult.name, + description: completeResult.description, + url: completeResult.path + }); + + database.write(() => { + const upload = database.objects('uploads').filtered('path = $0', fileInfo.path); + database.delete(upload); + }); + } catch (e) { + database.write(() => { + fileInfo.error = true; + database.create('uploads', fileInfo, true); + }); + } +} diff --git a/app/lib/realm.js b/app/lib/realm.js index 081643e579ceedb4b3fdb73688d9b0286cb81440..94583fee03615681ca06df4f5d9591037d1d88f0 100644 --- a/app/lib/realm.js +++ b/app/lib/realm.js @@ -260,6 +260,22 @@ const rolesSchema = { } }; +const uploadsSchema = { + name: 'uploads', + primaryKey: 'path', + properties: { + path: 'string', + rid: 'string', + name: { type: 'string', optional: true }, + description: { type: 'string', optional: true }, + size: { type: 'int', optional: true }, + type: { type: 'string', optional: true }, + store: { type: 'string', optional: true }, + progress: { type: 'int', default: 1 }, + error: { type: 'bool', default: false } + } +}; + const schema = [ settingsSchema, subscriptionSchema, @@ -279,7 +295,8 @@ const schema = [ messagesReactionsSchema, messagesReactionsUsernamesSchema, rolesSchema, - userMutedInRoomSchema + userMutedInRoomSchema, + uploadsSchema ]; // class DebouncedDb { diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index c990626e7c62eb147309d9a320c55ec3131bbbbc..1d8eb7db9462248d7770f44177cbe2194769f46e 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -1,7 +1,7 @@ import { AsyncStorage, Platform } from 'react-native'; import { hashPassword } from 'react-native-meteor/lib/utils'; import foreach from 'lodash/forEach'; -import RNFetchBlob from 'react-native-fetch-blob'; +import RNFetchBlob from 'rn-fetch-blob'; import reduxStore from './createStore'; import defaultSettings from '../constants/settings'; @@ -39,6 +39,7 @@ import loadMessagesForRoom from './methods/loadMessagesForRoom'; import loadMissedMessages from './methods/loadMissedMessages'; import sendMessage, { getMessage, _sendMessageCall } from './methods/sendMessage'; +import { sendFileMessage, cancelUpload, isUploadActive } from './methods/sendFileMessage'; import { getDeviceToken } from '../push'; @@ -615,88 +616,9 @@ const RocketChat = { joinRoom(rid) { return call('joinRoom', rid); }, - - - /* - "name":"yXfExLErmNR5eNPx7.png" - "size":961 - "type":"image/png" - "rid":"GENERAL" - "description":"" - "store":"fileSystem" - */ - _ufsCreate(fileInfo) { - // return call('ufsCreate', fileInfo); - return call('ufsCreate', fileInfo); - }, - - // ["ZTE8CKHJt7LATv7Me","fileSystem","e8E96b2819" - _ufsComplete(fileId, store, token) { - return call('ufsComplete', fileId, store, token); - }, - - /* - - "GENERAL" - - { - "type":"image/png", - "size":961, - "name":"yXfExLErmNR5eNPx7.png", - "description":"", - "url":"/ufs/fileSystem/ZTE8CKHJt7LATv7Me/yXfExLErmNR5eNPx7.png" - } - */ - _sendFileMessage(rid, data, msg = {}) { - return call('sendFileMessage', rid, null, data, msg); - }, - async sendFileMessage(rid, fileInfo, data) { - let placeholder; - try { - if (!data) { - data = await RNFetchBlob.wrap(fileInfo.path); - const fileStat = await RNFetchBlob.fs.stat(fileInfo.path); - fileInfo.size = fileStat.size; - fileInfo.name = fileStat.filename; - } - - const { FileUpload_MaxFileSize } = reduxStore.getState().settings; - - // -1 maxFileSize means there is no limit - if (FileUpload_MaxFileSize > -1 && fileInfo.size > FileUpload_MaxFileSize) { - return Promise.reject({ error: 'error-file-too-large' }); // eslint-disable-line - } - - placeholder = RocketChat.getMessage(rid, 'Sending a file'); - - const result = await RocketChat._ufsCreate({ ...fileInfo, rid }); - await RNFetchBlob.fetch('POST', result.url, { - 'Content-Type': 'application/octet-stream' - }, data); - - const completeRresult = await RocketChat._ufsComplete(result.fileId, fileInfo.store, result.token); - - return await RocketChat._sendFileMessage(completeRresult.rid, { - _id: completeRresult._id, - type: completeRresult.type, - size: completeRresult.size, - name: completeRresult.name, - url: completeRresult.path - }); - } catch (e) { - return e; - } finally { - // TODO: fix that - try { - if (placeholder) { - database.write(() => { - const msg = database.objects('messages').filtered('_id = $0', placeholder._id); - database.delete(msg); - }); - } - } catch (e) { - console.error(e); - } - } - }, + sendFileMessage, + cancelUpload, + isUploadActive, getSettings, getPermissions, getCustomEmoji, diff --git a/app/presentation/RoomItem.js b/app/presentation/RoomItem.js index 4797370b4fbe73ec18c4f0f07809c127d77ccefc..6ec261f8afdb991786255f8cb263c3a22e877e36 100644 --- a/app/presentation/RoomItem.js +++ b/app/presentation/RoomItem.js @@ -254,7 +254,7 @@ export default class RoomItem extends React.Component { <Markdown msg={this.lastMessage} style={{ - view: { + root: { flex: 1 } }} diff --git a/app/views/ProfileView/index.js b/app/views/ProfileView/index.js index 752b5c49413b69da373ab610ff1d3b3deed1a30a..70dfafcee3c9de23710a08013e9f6a87329f2125 100644 --- a/app/views/ProfileView/index.js +++ b/app/views/ProfileView/index.js @@ -5,7 +5,7 @@ import { connect } from 'react-redux'; import Dialog from 'react-native-dialog'; import SHA256 from 'js-sha256'; import Icon from 'react-native-vector-icons/MaterialIcons'; -import ImagePicker from 'react-native-image-picker'; +import ImagePicker from 'react-native-image-crop-picker'; import RNPickerSelect from 'react-native-picker-select'; import LoggedView from '../View'; @@ -243,19 +243,21 @@ export default class ProfileView extends LoggedView { } } - pickImage = () => { + pickImage = async() => { const options = { - title: I18n.t('Select_Avatar') + cropping: true, + compressImageQuality: 0.8, + cropperAvoidEmptySpaceAroundImage: false, + cropperChooseText: I18n.t('Choose'), + cropperCancelText: I18n.t('Cancel'), + includeBase64: true }; - ImagePicker.showImagePicker(options, async(response) => { - if (response.didCancel) { - console.warn('User cancelled image picker'); - } else if (response.error) { - log('ImagePicker Error', response.error); - } else { - this.setAvatar({ url: response.uri, data: `data:image/jpeg;base64,${ response.data }`, service: 'upload' }); - } - }); + try { + const response = await ImagePicker.openPicker(options); + this.setAvatar({ url: response.path, data: `data:image/jpeg;base64,${ response.data }`, service: 'upload' }); + } catch (error) { + console.warn(error); + } } renderAvatarButton = ({ diff --git a/app/views/RoomView/UploadProgress.js b/app/views/RoomView/UploadProgress.js new file mode 100644 index 0000000000000000000000000000000000000000..f97d09264d8f144cbd1bbe2dcc83cdf835c92891 --- /dev/null +++ b/app/views/RoomView/UploadProgress.js @@ -0,0 +1,158 @@ +import React, { Component } from 'react'; +import { View, Text, StyleSheet, TouchableOpacity, ScrollView } from 'react-native'; +import PropTypes from 'prop-types'; +import Icon from 'react-native-vector-icons/MaterialIcons'; +import { responsive } from 'react-native-responsive-ui'; + +import database from '../../lib/realm'; +import RocketChat from '../../lib/rocketchat'; +import log from '../../utils/log'; +import I18n from '../../i18n'; + +const styles = StyleSheet.create({ + container: { + position: 'absolute', + top: 0, + width: '100%', + maxHeight: 246 + }, + item: { + backgroundColor: '#F1F2F4', + height: 54, + borderBottomWidth: StyleSheet.hairlineWidth, + borderColor: '#CACED1', + justifyContent: 'center', + paddingHorizontal: 20 + }, + row: { + flexDirection: 'row', + alignItems: 'center' + }, + descriptionContainer: { + flexDirection: 'column', + flex: 1, + marginLeft: 10 + }, + descriptionText: { + fontSize: 16, + lineHeight: 20, + color: '#54585E' + }, + progress: { + position: 'absolute', + bottom: 0, + backgroundColor: '#1D74F5', + height: 3 + }, + tryAgainButtonText: { + color: '#1D74F5', + fontSize: 16, + fontWeight: '500', + lineHeight: 20 + } +}); + +@responsive +export default class UploadProgress extends Component { + static propTypes = { + window: PropTypes.object, + rid: PropTypes.string + } + + constructor(props) { + super(props); + this.state = { + uploads: [] + }; + this.uploads = database.objects('uploads').filtered('rid = $0', this.props.rid); + this.uploads.addListener(this.updateUploads); + } + + componentDidMount() { + this.uploads.forEach((u) => { + if (!RocketChat.isUploadActive(u.path)) { + database.write(() => { + const [upload] = database.objects('uploads').filtered('path = $0', u.path); + if (upload) { + upload.error = true; + } + }); + } + }); + } + + componentWillUnmount() { + this.uploads.removeAllListeners(); + } + + deleteUpload = (item) => { + database.write(() => database.delete(item)); + } + + cancelUpload = async(item) => { + try { + await RocketChat.cancelUpload(item.path); + } catch (e) { + log('UploadProgess.cancelUpload', e); + } + } + + tryAgain = async(item) => { + try { + database.write(() => { + item.error = false; + }); + await RocketChat.sendFileMessage(this.props.rid, JSON.parse(JSON.stringify(item))); + } catch (e) { + log('UploadProgess.tryAgain', e); + } + } + + updateUploads = () => { + this.setState({ uploads: this.uploads }); + } + + renderItemContent = (item) => { + if (!item.error) { + return ( + [ + <View key='row' style={styles.row}> + <Icon name='image' size={20} color='#9EA2A8' /> + <Text style={[styles.descriptionContainer, styles.descriptionText]} ellipsizeMode='tail' numberOfLines={1}> + {I18n.t('Uploading')} {item.name} + </Text> + <Icon name='close' size={20} color='#9EA2A8' onPress={() => this.cancelUpload(item)} /> + </View>, + <View key='progress' style={[styles.progress, { width: (this.props.window.width * item.progress) / 100 }]} /> + ] + ); + } + return ( + <View style={styles.row}> + <Icon name='warning' size={20} color='#FF5050' /> + <View style={styles.descriptionContainer}> + <Text style={styles.descriptionText}>{I18n.t('Error_uploading')} {item.name}</Text> + <TouchableOpacity onPress={() => this.tryAgain(item)}> + <Text style={styles.tryAgainButtonText}>{I18n.t('Try_again')}</Text> + </TouchableOpacity> + </View> + <Icon name='close' size={20} color='#9EA2A8' onPress={() => this.deleteUpload(item)} /> + </View> + ); + } + + renderItem = (item, index) => ( + <View key={item.path} style={[styles.item, index !== 0 ? { marginTop: 10 } : {}]}> + {this.renderItemContent(item)} + </View> + ); + + render() { + const { uploads } = this.state; + return ( + <ScrollView style={styles.container}> + {uploads.map((item, i) => this.renderItem(item, i))} + </ScrollView> + ); + } +} diff --git a/app/views/RoomView/index.js b/app/views/RoomView/index.js index 747e851f48b1d6b44c30ff787f5c6058f35db5cb..d55ffc4686a599ffc96fa16b604f0fb51922258e 100644 --- a/app/views/RoomView/index.js +++ b/app/views/RoomView/index.js @@ -15,6 +15,7 @@ import MessageActions from '../../containers/MessageActions'; import MessageErrorActions from '../../containers/MessageErrorActions'; import MessageBox from '../../containers/MessageBox'; import ReactionPicker from './ReactionPicker'; +import UploadProgress from './UploadProgress'; import styles from './styles'; import log from '../../utils/log'; import I18n from '../../i18n'; @@ -289,6 +290,7 @@ export default class RoomView extends LoggedView { null} {this.props.showErrorActions ? <MessageErrorActions /> : null} <ReactionPicker onEmojiSelected={this.onReactionPress} /> + <UploadProgress rid={this.rid} /> </View> ); } diff --git a/ios/RocketChatRN.xcodeproj/project.pbxproj b/ios/RocketChatRN.xcodeproj/project.pbxproj index 6d9c468d122ff06cd4404134126c29820cc0f4d9..22d04ece064ecab014ab19cec883f37a14be0784 100644 --- a/ios/RocketChatRN.xcodeproj/project.pbxproj +++ b/ios/RocketChatRN.xcodeproj/project.pbxproj @@ -14,6 +14,7 @@ 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* RocketChatRNTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* RocketChatRNTests.m */; }; 09CB5909C1E64707832358CE /* libRNI18n-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C01CD6D4653143EEB5100C3A /* libRNI18n-tvOS.a */; }; + 0AC2050A2CA1485DAC130425 /* Feather.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 72FB6BA830CE4EEBAC92BF54 /* Feather.ttf */; }; 0C6E2DE448364EA896869ADF /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B37C79D9BD0742CE936B6982 /* libc++.tbd */; }; 0DC38A29B0E54AF4AF96CB95 /* MaterialCommunityIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2EADB1731B5E47D093292B59 /* MaterialCommunityIcons.ttf */; }; 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; @@ -56,6 +57,11 @@ 7A3562E620E1569000A4CF66 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A3562E520E1567900A4CF66 /* libReactNativeNavigation.a */; }; 7A430E4F20238C46008F55BC /* libRCTCustomInputController.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A430E1E20238C02008F55BC /* libRCTCustomInputController.a */; }; 7A8DEB5A20ED0BEC00C5DCE4 /* libRNNotifications.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A8DEB5220ED0BDE00C5DCE4 /* libRNNotifications.a */; }; + 7A6EDBDC20ED6DCF0086E097 /* ImageCropPickerSDK in Resources */ = {isa = PBXBuildFile; fileRef = 7A6EDBDB20ED6DCF0086E097 /* ImageCropPickerSDK */; }; + 7A6EDBDE20ED6E010086E097 /* RSKImageCropper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A6EDBDD20ED6E010086E097 /* RSKImageCropper.framework */; }; + 7A6EDBDF20ED6E010086E097 /* RSKImageCropper.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7A6EDBDD20ED6E010086E097 /* RSKImageCropper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 7A6EDBE220ED6E0E0086E097 /* QBImagePicker.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A6EDBE120ED6E0E0086E097 /* QBImagePicker.framework */; }; + 7A6EDBE320ED6E0E0086E097 /* QBImagePicker.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7A6EDBE120ED6E0E0086E097 /* QBImagePicker.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 7AFB806E205AE65700D004E7 /* libRCTToast.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AFB804C205AE63100D004E7 /* libRCTToast.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 8A159EDB97C44E52AF62D69C /* libRNSVG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA50CE47374C4C35BE6D9D58 /* libRNSVG.a */; }; @@ -70,9 +76,9 @@ B8E79AF41F3CD167005B464F /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB61A68108700A75B9A /* Info.plist */; }; BAB7DC22804246F3923A1833 /* libFastImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FD2E2837F110483CA29EE0D4 /* libFastImage.a */; }; BED2B77AA660460E8BC9F8E0 /* libRNFetchBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6533FB90166345D29F1B91C0 /* libRNFetchBlob.a */; }; - C758F0BD5C3244E2BA073E61 /* libRNImagePicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B696712EE2345A59F007A88 /* libRNImagePicker.a */; }; CBD0E0A35B174C4DBFED3B31 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = E528DE3A405E43B4A37ABA68 /* Zocial.ttf */; }; D6408D9E4A864FF6BA986857 /* SimpleLineIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 8A2DD67ADD954AD9873F45FC /* SimpleLineIcons.ttf */; }; + E27A0F0529F74A6E80BBAA8C /* libimageCropPicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A34D902CC074FF1BCC7DB48 /* libimageCropPicker.a */; }; EF736EF520A64AE8820E684A /* libRealmReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DF26CC845883492D8AC8869B /* libRealmReact.a */; }; F5BF54DC78E1411B8343933B /* libRNI18n.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 921481B47B50490CA761932E /* libRNI18n.a */; }; /* End PBXBuildFile section */ @@ -295,13 +301,6 @@ remoteGlobalIDString = F60690131CA2766F0003FB26; remoteInfo = RealmReact; }; - 60B837831F3F6F4C00677E56 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4B38C7E37A8748E0BC665078 /* RNImagePicker.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 014A3B5C1C6CF33500B6D375; - remoteInfo = RNImagePicker; - }; 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; @@ -337,6 +336,13 @@ remoteGlobalIDString = 39DF4FE71E00394E00F5B4B2; remoteInfo = RCTCustomInputController; }; + 7A6EDBD920ED6CBB0086E097 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 8031BD2B0F824A0D8510616B /* imageCropPicker.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3400A8081CEB54A6008A0BC7; + remoteInfo = imageCropPicker; + }; 7A770EC120BECDC7001AD51A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 1845C223DA364898A8400573 /* FastImage.xcodeproj */; @@ -372,6 +378,13 @@ remoteGlobalIDString = 641E28441F0EEC8500443AF6; remoteInfo = "RCTVideo-tvOS"; }; + 7A8C915220F39A8000C8F5EE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0B82BCC462E84F308C5B5CD1 /* RNFetchBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = A15C300E1CD25C330074CB35; + remoteInfo = RNFetchBlob; + }; 7A8DEB5120ED0BDE00C5DCE4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 7A8DEB1B20ED0BDE00C5DCE4 /* RNNotifications.xcodeproj */; @@ -470,13 +483,6 @@ remoteGlobalIDString = D834CED81CC64F2400FA5668; remoteInfo = KeyboardTrackingView; }; - B8E79A8D1F3CCC6D005B464F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 4CD38E4891ED4601B7481448 /* RNFetchBlob.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = A15C300E1CD25C330074CB35; - remoteInfo = RNFetchBlob; - }; B8E79A901F3CCC6D005B464F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 22A8B76C8EBA443BB97CE82D /* RNVectorIcons.xcodeproj */; @@ -500,6 +506,21 @@ }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + 7A6EDBE020ED6E020086E097 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 7A6EDBDF20ED6E010086E097 /* RSKImageCropper.framework in Embed Frameworks */, + 7A6EDBE320ED6E0E0086E097 /* QBImagePicker.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; }; 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = "<group>"; }; @@ -511,6 +532,7 @@ 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 00E356F21AD99517003FC87E /* RocketChatRNTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RocketChatRNTests.m; sourceTree = "<group>"; }; 06BB44DD4855498082A744AD /* libz.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 0B82BCC462E84F308C5B5CD1 /* RNFetchBlob.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNFetchBlob.xcodeproj; path = "../node_modules/rn-fetch-blob/ios/RNFetchBlob.xcodeproj"; sourceTree = "<group>"; }; 1142E3442BA94B19BCF52814 /* libRNAudio.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNAudio.a; 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>"; }; @@ -523,6 +545,7 @@ 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = RocketChatRN/main.m; sourceTree = "<group>"; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; }; 1845C223DA364898A8400573 /* 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>"; }; + 1A34D902CC074FF1BCC7DB48 /* libimageCropPicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libimageCropPicker.a; sourceTree = "<group>"; }; 1B0746E708284151B8AD1198 /* Ionicons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = file; name = Ionicons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Ionicons.ttf"; sourceTree = "<group>"; }; 1D3BB00B9ABF44EA9BD71318 /* libSafariViewManager.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libSafariViewManager.a; sourceTree = "<group>"; }; 20CE3E407E0D4D9E8C9885F2 /* libRCTVideo.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTVideo.a; sourceTree = "<group>"; }; @@ -535,13 +558,12 @@ 3B696712EE2345A59F007A88 /* libRNImagePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNImagePicker.a; sourceTree = "<group>"; }; 4019A5E1911B4C61944FBCEC /* SafariViewManager.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = SafariViewManager.xcodeproj; path = "../node_modules/react-native-safari-view/SafariViewManager.xcodeproj"; sourceTree = "<group>"; }; 41FE03CD3B554249859F01BA /* RNZeroconf.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNZeroconf.xcodeproj; path = "../node_modules/react-native-zeroconf/ios/RNZeroconf.xcodeproj"; sourceTree = "<group>"; }; - 4B38C7E37A8748E0BC665078 /* RNImagePicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNImagePicker.xcodeproj; path = "../node_modules/react-native-image-picker/ios/RNImagePicker.xcodeproj"; sourceTree = "<group>"; }; - 4CD38E4891ED4601B7481448 /* 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>"; }; 5A0EEFAF8AB14F5B9E796CDD /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = "<group>"; }; 5A8684E7C27E426C9206E980 /* RealmReact.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RealmReact.xcodeproj; path = "../node_modules/realm/react-native/ios/RealmReact.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>"; }; 60B2A6A31FC4588700BD58E5 /* RocketChatRN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = RocketChatRN.entitlements; path = RocketChatRN/RocketChatRN.entitlements; sourceTree = "<group>"; }; 6533FB90166345D29F1B91C0 /* libRNFetchBlob.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNFetchBlob.a; sourceTree = "<group>"; }; + 72FB6BA830CE4EEBAC92BF54 /* Feather.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = Feather.ttf; path = "../node_modules/react-native-vector-icons/Fonts/Feather.ttf"; sourceTree = "<group>"; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; }; 7A2D1FE620726EF600D0AA04 /* SMXCrashlytics.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SMXCrashlytics.xcodeproj; path = "../node_modules/react-native-fabric/ios/SMXCrashlytics.xcodeproj"; sourceTree = "<group>"; }; 7A309C9B20724870000C6B13 /* Fabric.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = Fabric.sh; path = RocketChatRN/Fabric.sh; sourceTree = "<group>"; }; @@ -551,7 +573,11 @@ 7A3562E020E1567900A4CF66 /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = "<group>"; }; 7A430E1620238C01008F55BC /* RCTCustomInputController.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTCustomInputController.xcodeproj; path = "../node_modules/react-native-keyboard-input/lib/ios/RCTCustomInputController.xcodeproj"; sourceTree = "<group>"; }; 7A8DEB1B20ED0BDE00C5DCE4 /* RNNotifications.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RNNotifications.xcodeproj; path = "../node_modules/react-native-notifications/RNNotifications/RNNotifications.xcodeproj"; sourceTree = "<group>"; }; + 7A6EDBDB20ED6DCF0086E097 /* ImageCropPickerSDK */ = {isa = PBXFileReference; lastKnownFileType = folder; name = ImageCropPickerSDK; path = "../node_modules/react-native-image-crop-picker/ios/ImageCropPickerSDK"; sourceTree = "<group>"; }; + 7A6EDBDD20ED6E010086E097 /* RSKImageCropper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSKImageCropper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A6EDBE120ED6E0E0086E097 /* QBImagePicker.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = QBImagePicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFB8035205AE63000D004E7 /* RCTToast.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTToast.xcodeproj; path = "../node_modules/@remobile/react-native-toast/ios/RCTToast.xcodeproj"; sourceTree = "<group>"; }; + 8031BD2B0F824A0D8510616B /* imageCropPicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = imageCropPicker.xcodeproj; path = "../node_modules/react-native-image-crop-picker/ios/imageCropPicker.xcodeproj"; sourceTree = "<group>"; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; }; 8A2DD67ADD954AD9873F45FC /* SimpleLineIcons.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = SimpleLineIcons.ttf; path = "../node_modules/react-native-vector-icons/Fonts/SimpleLineIcons.ttf"; sourceTree = "<group>"; }; 921481B47B50490CA761932E /* libRNI18n.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNI18n.a; sourceTree = "<group>"; }; @@ -610,17 +636,19 @@ EF736EF520A64AE8820E684A /* libRealmReact.a in Frameworks */, 0C6E2DE448364EA896869ADF /* libc++.tbd in Frameworks */, 24A2AEF2383D44B586D31C01 /* libz.tbd in Frameworks */, + 7A6EDBE220ED6E0E0086E097 /* QBImagePicker.framework in Frameworks */, 33647F7997A2493E9E1343B3 /* libRNZeroconf.a in Frameworks */, BED2B77AA660460E8BC9F8E0 /* libRNFetchBlob.a in Frameworks */, 77C35F50C01C43668188886C /* libRNVectorIcons.a in Frameworks */, 8A159EDB97C44E52AF62D69C /* libRNSVG.a in Frameworks */, - C758F0BD5C3244E2BA073E61 /* libRNImagePicker.a in Frameworks */, + 7A6EDBDE20ED6E010086E097 /* RSKImageCropper.framework in Frameworks */, 8ECBD927DDAC4987B98E102E /* libRCTVideo.a in Frameworks */, 7A32C247206D791D001C80E9 /* Crashlytics.framework in Frameworks */, 2C800DF680F8451599E80AF1 /* libSafariViewManager.a in Frameworks */, 74815BBCB91147C08C8F7B3D /* libRNAudio.a in Frameworks */, BAB7DC22804246F3923A1833 /* libFastImage.a in Frameworks */, F5BF54DC78E1411B8343933B /* libRNI18n.a in Frameworks */, + E27A0F0529F74A6E80BBAA8C /* libimageCropPicker.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -793,14 +821,6 @@ name = Products; sourceTree = "<group>"; }; - 60B8375C1F3F6F4B00677E56 /* Products */ = { - isa = PBXGroup; - children = ( - 60B837841F3F6F4C00677E56 /* libRNImagePicker.a */, - ); - name = Products; - sourceTree = "<group>"; - }; 78C398B11ACF4ADC00677621 /* Products */ = { isa = PBXGroup; children = ( @@ -835,6 +855,14 @@ name = Products; sourceTree = "<group>"; }; + 7A6EDBD620ED6CBB0086E097 /* Products */ = { + isa = PBXGroup; + children = ( + 7A6EDBDA20ED6CBB0086E097 /* libimageCropPicker.a */, + ); + name = Products; + sourceTree = "<group>"; + }; 7A770EBC20BECDC7001AD51A /* Products */ = { isa = PBXGroup; children = ( @@ -861,6 +889,14 @@ name = Products; sourceTree = "<group>"; }; + 7A8C912120F39A8000C8F5EE /* Products */ = { + isa = PBXGroup; + children = ( + 7A8C915320F39A8000C8F5EE /* libRNFetchBlob.a */, + ); + name = Products; + sourceTree = "<group>"; + }; 7A8DEB1C20ED0BDE00C5DCE4 /* Products */ = { isa = PBXGroup; children = ( @@ -900,15 +936,15 @@ 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 5A8684E7C27E426C9206E980 /* RealmReact.xcodeproj */, 41FE03CD3B554249859F01BA /* RNZeroconf.xcodeproj */, - 4CD38E4891ED4601B7481448 /* RNFetchBlob.xcodeproj */, 22A8B76C8EBA443BB97CE82D /* RNVectorIcons.xcodeproj */, C23AEF1D9EBE4A38A1A6B97B /* RNSVG.xcodeproj */, - 4B38C7E37A8748E0BC665078 /* RNImagePicker.xcodeproj */, AD0379F2BCE84C968538CDAF /* RCTVideo.xcodeproj */, 4019A5E1911B4C61944FBCEC /* SafariViewManager.xcodeproj */, C21010507E5B4B37BA0E4C9D /* RNAudio.xcodeproj */, 1845C223DA364898A8400573 /* FastImage.xcodeproj */, 22D3971EAF2E4660B4FAB3DD /* RNI18n.xcodeproj */, + 8031BD2B0F824A0D8510616B /* imageCropPicker.xcodeproj */, + 0B82BCC462E84F308C5B5CD1 /* RNFetchBlob.xcodeproj */, ); name = Libraries; sourceTree = "<group>"; @@ -925,6 +961,9 @@ 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 7A6EDBE120ED6E0E0086E097 /* QBImagePicker.framework */, + 7A6EDBDD20ED6E010086E097 /* RSKImageCropper.framework */, + 7A6EDBDB20ED6DCF0086E097 /* ImageCropPickerSDK */, 7A32C245206D791D001C80E9 /* Crashlytics.framework */, 7A32C20F206D791D001C80E9 /* Fabric.framework */, 13B07FAE1A68108700A75B9A /* RocketChatRN */, @@ -972,6 +1011,7 @@ F88C6541BD764BEEABB87272 /* Octicons.ttf */, 8A2DD67ADD954AD9873F45FC /* SimpleLineIcons.ttf */, E528DE3A405E43B4A37ABA68 /* Zocial.ttf */, + 72FB6BA830CE4EEBAC92BF54 /* Feather.ttf */, ); name = Resources; sourceTree = "<group>"; @@ -1017,18 +1057,11 @@ FD2E2837F110483CA29EE0D4 /* libFastImage.a */, 921481B47B50490CA761932E /* libRNI18n.a */, C01CD6D4653143EEB5100C3A /* libRNI18n-tvOS.a */, + 1A34D902CC074FF1BCC7DB48 /* libimageCropPicker.a */, ); name = "Recovered References"; sourceTree = "<group>"; }; - B8E79A881F3CCC6C005B464F /* Products */ = { - isa = PBXGroup; - children = ( - B8E79A8E1F3CCC6D005B464F /* libRNFetchBlob.a */, - ); - name = Products; - sourceTree = "<group>"; - }; B8E79A8A1F3CCC6C005B464F /* Products */ = { isa = PBXGroup; children = ( @@ -1084,6 +1117,7 @@ 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 7A6EDBE020ED6E020086E097 /* Embed Frameworks */, ); buildRules = ( ); @@ -1182,6 +1216,10 @@ ProductGroup = 7A770EBE20BECDC7001AD51A /* Products */; ProjectRef = 1845C223DA364898A8400573 /* FastImage.xcodeproj */; }, + { + ProductGroup = 7A6EDBD620ED6CBB0086E097 /* Products */; + ProjectRef = 8031BD2B0F824A0D8510616B /* imageCropPicker.xcodeproj */; + }, { ProductGroup = B8971BAD202A091D0000D245 /* Products */; ProjectRef = B8971BAC202A091D0000D245 /* KeyboardTrackingView.xcodeproj */; @@ -1259,17 +1297,13 @@ ProjectRef = C21010507E5B4B37BA0E4C9D /* RNAudio.xcodeproj */; }, { - ProductGroup = B8E79A881F3CCC6C005B464F /* Products */; - ProjectRef = 4CD38E4891ED4601B7481448 /* RNFetchBlob.xcodeproj */; + ProductGroup = 7A8C912120F39A8000C8F5EE /* Products */; + ProjectRef = 0B82BCC462E84F308C5B5CD1 /* RNFetchBlob.xcodeproj */; }, { ProductGroup = 7A770EBC20BECDC7001AD51A /* Products */; ProjectRef = 22D3971EAF2E4660B4FAB3DD /* RNI18n.xcodeproj */; }, - { - ProductGroup = 60B8375C1F3F6F4B00677E56 /* Products */; - ProjectRef = 4B38C7E37A8748E0BC665078 /* RNImagePicker.xcodeproj */; - }, { ProductGroup = 7A8DEB1C20ED0BDE00C5DCE4 /* Products */; ProjectRef = 7A8DEB1B20ED0BDE00C5DCE4 /* RNNotifications.xcodeproj */; @@ -1509,13 +1543,6 @@ remoteRef = 607D61151F325B7E00F639C4 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 60B837841F3F6F4C00677E56 /* libRNImagePicker.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNImagePicker.a; - remoteRef = 60B837831F3F6F4C00677E56 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1551,6 +1578,13 @@ remoteRef = 7A430E1D20238C02008F55BC /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A6EDBDA20ED6CBB0086E097 /* libimageCropPicker.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libimageCropPicker.a; + remoteRef = 7A6EDBD920ED6CBB0086E097 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 7A770EC220BECDC7001AD51A /* libFastImage.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1586,6 +1620,13 @@ remoteRef = 7A7F5C9A1FCC982500024129 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 7A8C915320F39A8000C8F5EE /* libRNFetchBlob.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRNFetchBlob.a; + remoteRef = 7A8C915220F39A8000C8F5EE /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 7A8DEB5220ED0BDE00C5DCE4 /* libRNNotifications.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1684,13 +1725,6 @@ remoteRef = B8971BB0202A091D0000D245 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - B8E79A8E1F3CCC6D005B464F /* libRNFetchBlob.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNFetchBlob.a; - remoteRef = B8E79A8D1F3CCC6D005B464F /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; B8E79A911F3CCC6D005B464F /* libRNVectorIcons.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -1736,12 +1770,14 @@ 70A8D9B456894EFFAF027CAB /* FontAwesome.ttf in Resources */, 435AB658888F41D69A230652 /* Foundation.ttf in Resources */, 4529B474417149059A180775 /* Ionicons.ttf in Resources */, + 7A6EDBDC20ED6DCF0086E097 /* ImageCropPickerSDK in Resources */, 0DC38A29B0E54AF4AF96CB95 /* MaterialCommunityIcons.ttf in Resources */, 334A709FA3B448BC9A8563F6 /* MaterialIcons.ttf in Resources */, 2684481F67844BE398381564 /* Octicons.ttf in Resources */, D6408D9E4A864FF6BA986857 /* SimpleLineIcons.ttf in Resources */, CBD0E0A35B174C4DBFED3B31 /* Zocial.ttf in Resources */, B8E79AF41F3CD167005B464F /* Info.plist in Resources */, + 0AC2050A2CA1485DAC130425 /* Feather.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1871,10 +1907,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native-video/ios", @@ -1883,6 +1917,8 @@ "$(SRCROOT)/../node_modules/react-native-audio/ios", "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = RocketChatRNTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1899,6 +1935,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1919,10 +1956,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native-video/ios", @@ -1931,6 +1966,8 @@ "$(SRCROOT)/../node_modules/react-native-audio/ios", "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = RocketChatRNTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1947,6 +1984,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -1976,10 +2014,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/**", @@ -1990,6 +2026,8 @@ "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", "$(SRCROOT)/../node_modules/react-native-notifications/RNNotifications", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = RocketChatRN/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2024,10 +2062,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/**", @@ -2038,6 +2074,8 @@ "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", "$(SRCROOT)/../node_modules/react-native-notifications/RNNotifications", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = RocketChatRN/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2071,10 +2109,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native-video/ios", @@ -2083,6 +2119,8 @@ "$(SRCROOT)/../node_modules/react-native-audio/ios", "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = "RocketChatRN-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2098,6 +2136,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -2128,10 +2167,8 @@ "$(inherited)", "$(SRCROOT)/../node_modules/realm/src/**", "$(SRCROOT)/../node_modules/react-native-zeroconf/ios/RNZeroconf", - "$(SRCROOT)/../node_modules/react-native-fetch-blob/ios/**", "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", "$(SRCROOT)/../node_modules/react-native-svg/ios/**", - "$(SRCROOT)/../node_modules/react-native-image-picker/ios", "$(SRCROOT)/../node_modules/react-native-navigation/ios/**", "$(SRCROOT)/../node_modules/react-native-autogrow-textinput/ios", "$(SRCROOT)/../node_modules/react-native-video/ios", @@ -2140,6 +2177,8 @@ "$(SRCROOT)/../node_modules/react-native-audio/ios", "$(SRCROOT)/../node_modules/react-native-fast-image/ios/FastImage/**", "$(SRCROOT)/../node_modules/react-native-i18n/ios", + "$(SRCROOT)/../node_modules/react-native-image-crop-picker/ios/**", + "$(SRCROOT)/../node_modules/rn-fetch-blob/ios/**", ); INFOPLIST_FILE = "RocketChatRN-tvOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; @@ -2155,6 +2194,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); OTHER_LDFLAGS = ( "-ObjC", @@ -2194,6 +2234,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RocketChatRN-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2229,6 +2270,7 @@ "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", "\"$(SRCROOT)/$(TARGET_NAME)\"", + "\"$(SRCROOT)/$(TARGET_NAME)\"", ); PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.RocketChatRN-tvOSTests"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/RocketChatRN/Info.plist b/ios/RocketChatRN/Info.plist index 9f7b252646358bfc4918e95f8c74c606f596fa3c..863c480db32a8a471527f7788cf211edc49cfea6 100644 --- a/ios/RocketChatRN/Info.plist +++ b/ios/RocketChatRN/Info.plist @@ -83,6 +83,7 @@ <string>SimpleLineIcons.ttf</string> <string>Zocial.ttf</string> <string>icomoon.ttf</string> + <string>Feather.ttf</string> </array> <key>UILaunchStoryboardName</key> <string>LaunchScreen</string> diff --git a/package-lock.json b/package-lock.json index 2c5e80014cd77a3d56001eabb51a790758e49ddf..832b7625c6461be7ab201c7b64cbffc5d134e06e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1243,9 +1243,9 @@ } }, "@types/react-native": { - "version": "0.55.27", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.55.27.tgz", - "integrity": "sha512-ysM2ih3WZZ7wYSZtuUwbDz3922qfupwCupc9wy3UgbOiU/J7JCLIKkZ1BMU6apXJEvbTwHmlH+kSPwDh8UF7Ug==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.56.0.tgz", + "integrity": "sha512-7qoX7Rb/Uu3A6uUwn4CGGOPahnh/vSDNdSywzEgUy6znbzUpx9cMmmRuyHaq/V7NCJlI+D4lE9bUCqg13xoP0Q==", "requires": { "@types/react": "*" } @@ -7255,12 +7255,14 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", "optional": true }, "ajv": { "version": "4.11.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { "co": "^4.6.0", @@ -7269,16 +7271,19 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { "delegates": "^1.0.0", @@ -7287,36 +7292,43 @@ }, "asn1": { "version": "0.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", "optional": true }, "assert-plus": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", "optional": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "optional": true }, "aws-sign2": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", "optional": true }, "aws4": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "optional": true }, "balanced-match": { "version": "0.4.2", - "bundled": true + "resolved": false, + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" }, "bcrypt-pbkdf": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -7324,21 +7336,24 @@ }, "block-stream": { "version": "0.0.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { "inherits": "~2.0.0" } }, "boom": { "version": "2.10.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { "hoek": "2.x.x" } }, "brace-expansion": { "version": "1.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "requires": { "balanced-match": "^0.4.1", "concat-map": "0.0.1" @@ -7346,51 +7361,61 @@ }, "buffer-shims": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "optional": true }, "co": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "combined-stream": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cryptiles": { "version": "2.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { "boom": "2.x.x" } }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -7398,14 +7423,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "debug": { "version": "2.6.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", "optional": true, "requires": { "ms": "2.0.0" @@ -7413,26 +7440,31 @@ }, "deep-extend": { "version": "0.4.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", "optional": true }, "delayed-stream": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { "jsbn": "~0.1.0" @@ -7440,21 +7472,25 @@ }, "extend": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "optional": true }, "extsprintf": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "optional": true }, "form-data": { "version": "2.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { "asynckit": "^0.4.0", @@ -7464,11 +7500,13 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fstream": { "version": "1.0.11", - "bundled": true, + "resolved": false, + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -7478,7 +7516,8 @@ }, "fstream-ignore": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "optional": true, "requires": { "fstream": "^1.0.0", @@ -7488,7 +7527,8 @@ }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "^1.0.3", @@ -7503,7 +7543,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { "assert-plus": "^1.0.0" @@ -7511,14 +7552,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "glob": { "version": "7.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7530,16 +7573,19 @@ }, "graceful-fs": { "version": "4.1.11", - "bundled": true + "resolved": false, + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "har-schema": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", "optional": true }, "har-validator": { "version": "4.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { "ajv": "^4.9.1", @@ -7548,12 +7594,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "hawk": { "version": "3.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { "boom": "2.x.x", "cryptiles": "2.x.x", @@ -7563,11 +7611,13 @@ }, "hoek": { "version": "2.16.3", - "bundled": true + "resolved": false, + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" }, "http-signature": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { "assert-plus": "^0.2.0", @@ -7577,7 +7627,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -7585,37 +7636,44 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": false, + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "optional": true }, "isarray": { "version": "1.0.0", - "bundled": true + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "optional": true }, "jodid25519": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { "jsbn": "~0.1.0" @@ -7623,17 +7681,20 @@ }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "optional": true }, "json-stable-stringify": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { "jsonify": "~0.0.0" @@ -7641,17 +7702,20 @@ }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "optional": true }, "jsonify": { "version": "0.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "optional": true }, "jsprim": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "optional": true, "requires": { "assert-plus": "1.0.0", @@ -7662,48 +7726,56 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "mime-db": { "version": "1.27.0", - "bundled": true + "resolved": false, + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" }, "mime-types": { "version": "2.1.15", - "bundled": true, + "resolved": false, + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { "mime-db": "~1.27.0" } }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": false, + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "optional": true }, "node-pre-gyp": { "version": "0.6.39", - "bundled": true, + "resolved": false, + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -7721,7 +7793,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1", @@ -7730,7 +7803,8 @@ }, "npmlog": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -7741,38 +7815,45 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.8.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", "optional": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -7781,30 +7862,36 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "performance-now": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", "optional": true }, "process-nextick-args": { "version": "1.0.7", - "bundled": true + "resolved": false, + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "optional": true }, "qs": { "version": "6.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", "optional": true }, "rc": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "optional": true, "requires": { "deep-extend": "~0.4.0", @@ -7815,14 +7902,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.2.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { "buffer-shims": "~1.0.0", "core-util-is": "~1.0.0", @@ -7835,7 +7924,8 @@ }, "request": { "version": "2.81.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { "aws-sign2": "~0.6.0", @@ -7864,40 +7954,47 @@ }, "rimraf": { "version": "2.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.0.1", - "bundled": true + "resolved": false, + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "semver": { "version": "5.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "sntp": { "version": "1.0.9", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { "hoek": "2.x.x" } }, "sshpk": { "version": "1.13.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", "optional": true, "requires": { "asn1": "~0.2.3", @@ -7913,14 +8010,16 @@ "dependencies": { "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "optional": true } } }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7929,31 +8028,36 @@ }, "string_decoder": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "requires": { "safe-buffer": "^5.0.1" } }, "stringstream": { "version": "0.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", "optional": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "2.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -7962,7 +8066,8 @@ }, "tar-pack": { "version": "3.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "optional": true, "requires": { "debug": "^2.2.0", @@ -7977,7 +8082,8 @@ }, "tough-cookie": { "version": "2.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "optional": true, "requires": { "punycode": "^1.4.1" @@ -7985,7 +8091,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { "safe-buffer": "^5.0.1" @@ -7993,26 +8100,31 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "optional": true }, "util-deprecate": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "optional": true }, "verror": { "version": "1.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", "optional": true, "requires": { "extsprintf": "1.0.2" @@ -8020,7 +8132,8 @@ }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { "string-width": "^1.0.2" @@ -8028,7 +8141,8 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" } } }, @@ -9298,9 +9412,9 @@ "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=" }, "i18n-js": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-3.0.3.tgz", - "integrity": "sha512-u144MQhV/8mz4Y5wP86SQAWMwS8gpe/JavIa9hugSI4WreezGgbhJPdk2Q60KcdIltKLiNefGtHNh1N8SSmQqQ==" + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-3.0.11.tgz", + "integrity": "sha512-v7dG3kYJTQTyox3NqDabPDE/ZotWntyMI9kh4cYi+XlCSnsIR+KBTS2opPyObL8WndnklcLzbNU92FP/mLge3Q==" }, "iconv-lite": { "version": "0.4.19", @@ -12176,9 +12290,9 @@ } }, "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.6.tgz", + "integrity": "sha512-O9SR2NVICx6rCqh1qsU91QZ5IoNa+2T1ROJ0OQlfvATKGmnjsAvg3r0E5ufPZ4a95jdKTPXhFWiE/sOZ7a5Rtg==" }, "js-sha256": { "version": "0.9.0", @@ -12494,9 +12608,9 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash-es": { - "version": "4.17.8", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.8.tgz", - "integrity": "sha512-I9mjAxengFAleSThFhhAhvba6fsO0hunb9/0sQ6qQihSZsJRBofv2rYH58WXaOb/O++eUmYpCLywSQ22GfU+sA==", + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==", "dev": true }, "lodash._getnative": { @@ -16462,30 +16576,6 @@ "prop-types": "^15.5.10" } }, - "react-native-fetch-blob": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/react-native-fetch-blob/-/react-native-fetch-blob-0.10.8.tgz", - "integrity": "sha1-T8JWq64MtfEOfEHyjBGz/zMNcqk=", - "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-fit-image": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/react-native-fit-image/-/react-native-fit-image-1.5.4.tgz", @@ -16495,17 +16585,29 @@ } }, "react-native-i18n": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/react-native-i18n/-/react-native-i18n-2.0.12.tgz", - "integrity": "sha512-2eTUk7BVZP5knthCmVt6y7rePFwrxXl4ym2I20e91oTYJnKM22sAjQMnLhRCYZWC4ucRBbe2pUp63uxNdTkkQw==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/react-native-i18n/-/react-native-i18n-2.0.14.tgz", + "integrity": "sha512-Cv38EgAfZTWjRBj0yPSb8c68qPME554d6k0dxGKM/wlHL8xV3bdvzP5F60MyNWdmTOUC4V2jFmGDvVU5VkFIpg==", "requires": { - "i18n-js": "^3.0.3" + "i18n-js": "^3.0.11" } }, - "react-native-image-picker": { - "version": "0.26.10", - "resolved": "https://registry.npmjs.org/react-native-image-picker/-/react-native-image-picker-0.26.10.tgz", - "integrity": "sha512-z6gAbru2E6SyGWm4ZTbiM9hPHZ5Tsl9kXGfRxW6YQXf9us7zybKoS7dKE1fQPsssv/OSvpPDKannJNncE+ATRA==" + "react-native-image-crop-picker": { + "version": "git+https://github.com/RocketChat/react-native-image-crop-picker.git#6b5493f070a4830d2e870e56d5cfb6a713318675", + "from": "git+https://github.com/RocketChat/react-native-image-crop-picker.git" + }, + "react-native-image-pan-zoom": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-native-image-pan-zoom/-/react-native-image-pan-zoom-2.1.7.tgz", + "integrity": "sha512-UwoHcn5cp/NgU8pjzod3GiIV/U1OKOp9/7G/xPaAbwsMm7AJ6aogn7vFaVdPFUc5Qor6fCsFjeNICcxiDOcPqw==" + }, + "react-native-image-zoom-viewer": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/react-native-image-zoom-viewer/-/react-native-image-zoom-viewer-2.2.13.tgz", + "integrity": "sha512-4Kce8dttWO4NdXBLf+2CC2aP2p2Hgwj+7NVQZlmpM9f4xitQNIf+mgWT2jDnSsXdNKiwv5BykLzuNmv542wSPQ==", + "requires": { + "react-native-image-pan-zoom": "^2.1.7" + } }, "react-native-iphone-x-helper": { "version": "1.0.3", @@ -16536,8 +16638,9 @@ "integrity": "sha512-4kj/K3kt3YqKDua9j+YHAP0Y000zVS5bwd8eMw6eH701CdhVv3GP1iPf5rsFiElXJZ3CV0aK2RS9Ul0oYNeG3Q==" }, "react-native-markdown-renderer": { - "version": "git+https://github.com/RocketChat/react-native-markdown-renderer.git#cecc6d0a2c940ac7a1e1e98c624d8b9b4d37ab68", - "from": "git+https://github.com/RocketChat/react-native-markdown-renderer.git", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/react-native-markdown-renderer/-/react-native-markdown-renderer-3.2.8.tgz", + "integrity": "sha512-gDT5r3lwecNsEfpKagSaidEGfmCbpVcmV+HHLjaGYRALJoHkpOFni0rJZW1rCerOR9sjaUNGXE66U7BUrlEw0w==", "requires": { "@types/markdown-it": "^0.0.4", "@types/react-native": ">=0.50.0", @@ -16547,9 +16650,9 @@ } }, "react-native-meteor": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-native-meteor/-/react-native-meteor-1.3.0.tgz", - "integrity": "sha512-FgQ9O4pN1h+OaezlAMZ8h3g6aon/P6wWoYbMQGuyFzpW+hSREPjCtMVMKEJsKZ11MzIWFblgrdk3nzUI5dpdUQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-native-meteor/-/react-native-meteor-1.4.0.tgz", + "integrity": "sha512-Bm5RGTDv7LsJqqWjaR8KCv2mpeeMMPOIeZWHSx1yeTLUnEx71jVWAbHNXmEEynyH61/NVUpwDaXZKxiw9OwhFA==", "requires": { "base-64": "^0.1.0", "crypto-js": "^3.1.6", @@ -16564,9 +16667,9 @@ } }, "react-native-modal": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-6.1.0.tgz", - "integrity": "sha512-DBEJlUElTkWw6H1huHWaa1psQhnlsYxIpfNS4Cfw/fXq5rJkY1+hzHzySbXOwDyBKIAI652Grdtx+2XItZG4Bw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/react-native-modal/-/react-native-modal-6.4.0.tgz", + "integrity": "sha512-X+bOV8P24NwnIrc2vhLMwowi1iUs2NA4LJv21B/dB67n5/I4ncbhIgf13v5QJ5zGSZ3wfVgRuEKEkKyn6XpYfw==", "requires": { "prop-types": "^15.6.1", "react-native-animatable": "^1.2.4" @@ -16610,9 +16713,9 @@ } }, "react-native-picker-select": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/react-native-picker-select/-/react-native-picker-select-3.1.3.tgz", - "integrity": "sha512-uEaI40PyZgJ5S29tPdvD+AKemt2MhuRvxCSqzQ99ON62F1nsOLXj1IXKqn1wlOeGqQvTKHOVh6uR7/KrtsE2vA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/react-native-picker-select/-/react-native-picker-select-4.0.0.tgz", + "integrity": "sha512-3wxKlFyfLsTptftTrdO1cqrXEYoJZ84wEuhfHocpkClIxK4FGEzsrZiKgIiRicaF9TCDFn76dsYdLgWFVJMqwQ==", "requires": { "lodash.isequal": "^4.5.0" } @@ -16903,45 +17006,31 @@ } }, "reactotron-core-client": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/reactotron-core-client/-/reactotron-core-client-1.13.0.tgz", - "integrity": "sha512-dX2tKjGlZ9sPETLV2r8/K93acfdnGs6oi0r+0x1xdAitaNqtd9O7oiZZc+dBqFHZB3Tz1aooAlMsjD6PVFidCg==", - "dev": true, - "requires": { - "json-stringify-safe": "^5.0.1", - "ramda": "^0.24.1", - "ramdasauce": "^2.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reactotron-core-client/-/reactotron-core-client-2.0.0.tgz", + "integrity": "sha512-9t10M/48VXShmU2yqDeSPhJHaNWLNVrKE08b2YFXBHcyCaGtrrxrJzg+Gk/lGgpRCQEayQ47WA0r5T09JN/bPg==", + "dev": true }, "reactotron-react-native": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/reactotron-react-native/-/reactotron-react-native-2.0.0-beta.10.tgz", - "integrity": "sha512-LcG/Ut55MEuLLHw9hpvPXTpIg6XNslWR6nNhItbwCSC1XC1JfgObYmCDziZV1O58V/oZrZ7ceCDKjzQi8tC4fg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reactotron-react-native/-/reactotron-react-native-2.0.0.tgz", + "integrity": "sha512-VlLd1vapIR6QXCv53Bn0oHmVIN8uLufHIVTKRH/OtRZa2cGA4z1KRpbZQuryuZ8mVfptZV3rjHAv/1cjzTrwpg==", "dev": true, "requires": { "mitt": "^1.1.2", "prop-types": "^15.5.10", - "reactotron-core-client": "^2.0.0-beta.10", - "rn-host-detect": "^1.1.3" - }, - "dependencies": { - "reactotron-core-client": { - "version": "2.0.0-beta.10", - "resolved": "https://registry.npmjs.org/reactotron-core-client/-/reactotron-core-client-2.0.0-beta.10.tgz", - "integrity": "sha512-mJqd3NhYWh9PjFnBd68XYNj2s++qc6L/42Z1NoQW+LDvCfJE9ufDh6G5fK4RrxknH+i0dqnR79zT162298kU1A==", - "dev": true - } + "reactotron-core-client": "^2.0.0" } }, "reactotron-redux": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/reactotron-redux/-/reactotron-redux-1.13.0.tgz", - "integrity": "sha512-8imh/blSwBrYdp+1NXR1UNtAQM4Q5DuEd/olWjYafDJOej469+SnimJvTtsriIrFk+drPa1Ny8VeGLQihAj1Sg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reactotron-redux/-/reactotron-redux-2.0.0.tgz", + "integrity": "sha512-ZpxfBVHfCzbF50sCAJWAUz4BCRNH8BNLqLOwIyfRlcF9noQ2dbBo8TqRB6WXxN7pdToi7GhIYBlZ8saaQ+IGtQ==", "dev": true, "requires": { "ramda": "^0.24.1", "ramdasauce": "^2.0.0", - "reactotron-core-client": "^1.13.0", + "reactotron-core-client": "^2.0.0", "redux": "^3.7.1" }, "dependencies": { @@ -16960,14 +17049,14 @@ } }, "reactotron-redux-saga": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/reactotron-redux-saga/-/reactotron-redux-saga-1.13.0.tgz", - "integrity": "sha512-d+Md68OQhBGTi4LRviPKBSOrPQ5Zl4lQhje8ENn3OP8kp1E+Jw6wKYKb3ywPOnA05F0SroSL6OJIYFtDlb02zA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reactotron-redux-saga/-/reactotron-redux-saga-2.0.0.tgz", + "integrity": "sha512-pHOTdql7BgyRHxPWt9fSY+SfDt4E01iXFV/FXEjM59wlhh8j0qt9+mfUQlQehvaWcUbNQdIcdN7c5KKODIRVSQ==", "dev": true, "requires": { "ramda": "^0.24.1", "ramdasauce": "^2.0.0", - "reactotron-core-client": "^1.13.0", + "reactotron-core-client": "^2.0.0", "redux": "^3.7.1", "redux-saga": "^0.15.3" }, @@ -17523,11 +17612,29 @@ "inherits": "^2.0.1" } }, - "rn-host-detect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/rn-host-detect/-/rn-host-detect-1.1.3.tgz", - "integrity": "sha1-JC124vpIXEjXUUFuZbfM5ZaWnpE=", - "dev": true + "rn-fetch-blob": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/rn-fetch-blob/-/rn-fetch-blob-0.10.11.tgz", + "integrity": "sha512-QHF8qlDdAcS0ZjydRlh8nZDVWBQJGsshPrXgyB0z34gY654T1+z2fkmC0WWxQ4CSKyweVFvU4fYa0AE/r1nI4A==", + "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" + } + } + } }, "run-async": { "version": "2.3.0", diff --git a/package.json b/package.json index 917e9bdc2511e80443f6e17e0559217b5dae3cdf..1127c6bbd67e929b8e78976f2e4027bcf66b1bcb 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "android": "react-native run-android", "storybook": "storybook start -p 7007", "snyk-protect": "snyk protect", - "prepare": "npm run snyk-protect; exit 0", "fabric-ios": "./scripts/fabric-ios.sh", "fabric-android": "./scripts/fabric-android.sh", "postinstall": "cp ./temp/react.gradle ./node_modules/react-native" @@ -33,7 +32,7 @@ "babel-preset-expo": "^4.0.0", "deep-equal": "^1.0.1", "ejson": "^2.1.2", - "js-base64": "^2.4.5", + "js-base64": "^2.4.6", "js-sha256": "^0.9.0", "lodash": "^4.17.10", "markdown-it-flowdock": "^0.3.7", @@ -48,19 +47,19 @@ "react-native-dialog": "^5.0.0", "react-native-fabric": "^0.5.1", "react-native-fast-image": "^4.0.14", - "react-native-fetch-blob": "^0.10.8", - "react-native-i18n": "^2.0.12", - "react-native-image-picker": "^0.26.10", + "react-native-i18n": "^2.0.14", + "react-native-image-crop-picker": "git+https://github.com/RocketChat/react-native-image-crop-picker.git", + "react-native-image-zoom-viewer": "^2.2.13", "react-native-keyboard-aware-scroll-view": "^0.6.0", "react-native-keyboard-input": "^5.2.3", "react-native-keyboard-tracking-view": "^5.4.4", - "react-native-markdown-renderer": "git+https://github.com/RocketChat/react-native-markdown-renderer.git", - "react-native-meteor": "^1.3.0", - "react-native-modal": "^6.1.0", + "react-native-markdown-renderer": "^3.2.8", + "react-native-meteor": "^1.4.0", + "react-native-modal": "^6.4.0", "react-native-navigation": "^1.1.474", "react-native-notifications": "^1.1.19", "react-native-optimized-flatlist": "^1.0.4", - "react-native-picker-select": "^3.1.3", + "react-native-picker-select": "^4.0.0", "react-native-responsive-ui": "^1.1.1", "react-native-safari-view": "^2.1.0", "react-native-scrollable-tab-view": "^0.8.0", @@ -78,6 +77,7 @@ "redux-immutable-state-invariant": "^2.1.0", "redux-saga": "^0.16.0", "regenerator-runtime": "^0.12.0", + "rn-fetch-blob": "^0.10.11", "snyk": "^1.88.1", "strip-ansi": "^4.0.0" }, @@ -103,9 +103,9 @@ "react-dom": "^16.4.1", "react-native-bundle-visualizer": "^1.3.0", "react-test-renderer": "^16.4.1", - "reactotron-react-native": "^2.0.0-beta.10", - "reactotron-redux": "^1.13.0", - "reactotron-redux-saga": "^1.13.0" + "reactotron-react-native": "^2.0.0", + "reactotron-redux": "^2.0.0", + "reactotron-redux-saga": "^2.0.0" }, "jest": { "testPathIgnorePatterns": [