diff --git a/app/containers/MessageBox/UploadModal.js b/app/containers/MessageBox/UploadModal.js index e6443dc0ce4..044646c2c26 100644 --- a/app/containers/MessageBox/UploadModal.js +++ b/app/containers/MessageBox/UploadModal.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import { - View, Text, StyleSheet, Image, ScrollView, TouchableHighlight + View, Text, StyleSheet, Image, ScrollView, TouchableHighlight, FlatList } from 'react-native'; import PropTypes from 'prop-types'; import Modal from 'react-native-modal'; @@ -17,6 +17,7 @@ import { CustomIcon } from '../../lib/Icons'; import { withTheme } from '../../theme'; import { withSplit } from '../../split'; + const styles = StyleSheet.create({ modal: { width: '100%', @@ -36,10 +37,6 @@ const styles = StyleSheet.create({ height: 430, flexDirection: 'column' }, - scrollView: { - flex: 1, - padding: 16 - }, image: { height: 150, flex: 1, @@ -86,7 +83,6 @@ const styles = StyleSheet.create({ class UploadModal extends Component { static propTypes = { isVisible: PropTypes.bool, - file: PropTypes.object, close: PropTypes.func, submit: PropTypes.func, window: PropTypes.object, @@ -95,9 +91,10 @@ class UploadModal extends Component { } state = { - name: '', + name: {}, description: '', - file: {} + file: {}, + files: [] }; static getDerivedStateFromProps(props, state) { @@ -105,7 +102,8 @@ class UploadModal extends Component { return { file: props.file, name: props.file.filename || 'Filename', - description: '' + description: '', + files: [...state.files, props.file] }; } return null; @@ -142,9 +140,9 @@ class UploadModal extends Component { } submit = () => { - const { file, submit } = this.props; - const { name, description } = this.state; - submit({ ...file, name, description }); + const { submit } = this.props; + const { files, description } = this.state; + submit({ files, description }); } renderButtons = () => { @@ -193,8 +191,9 @@ class UploadModal extends Component { ); } - renderPreview() { - const { file, split, theme } = this.props; + renderPreview(file) { + const { split, theme } = this.props; + if (file.mime && file.mime.match(/image/)) { return (); } @@ -212,7 +211,7 @@ class UploadModal extends Component { const { window: { width }, isVisible, close, split, theme } = this.props; - const { name, description } = this.state; + const { name, description, files } = this.state; return ( {I18n.t('Upload_file_question_mark')} - - {this.renderPreview()} - this.setState({ name: value })} - theme={theme} - /> - this.setState({ description: value })} - theme={theme} + + this.renderPreview(item)} /> + + + + this.setState({ name: value })} + theme={theme} + /> + this.setState({ description: value })} + theme={theme} + /> + {this.renderButtons()} diff --git a/app/containers/MessageBox/index.js b/app/containers/MessageBox/index.js index 14decbbf9db..8152d03f235 100644 --- a/app/containers/MessageBox/index.js +++ b/app/containers/MessageBox/index.js @@ -118,7 +118,7 @@ class MessageBox extends Component { I18n.t('Take_a_photo'), I18n.t('Take_a_video'), I18n.t('Choose_from_library'), - I18n.t('Choose_file') + I18n.t('Choose_files') ]; const libPickerLabels = { cropperChooseText: I18n.t('Choose'), @@ -512,26 +512,29 @@ class MessageBox extends Component { return false; } - sendMediaMessage = async(file) => { + sendMediaMessage = ({ files, description }) => { const { rid, tmid, baseUrl: server, user, message: { id: messageTmid }, replyCancel } = this.props; - this.setState({ file: { isVisible: false } }); - const fileInfo = { - name: file.name, - description: file.description, - size: file.size, - type: file.mime, - store: 'Uploads', - path: file.path - }; - try { - replyCancel(); - await RocketChat.sendFileMessage(rid, fileInfo, tmid || messageTmid, server, user); - Review.pushPositiveEvent(); - } catch (e) { - log(e); - } + files.map(async(file) => { + this.setState({ file: { isVisible: false } }); + const fileInfo = { + name: file.filename, + description, + size: file.size, + type: file.mime, + store: 'Uploads', + path: file.path + }; + + try { + replyCancel(); + await RocketChat.sendFileMessage(rid, fileInfo, tmid || messageTmid, server, user); + Review.pushPositiveEvent(); + } catch (e) { + log(e); + } + }); } takePhoto = async() => { @@ -569,18 +572,20 @@ class MessageBox extends Component { chooseFile = async() => { try { - const res = await DocumentPicker.pick({ + const results = await DocumentPicker.pickMultiple({ type: [DocumentPicker.types.allFiles] }); - const file = { - filename: res.name, - size: res.size, - mime: res.type, - path: res.uri - }; - if (this.canUploadFile(file)) { - this.showUploadModal(file); - } + results.forEach((file) => { + file = { + filename: file.name, + size: file.size, + mime: file.type, + path: file.uri + }; + if (this.canUploadFile(file)) { + this.showUploadModal(file); + } + }); } catch (e) { if (!DocumentPicker.isCancel(e)) { log(e); diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index f632e7b8dfd..baf5b1498d1 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -133,7 +133,7 @@ export default { Change_language_loading: 'Changing language.', Choose: 'Choose', Choose_from_library: 'Choose from library', - Choose_file: 'Choose file', + Choose_files: 'Choose files', Choose_where_you_want_links_be_opened: 'Choose where you want links be opened', Code: 'Code', Collaborative: 'Collaborative', diff --git a/app/index.js b/app/index.js index dddbea09544..9176fea3c24 100644 --- a/app/index.js +++ b/app/index.js @@ -421,9 +421,6 @@ const RoomActionsStack = createStackNavigator({ }, NotificationPrefView: { getScreen: () => require('./views/NotificationPreferencesView').default - }, - AttachmentView: { - getScreen: () => require('./views/AttachmentView').default } }, { defaultNavigationOptions: defaultHeader, @@ -438,6 +435,7 @@ const ModalSwitch = createSwitchNavigator({ RoomActionsStack, SettingsStack, ModalBlockStack, + AttachmentStack, AuthLoading: () => null }, { @@ -493,7 +491,7 @@ class CustomModalStack extends React.Component { ); - if (isAndroid) { + if (isAndroid && !pageSheet) { content = ( {content}