From 6b4100d5174ad294bbd7bffa244304878a7d226a Mon Sep 17 00:00:00 2001 From: enahum Date: Mon, 27 Nov 2017 17:30:26 -0300 Subject: [PATCH] Add general util to handle actions that are forbidden (#1206) --- app/actions/views/channel_add_members.js | 4 ++-- app/actions/views/channel_members.js | 4 ++-- .../channel_add_members.js | 7 +++++-- .../channel_members/channel_members.js | 7 +++++-- app/utils/general.js | 21 +++++++++++++++++++ 5 files changed, 35 insertions(+), 8 deletions(-) diff --git a/app/actions/views/channel_add_members.js b/app/actions/views/channel_add_members.js index 2e0dd4d7c..1179ee8a2 100644 --- a/app/actions/views/channel_add_members.js +++ b/app/actions/views/channel_add_members.js @@ -8,9 +8,9 @@ export function handleAddChannelMembers(channelId, members) { try { const requests = members.map((m) => dispatch(addChannelMember(channelId, m, getState))); - await Promise.all(requests); + return await Promise.all(requests); } catch (error) { - // should be handled by global error handling + return error; } }; } diff --git a/app/actions/views/channel_members.js b/app/actions/views/channel_members.js index 68473cb15..0d0b07867 100644 --- a/app/actions/views/channel_members.js +++ b/app/actions/views/channel_members.js @@ -8,9 +8,9 @@ export function handleRemoveChannelMembers(channelId, members) { try { const requests = members.map((m) => dispatch(removeChannelMember(channelId, m, getState))); - await Promise.all(requests); + return await Promise.all(requests); } catch (error) { - // should be handled by global error handling + return error; } }; } diff --git a/app/screens/channel_add_members/channel_add_members.js b/app/screens/channel_add_members/channel_add_members.js index 451fbb0e8..4fbeb3c51 100644 --- a/app/screens/channel_add_members/channel_add_members.js +++ b/app/screens/channel_add_members/channel_add_members.js @@ -15,6 +15,7 @@ import CustomList from 'app/components/custom_list'; import UserListRow from 'app/components/custom_list/user_list_row'; import SearchBar from 'app/components/search_bar'; import StatusBar from 'app/components/status_bar'; +import {alertErrorIfInvalidPermissions} from 'app/utils/general'; import {createMembersSections, loadingText, markSelectedProfiles} from 'app/utils/member_list'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; @@ -144,7 +145,7 @@ class ChannelAddMembers extends PureComponent { }); }; - handleAddMembersPress = () => { + handleAddMembersPress = async () => { const {selectedMembers} = this.state; const {actions, currentChannel} = this.props; const membersToAdd = Object.keys(selectedMembers).filter((m) => selectedMembers[m]); @@ -154,7 +155,9 @@ class ChannelAddMembers extends PureComponent { return; } - actions.handleAddChannelMembers(currentChannel.id, membersToAdd); + alertErrorIfInvalidPermissions( + await actions.handleAddChannelMembers(currentChannel.id, membersToAdd) + ); }; handleRowSelect = (id) => { diff --git a/app/screens/channel_members/channel_members.js b/app/screens/channel_members/channel_members.js index 019c7e626..efc88ecf6 100644 --- a/app/screens/channel_members/channel_members.js +++ b/app/screens/channel_members/channel_members.js @@ -14,6 +14,7 @@ import Loading from 'app/components/loading'; import CustomList from 'app/components/custom_list'; import SearchBar from 'app/components/search_bar'; import StatusBar from 'app/components/status_bar'; +import {alertErrorIfInvalidPermissions} from 'app/utils/general'; import {createMembersSections, loadingText, markSelectedProfiles} from 'app/utils/member_list'; import UserListRow from 'app/components/custom_list/user_list_row'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; @@ -228,9 +229,11 @@ class ChannelMembers extends PureComponent { } }; - removeMembers = (membersToRemove) => { + removeMembers = async (membersToRemove) => { const {actions, currentChannel} = this.props; - actions.handleRemoveChannelMembers(currentChannel.id, membersToRemove); + alertErrorIfInvalidPermissions( + await actions.handleRemoveChannelMembers(currentChannel.id, membersToRemove) + ); }; renderMemberRow = (props) => { diff --git a/app/utils/general.js b/app/utils/general.js index 1b460e76b..b7df87a9f 100644 --- a/app/utils/general.js +++ b/app/utils/general.js @@ -11,6 +11,27 @@ export function alertErrorWithFallback(intl, error, fallback, values) { Alert.alert('', msg); } +export function alertErrorIfInvalidPermissions(result) { + function isForbidden(data) { + const {error} = data; + return error && error.status_code === 403; + } + + let error = null; + if (Array.isArray(result)) { + const item = result.find((r) => isForbidden(r)); + if (item) { + error = item.error; + } + } else if (isForbidden(result)) { + error = result.error; + } + + if (error) { + Alert.alert(error.message); + } +} + export function emptyFunction() { return; }