From 8f1036f57ea9d6d4e66d44f0435613fa11f4e8d9 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto <47038980+reinaldonetof@users.noreply.github.com> Date: Mon, 23 Aug 2021 10:42:09 -0300 Subject: [PATCH] [FIX] Permissions to edit livechat when the user is a livechat-agent (#3294) * [FIX] Permissions to edit livechat * Added the permission to edit livechat room custom fields Co-authored-by: Levy Costa Co-authored-by: Diego Mello --- app/lib/methods/getPermissions.js | 4 +++- app/views/LivechatEditView.js | 24 +++++++++++++++++++++--- app/views/RoomInfoView/index.js | 14 +++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/app/lib/methods/getPermissions.js b/app/lib/methods/getPermissions.js index 1c4c56b46..764b725e0 100644 --- a/app/lib/methods/getPermissions.js +++ b/app/lib/methods/getPermissions.js @@ -48,7 +48,9 @@ const PERMISSIONS = [ 'view-user-administration', 'view-all-teams', 'view-all-team-channels', - 'convert-team' + 'convert-team', + 'edit-omnichannel-contact', + 'edit-livechat-room-customfields' ]; export async function setPermissions() { diff --git a/app/views/LivechatEditView.js b/app/views/LivechatEditView.js index 6ba4143e7..78b728489 100644 --- a/app/views/LivechatEditView.js +++ b/app/views/LivechatEditView.js @@ -37,10 +37,11 @@ Title.propTypes = { }; const LivechatEditView = ({ - user, navigation, route, theme + user, navigation, route, theme, editOmnichannelContact, editLivechatRoomCustomfields }) => { const [customFields, setCustomFields] = useState({}); const [availableUserTags, setAvailableUserTags] = useState([]); + const [permissions, setPermissions] = useState([]); const params = {}; const inputs = {}; @@ -139,9 +140,15 @@ const LivechatEditView = ({ const onChangeText = (key, text) => { params[key] = text; }; + const getPermissions = async() => { + const permissionsArray = await RocketChat.hasPermission([editOmnichannelContact, editLivechatRoomCustomfields], livechat.rid); + setPermissions(permissionsArray); + }; + useEffect(() => { getAgentDepartments(); getCustomFields(); + getPermissions(); }, []); return ( @@ -162,6 +169,7 @@ const LivechatEditView = ({ onChangeText={text => onChangeText('name', text)} onSubmitEditing={() => { inputs.name.focus(); }} theme={theme} + editable={!!permissions[0]} /> onChangeText('email', text)} onSubmitEditing={() => { inputs.phone.focus(); }} theme={theme} + editable={!!permissions[0]} /> {Object.entries(customFields?.visitor || {}).map(([key, value], index, array) => ( ))} onChangeText('topic', text)} onSubmitEditing={() => inputs.tags.focus()} theme={theme} + editable={!!permissions[1]} /> <TextInput @@ -236,6 +248,7 @@ const LivechatEditView = ({ } }} theme={theme} + editable={!!permissions[1]} /> <Chips items={tagParam.map(tag => ({ text: { text: tag }, value: tag }))} @@ -257,6 +270,7 @@ const LivechatEditView = ({ submit(); }} theme={theme} + editable={!!permissions[1]} /> ))} @@ -274,7 +288,9 @@ LivechatEditView.propTypes = { user: PropTypes.object, navigation: PropTypes.object, route: PropTypes.object, - theme: PropTypes.string + theme: PropTypes.string, + editOmnichannelContact: PropTypes.array, + editLivechatRoomCustomfields: PropTypes.array }; LivechatEditView.navigationOptions = ({ title: I18n.t('Livechat_edit') @@ -282,7 +298,9 @@ LivechatEditView.navigationOptions = ({ const mapStateToProps = state => ({ server: state.server.server, - user: getUserSelector(state) + user: getUserSelector(state), + editOmnichannelContact: state.permissions['edit-omnichannel-contact'], + editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields'] }); export default connect(mapStateToProps)(withTheme(LivechatEditView)); diff --git a/app/views/RoomInfoView/index.js b/app/views/RoomInfoView/index.js index a966463bf..6d0918f16 100644 --- a/app/views/RoomInfoView/index.js +++ b/app/views/RoomInfoView/index.js @@ -55,6 +55,8 @@ class RoomInfoView extends React.Component { isMasterDetail: PropTypes.bool, jitsiEnabled: PropTypes.bool, editRoomPermission: PropTypes.array, + editOmnichannelContact: PropTypes.array, + editLivechatRoomCustomfields: PropTypes.array, roles: PropTypes.array } @@ -184,7 +186,9 @@ class RoomInfoView extends React.Component { loadRoom = async() => { const { room: roomState } = this.state; - const { route, editRoomPermission } = this.props; + const { + route, editRoomPermission, editOmnichannelContact, editLivechatRoomCustomfields + } = this.props; let room = route.params?.room; if (room && room.observe) { this.roomObservable = room.observe(); @@ -204,8 +208,10 @@ class RoomInfoView extends React.Component { } } - const permissions = await RocketChat.hasPermission([editRoomPermission], room.rid); - if (permissions[0]) { + const permissionToEdit = this.isLivechat ? [editOmnichannelContact, editLivechatRoomCustomfields] : [editRoomPermission]; + + const permissions = await RocketChat.hasPermission(permissionToEdit, room.rid); + if (permissions.some(Boolean)) { this.setState({ showEdit: true }, () => this.setHeader()); } } @@ -370,6 +376,8 @@ const mapStateToProps = state => ({ isMasterDetail: state.app.isMasterDetail, jitsiEnabled: state.settings.Jitsi_Enabled || false, editRoomPermission: state.permissions['edit-room'], + editOmnichannelContact: state.permissions['edit-omnichannel-contact'], + editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields'], roles: state.roles });