diff --git a/app/i18n/locales/en.js b/app/i18n/locales/en.js index d85ad30d330..6feb764f136 100644 --- a/app/i18n/locales/en.js +++ b/app/i18n/locales/en.js @@ -281,6 +281,8 @@ export default { Invite_Link: 'Invite Link', Invite_users: 'Invite users', Join: 'Join', + Join_Code: 'Join Code', + Insert_Join_Code: 'Insert Join Code', Join_our_open_workspace: 'Join our open workspace', Join_your_workspace: 'Join your workspace', Just_invited_people_can_access_this_channel: 'Just invited people can access this channel', diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js index 743b64295a8..3625120787f 100644 --- a/app/i18n/locales/pt-BR.js +++ b/app/i18n/locales/pt-BR.js @@ -270,6 +270,8 @@ export default { Invite_Link: 'Link de Convite', Invite_users: 'Convidar usuários', Join: 'Entrar', + Join_Code: 'Insira o Código da Sala', + Insert_Join_Code: 'Insira o código para entrar na sala', Join_our_open_workspace: 'Entra na nossa workspace pública', Join_your_workspace: 'Entre na sua workspace', Just_invited_people_can_access_this_channel: 'Apenas as pessoas convidadas podem acessar este canal', diff --git a/app/lib/rocketchat.js b/app/lib/rocketchat.js index 182fd856d1f..5020ee4add4 100644 --- a/app/lib/rocketchat.js +++ b/app/lib/rocketchat.js @@ -705,13 +705,13 @@ const RocketChat = { }); }, - joinRoom(roomId, type) { + joinRoom(roomId, joinCode, type) { // TODO: join code // RC 0.48.0 if (type === 'p') { return this.methodCallWrapper('joinRoom', roomId); } - return this.post('channels.join', { roomId }); + return this.post('channels.join', { roomId, joinCode }); }, triggerBlockAction, triggerSubmitView, diff --git a/app/views/DirectoryView/index.js b/app/views/DirectoryView/index.js index 01788bcc2f7..8be78712d03 100644 --- a/app/views/DirectoryView/index.js +++ b/app/views/DirectoryView/index.js @@ -149,8 +149,9 @@ class DirectoryView extends React.Component { this.goRoom({ rid: result.room._id, name: item.username, t: 'd' }); } } else { + const { room } = await RocketChat.getRoomInfo(item._id); this.goRoom({ - rid: item._id, name: item.name, t: 'c', search: true + rid: item._id, name: item.name, joinCodeRequired: room.joinCodeRequired, t: 'c', search: true }); } } diff --git a/app/views/RoomView/JoinCode.js b/app/views/RoomView/JoinCode.js new file mode 100644 index 00000000000..e3639818ba6 --- /dev/null +++ b/app/views/RoomView/JoinCode.js @@ -0,0 +1,140 @@ +import React, { + useState, + forwardRef, + useImperativeHandle +} from 'react'; +import PropTypes from 'prop-types'; +import { + View, + Text, + StyleSheet, + InteractionManager +} from 'react-native'; +import Modal from 'react-native-modal'; +import { connect } from 'react-redux'; + +import I18n from '../../i18n'; +import Button from '../../containers/Button'; +import TextInput from '../../containers/TextInput'; +import RocketChat from '../../lib/rocketchat'; +import sharedStyles from '../Styles'; + +import { themes } from '../../constants/colors'; + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center' + }, + content: { + padding: 16, + width: '100%', + borderRadius: 4 + }, + title: { + fontSize: 16, + paddingBottom: 8, + ...sharedStyles.textBold, + ...sharedStyles.textAlignCenter + }, + button: { + minWidth: 96, + marginBottom: 0 + }, + buttonContainer: { + flexDirection: 'row', + justifyContent: 'space-between' + }, + tablet: { + height: undefined + } +}); + +const JoinCode = React.memo(forwardRef(({ + rid, + t, + onJoin, + isMasterDetail, + theme +}, ref) => { + const [visible, setVisible] = useState(false); + const [error, setError] = useState(false); + const [code, setCode] = useState(''); + + const show = () => setVisible(true); + + const hide = () => setVisible(false); + + const joinRoom = async() => { + try { + await RocketChat.joinRoom(rid, code, t); + onJoin(); + hide(); + } catch (e) { + setError(true); + } + }; + + useImperativeHandle(ref, () => ({ show })); + + return ( + + + + {I18n.t('Insert_Join_Code')} + InteractionManager.runAfterInteractions(() => e?.getNativeRef()?.focus())} + returnKeyType='send' + autoCapitalize='none' + onChangeText={setCode} + onSubmitEditing={joinRoom} + placeholder={I18n.t('Join_Code')} + secureTextEntry + error={error && { error: 'error-code-invalid', reason: I18n.t('Code_or_password_invalid') }} + testID='join-code-input' + /> + +