Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] App not prompting join code for password protected channels #2514

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
0ff3842
Adding joinCode parameter
DanMke Sep 30, 2020
9b12537
Insert join code input
vitorl-s Oct 3, 2020
bcbc444
Add joinCode field on db
vitorl-s Oct 3, 2020
c60f7a1
Add label i18 pt-br and en-us
vitorl-s Oct 3, 2020
e7d452f
Add insert join code text
vitorl-s Oct 6, 2020
ebe257a
Fix atribute name
vitorl-s Oct 6, 2020
40ca5ea
Add join text
vitorl-s Oct 6, 2020
9788da3
Fix attributes joinCode, joinCodeRequired and pass attribute param in…
DanMke Oct 7, 2020
f943f5d
Merge branch 'develop' into fix.password-protected-channel
DanMke Oct 7, 2020
a9e200a
Fixing attribute joinCodeRequired pass to goRoom
DanMke Oct 7, 2020
68aa406
Changed textinput style
DanMke Oct 7, 2020
13e3035
Delete not necessary attribute
DanMke Oct 7, 2020
e224dcb
Fixing input style
DanMke Oct 8, 2020
7ed8f59
Undo unncessary changes
djorkaeffalexandre Oct 13, 2020
39c2716
use a join code modal
djorkaeffalexandre Oct 13, 2020
096ce7f
Merge branch 'develop' into fix.password-protected-channel
djorkaeffalexandre Oct 13, 2020
e1ec916
Merge remote-tracking branch 'upstream/develop' into fix.password-pro…
youssef-md Nov 3, 2020
4d9a5cf
Merge develop
djorkaeffalexandre Nov 30, 2020
3c16be7
tests: e2e tests to join protected channel
djorkaeffalexandre Nov 30, 2020
1ed0c6b
fix: undo unnecessary change
djorkaeffalexandre Nov 30, 2020
510f1f0
tests: cancel join code
djorkaeffalexandre Nov 30, 2020
48b64c8
Merge branch 'develop' into fix.password-protected-channel
diegolmello Dec 1, 2020
6e8e065
Remove some tests
diegolmello Dec 1, 2020
c9a3a0b
Minor fixes
diegolmello Dec 1, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/i18n/locales/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
2 changes: 2 additions & 0 deletions app/i18n/locales/pt-BR.js
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
4 changes: 2 additions & 2 deletions app/lib/rocketchat.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion app/views/DirectoryView/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
});
}
}
Expand Down
140 changes: 140 additions & 0 deletions app/views/RoomView/JoinCode.js
Original file line number Diff line number Diff line change
@@ -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 (
<Modal
transparent
avoidKeyboard
useNativeDriver
isVisible={visible}
hideModalContentWhileAnimating
>
<View style={styles.container} testID='join-code'>
<View style={[styles.content, isMasterDetail && [sharedStyles.modalFormSheet, styles.tablet], { backgroundColor: themes[theme].backgroundColor }]}>
<Text style={[styles.title, { color: themes[theme].titleText }]}>{I18n.t('Insert_Join_Code')}</Text>
<TextInput
value={code}
theme={theme}
inputRef={e => 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'
/>
<View style={styles.buttonContainer}>
<Button
title={I18n.t('Cancel')}
type='secondary'
style={styles.button}
backgroundColor={themes[theme].chatComponentBackground}
theme={theme}
testID='join-code-cancel'
onPress={hide}
/>
<Button
title={I18n.t('Join')}
type='primary'
style={styles.button}
theme={theme}
testID='join-code-submit'
onPress={joinRoom}
/>
</View>
</View>
</View>
</Modal>
);
}));
JoinCode.propTypes = {
rid: PropTypes.string,
t: PropTypes.string,
onJoin: PropTypes.func,
isMasterDetail: PropTypes.bool,
theme: PropTypes.string
};

const mapStateToProps = state => ({
isMasterDetail: state.app.isMasterDetail
});
export default connect(mapStateToProps, null, null, { forwardRef: true })(JoinCode);
28 changes: 23 additions & 5 deletions app/views/RoomView/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import MessageErrorActions from '../../containers/MessageErrorActions';
import MessageBox from '../../containers/MessageBox';
import ReactionPicker from './ReactionPicker';
import UploadProgress from './UploadProgress';
import JoinCode from './JoinCode';
import styles from './styles';
import log, { logEvent, events } from '../../utils/log';
import EventEmitter from '../../utils/events';
Expand Down Expand Up @@ -73,7 +74,7 @@ const stateAttrsUpdate = [
'readOnly',
'member'
];
const roomAttrsUpdate = ['f', 'ro', 'blocked', 'blocker', 'archived', 'tunread', 'muted', 'ignored', 'jitsiTimeout', 'announcement', 'sysMes', 'topic', 'name', 'fname', 'roles', 'bannerClosed', 'visitor'];
const roomAttrsUpdate = ['f', 'ro', 'blocked', 'blocker', 'archived', 'tunread', 'muted', 'ignored', 'jitsiTimeout', 'announcement', 'sysMes', 'topic', 'name', 'fname', 'roles', 'bannerClosed', 'visitor', 'joinCodeRequired'];

class RoomView extends React.Component {
static propTypes = {
Expand Down Expand Up @@ -152,6 +153,7 @@ class RoomView extends React.Component {

this.messagebox = React.createRef();
this.list = React.createRef();
this.joinCode = React.createRef();
this.mounted = false;
if (this.rid) {
this.sub = new RoomClass(this.rid);
Expand Down Expand Up @@ -711,6 +713,12 @@ class RoomView extends React.Component {

setLastOpen = lastOpen => this.setState({ lastOpen });

onJoin = () => {
this.internalSetState({
joined: true
});
}

joinRoom = async() => {
logEvent(events.ROOM_JOIN);
try {
Expand All @@ -719,11 +727,14 @@ class RoomView extends React.Component {
if (this.isOmnichannel) {
await takeInquiry(room._id);
} else {
await RocketChat.joinRoom(this.rid, this.t);
const { joinCodeRequired } = room;
if (joinCodeRequired) {
this.joinCode.current?.show();
} else {
await RocketChat.joinRoom(this.rid, null, this.t);
this.onJoin();
}
}
this.internalSetState({
joined: true
});
} catch (e) {
log(e);
}
Expand Down Expand Up @@ -1086,6 +1097,13 @@ class RoomView extends React.Component {
onClose={this.onCloseReactionsModal}
getCustomEmoji={this.getCustomEmoji}
/>
<JoinCode
ref={this.joinCode}
onJoin={this.onJoin}
rid={rid}
t={t}
theme={theme}
/>
</SafeAreaView>
);
}
Expand Down
4 changes: 4 additions & 0 deletions e2e/data.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ const data = {
channels: {
detoxpublic: {
name: 'detox-public'
},
detoxpublicprotected: {
name: 'detox-public-protected',
joinCode: '123'
}
},
groups: {
Expand Down
4 changes: 4 additions & 0 deletions e2e/data/data.cloud.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ const data = {
channels: {
detoxpublic: {
name: 'detox-public'
},
detoxpublicprotected: {
name: 'detox-public-protected',
joinCode: '123'
}
},
groups: {
Expand Down
4 changes: 4 additions & 0 deletions e2e/data/data.docker.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ const data = {
channels: {
detoxpublic: {
name: 'detox-public'
},
detoxpublicprotected: {
name: 'detox-public-protected',
joinCode: '123'
}
},
groups: {
Expand Down
30 changes: 27 additions & 3 deletions e2e/helpers/data_setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,14 @@ const createUser = async (username, password, name, email) => {
const createChannelIfNotExists = async (channelname) => {
console.log(`Creating public channel ${channelname}`)
try {
await rocketchat.post('channels.create', {
const room = await rocketchat.post('channels.create', {
"name": channelname
})
return room
} catch (createError) {
try { //Maybe it exists already?
await rocketchat.get(`channels.info?roomName=${channelname}`)
const room = rocketchat.get(`channels.info?roomName=${channelname}`)
return room
} catch (infoError) {
console.log(JSON.stringify(createError))
console.log(JSON.stringify(infoError))
Expand All @@ -71,6 +73,24 @@ const createGroupIfNotExists = async (groupname) => {
}
}

const changeChannelJoinCode = async (roomId, joinCode) => {
console.log(`Changing channel Join Code ${roomId}`)
try {
await rocketchat.post('method.call/saveRoomSettings', {
message: JSON.stringify({
method: 'saveRoomSettings',
params: [
roomId,
{ joinCode }
]
})
})
} catch (createError) {
console.log(JSON.stringify(createError))
throw "Failed to create protected channel"
}
}

const sendMessage = async (user, groupname, msg) => {
console.log(`Sending message to ${groupname}`)
try {
Expand All @@ -96,7 +116,11 @@ const setup = async () => {
for (var channelKey in data.channels) {
if (data.channels.hasOwnProperty(channelKey)) {
const channel = data.channels[channelKey]
await createChannelIfNotExists(channel.name)
const { data: { channel: { _id } } } = await createChannelIfNotExists(channel.name)

if (channel.joinCode) {
await changeChannelJoinCode(_id, channel.joinCode);
}
}
}

Expand Down
Loading