import React from 'react'; import PropTypes from 'prop-types'; import { View, Text, TextInput, Image } from 'react-native'; import { connect } from 'react-redux'; import ShareExtension from 'rn-extensions-share'; import { COLOR_TEXT_DESCRIPTION } from '../../constants/colors'; import I18n from '../../i18n'; import RocketChat from '../../lib/rocketchat'; import { CustomIcon } from '../../lib/Icons'; import log from '../../utils/log'; import styles from './styles'; import Loading from './Loading'; import database from '../../lib/realm'; import { CustomHeaderButtons, Item } from '../../containers/HeaderButton'; import { isReadOnly, isBlocked } from '../../utils/room'; @connect(state => ({ username: state.login.user && state.login.user.username })) export default class ShareView extends React.Component { static navigationOptions = ({ navigation }) => { const canSend = navigation.getParam('canSend', false); return ({ title: I18n.t('Share'), headerRight: canSend ? ( ) : null }); } static propTypes = { navigation: PropTypes.object, username: PropTypes.string.isRequired }; constructor(props) { super(props); const { navigation } = this.props; const rid = navigation.getParam('rid', ''); const name = navigation.getParam('name', ''); const value = navigation.getParam('value', ''); const isMedia = navigation.getParam('isMedia', false); const fileInfo = navigation.getParam('fileInfo', {}); this.rooms = database.objects('subscriptions').filtered('rid = $0', rid); this.state = { rid, value, isMedia, name, fileInfo, loading: false, room: this.rooms[0] || { rid }, file: { name: fileInfo ? fileInfo.name : '', description: '' } }; } componentDidMount() { const { room } = this.state; const { navigation, username } = this.props; navigation.setParams({ sendMessage: this._sendMessage, canSend: !(isReadOnly(room, { username }) || isBlocked(room)) }); } bytesToSize = bits => `${ ((bits / 8) / 1048576).toFixed(2) }MB`; _sendMessage = async() => { const { isMedia } = this.state; this.setState({ loading: true }); if (isMedia) { await this.sendMediaMessage(); } else { await this.sendTextMessage(); } this.setState({ loading: false }); ShareExtension.close(); } sendMediaMessage = async() => { const { rid, fileInfo, file } = this.state; const { name, description } = file; const fileMessage = { ...fileInfo, name, description }; if (fileInfo && rid !== '') { try { await RocketChat.sendFileMessage(rid, fileMessage, undefined); } catch (e) { log('err_send_media_message', e); } } } sendTextMessage = async() => { const { value, rid } = this.state; if (value !== '' && rid !== '') { try { await RocketChat.sendMessage(rid, value, undefined); } catch (error) { log('err_share_extension_send_message', error); } } }; renderPreview = () => { const { fileInfo } = this.state; const icon = fileInfo.type.match(/image/) ? : ( ); return ( {icon} {fileInfo.name} {this.bytesToSize(fileInfo.size)} ); }; renderMediaContent = () => { const { fileInfo, file } = this.state; return fileInfo ? ( {this.renderPreview()} this.setState({ file: { ...file, name } })} underlineColorAndroid='transparent' defaultValue={file.name} placeholderTextColor={COLOR_TEXT_DESCRIPTION} /> this.setState({ file: { ...file, description } })} underlineColorAndroid='transparent' defaultValue={file.description} multiline textAlignVertical='top' placeholderTextColor={COLOR_TEXT_DESCRIPTION} autoFocus /> ) : null; }; renderInput = () => { const { value } = this.state; return ( this.setState({ value: handleText })} underlineColorAndroid='transparent' defaultValue={value} multiline textAlignVertical='top' placeholderTextColor={COLOR_TEXT_DESCRIPTION} autoFocus /> ); } renderError = () => { const { room } = this.state; return ( { isBlocked(room) ? I18n.t('This_room_is_blocked') : I18n.t('This_room_is_read_only') } ); } render() { const { username } = this.props; const { name, loading, isMedia, room } = this.state; if (isReadOnly(room, { username }) || isBlocked(room)) { return this.renderError(); } return ( {`${ I18n.t('To') }: `} {`${ name }`} {isMedia ? this.renderMediaContent() : this.renderInput()} { loading ? : null } ); } }