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}