From 188f122315f66de08bee32c552c4799e583bb7e2 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Wed, 13 Sep 2023 16:03:33 -0500 Subject: [PATCH] wip --- app/queries/servers/role.ts | 14 ++++++++++++++ .../public_or_private_channel.tsx | 10 ++++++++-- app/screens/channel_info/channel_info.tsx | 3 +++ app/screens/channel_info/index.ts | 10 +++++++++- app/screens/channel_info/options/index.tsx | 4 +++- .../create_or_edit_channel/channel_info_form.tsx | 4 +--- .../create_or_edit_channel.tsx | 4 ++-- 7 files changed, 40 insertions(+), 9 deletions(-) diff --git a/app/queries/servers/role.ts b/app/queries/servers/role.ts index e3ac7f1dd..ae1c05d81 100644 --- a/app/queries/servers/role.ts +++ b/app/queries/servers/role.ts @@ -101,3 +101,17 @@ export function observeCanManageChannelMembers(database: Database, channelId: st distinctUntilChanged(), ); } + +export function observeCanManageChannelSettings(database: Database, channelId: string, user: UserModel) { + return observeChannel(database, channelId).pipe( + switchMap((c) => { + if (!c || c.deleteAt !== 0 || isDMorGM(c)) { + return of$(false); + } + + const permission = c.type === General.OPEN_CHANNEL ? Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES : Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES; + return observePermissionForChannel(database, c, user, permission, true); + }), + distinctUntilChanged(), + ); +} diff --git a/app/screens/channel/channel_post_list/intro/public_or_private_channel/public_or_private_channel.tsx b/app/screens/channel/channel_post_list/intro/public_or_private_channel/public_or_private_channel.tsx index 300498256..87527ea10 100644 --- a/app/screens/channel/channel_post_list/intro/public_or_private_channel/public_or_private_channel.tsx +++ b/app/screens/channel/channel_post_list/intro/public_or_private_channel/public_or_private_channel.tsx @@ -74,14 +74,20 @@ const PublicOrPrivateChannel = ({channel, creator, roles, theme}: Props) => { }, []); const canManagePeople = useMemo(() => { + if (channel.deleteAt !== 0) { + return false; + } const permission = channel.type === General.OPEN_CHANNEL ? Permissions.MANAGE_PUBLIC_CHANNEL_MEMBERS : Permissions.MANAGE_PRIVATE_CHANNEL_MEMBERS; return hasPermission(roles, permission); - }, [channel.type, roles]); + }, [channel.type, roles, channel.deleteAt]); const canSetHeader = useMemo(() => { + if (channel.deleteAt !== 0) { + return false; + } const permission = channel.type === General.OPEN_CHANNEL ? Permissions.MANAGE_PUBLIC_CHANNEL_PROPERTIES : Permissions.MANAGE_PRIVATE_CHANNEL_PROPERTIES; return hasPermission(roles, permission); - }, [channel.type, roles]); + }, [channel.type, roles, channel.deleteAt]); const createdBy = useMemo(() => { const id = channel.type === General.OPEN_CHANNEL ? t('intro.public_channel') : t('intro.private_channel'); diff --git a/app/screens/channel_info/channel_info.tsx b/app/screens/channel_info/channel_info.tsx index c71c8df98..63292e136 100644 --- a/app/screens/channel_info/channel_info.tsx +++ b/app/screens/channel_info/channel_info.tsx @@ -30,6 +30,7 @@ type Props = { canEnableDisableCalls: boolean; isCallsEnabledInChannel: boolean; canManageMembers: boolean; + canManageSettings: boolean; } const edges: Edge[] = ['bottom', 'left', 'right']; @@ -57,6 +58,7 @@ const ChannelInfo = ({ canEnableDisableCalls, isCallsEnabledInChannel, canManageMembers, + canManageSettings, }: Props) => { const theme = useTheme(); const serverUrl = useServerUrl(); @@ -103,6 +105,7 @@ const ChannelInfo = ({ type={type} callsEnabled={callsAvailable} canManageMembers={canManageMembers} + canManageSettings={canManageSettings} /> {canEnableDisableCalls && diff --git a/app/screens/channel_info/index.ts b/app/screens/channel_info/index.ts index f0456e686..3cdbd799f 100644 --- a/app/screens/channel_info/index.ts +++ b/app/screens/channel_info/index.ts @@ -10,7 +10,7 @@ import {observeIsCallsEnabledInChannel} from '@calls/observers'; import {observeCallsConfig} from '@calls/state'; import {withServerUrl} from '@context/server'; import {observeCurrentChannel} from '@queries/servers/channel'; -import {observeCanManageChannelMembers} from '@queries/servers/role'; +import {observeCanManageChannelMembers, observeCanManageChannelSettings} from '@queries/servers/role'; import { observeConfigValue, observeCurrentChannelId, @@ -105,11 +105,19 @@ const enhanced = withObservables([], ({serverUrl, database}: Props) => { switchMap(([u, cId]) => (u ? observeCanManageChannelMembers(database, cId, u) : of$(false))), distinctUntilChanged(), ); + + const canManageSettings = currentUser.pipe( + combineLatestWith(channelId), + switchMap(([u, cId]) => (u ? observeCanManageChannelSettings(database, cId, u) : of$(false))), + distinctUntilChanged(), + ); + return { type, canEnableDisableCalls, isCallsEnabledInChannel, canManageMembers, + canManageSettings, }; }); diff --git a/app/screens/channel_info/options/index.tsx b/app/screens/channel_info/options/index.tsx index dab34eefb..816fc2867 100644 --- a/app/screens/channel_info/options/index.tsx +++ b/app/screens/channel_info/options/index.tsx @@ -20,6 +20,7 @@ type Props = { type?: ChannelType; callsEnabled: boolean; canManageMembers: boolean; + canManageSettings: boolean; } const Options = ({ @@ -27,6 +28,7 @@ const Options = ({ type, callsEnabled, canManageMembers, + canManageSettings, }: Props) => { const isDMorGM = isTypeDMorGM(type); @@ -50,7 +52,7 @@ const Options = ({ testID='channel_info.options.copy_channel_link.option' /> } - {type !== General.DM_CHANNEL && type !== General.GM_CHANNEL && + {canManageSettings && } diff --git a/app/screens/create_or_edit_channel/channel_info_form.tsx b/app/screens/create_or_edit_channel/channel_info_form.tsx index 0ce2e2873..6267f3a83 100644 --- a/app/screens/create_or_edit_channel/channel_info_form.tsx +++ b/app/screens/create_or_edit_channel/channel_info_form.tsx @@ -231,9 +231,7 @@ export default function ChannelInfoForm({ const spaceOnTop = otherElementsSize - scrollPosition - AUTOCOMPLETE_ADJUST; const spaceOnBottom = (workingSpace + scrollPosition) - (otherElementsSize + headerFieldHeight + BOTTOM_AUTOCOMPLETE_SEPARATION); - const autocompletePosition = spaceOnBottom > spaceOnTop ? - (otherElementsSize + headerFieldHeight) - scrollPosition : - (workingSpace + scrollPosition + AUTOCOMPLETE_ADJUST + keyboardOverlap) - otherElementsSize; + const autocompletePosition = spaceOnBottom > spaceOnTop ? (otherElementsSize + headerFieldHeight) - scrollPosition : (workingSpace + scrollPosition + AUTOCOMPLETE_ADJUST + keyboardOverlap) - otherElementsSize; const autocompleteAvailableSpace = spaceOnBottom > spaceOnTop ? spaceOnBottom : spaceOnTop; const growDown = spaceOnBottom > spaceOnTop; diff --git a/app/screens/create_or_edit_channel/create_or_edit_channel.tsx b/app/screens/create_or_edit_channel/create_or_edit_channel.tsx index bfc465735..2b64ed9c8 100644 --- a/app/screens/create_or_edit_channel/create_or_edit_channel.tsx +++ b/app/screens/create_or_edit_channel/create_or_edit_channel.tsx @@ -206,8 +206,8 @@ const CreateOrEditChannel = ({ id: channel.id, type: channel.type, display_name: isDirect(channel) ? channel.displayName : displayName, - purpose, - header, + purpose: isDirect(channel) ? null : purpose, + header: isDirect(channel) ? null : header, } as Channel; setCanSave(false);