From 4440ad7924a3363f9fb5fa00094591f72af08216 Mon Sep 17 00:00:00 2001 From: Hemang360 Date: Tue, 28 Oct 2025 02:18:38 +0530 Subject: [PATCH] fix: allow room owners to edit retention policy --- .../contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx | 2 +- .../Info/EditRoomInfo/useEditRoomInitialValues.ts | 9 +++++++-- .../Info/EditRoomInfo/useEditRoomPermissions.ts | 6 +++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx index 8b3742c1ed87c..72cb5cd3c779f 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx @@ -229,7 +229,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => const retentionIgnoreThreads = useId(); const showAdvancedSettings = canViewReadOnly || readOnly || canViewArchived || canViewJoinCode || canViewHideSysMes; - const showRetentionPolicy = canEditRoomRetentionPolicy && retentionPolicy?.enabled; + const showRetentionPolicy = canEditRoomRetentionPolicy && retentionPolicy !== undefined; const showAccordion = showAdvancedSettings || showRetentionPolicy; diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts index 5aeb06a3a2114..4ad487d5a3083 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts @@ -4,6 +4,7 @@ import { useMemo } from 'react'; import { msToTimeUnit, TIMEUNIT } from '../../../../../lib/convertTimeUnit'; import { roomCoordinator } from '../../../../../lib/rooms/roomCoordinator'; +import { useRoomSubscription } from '../../../contexts/RoomContext'; import { useRetentionPolicy } from '../../../hooks/useRetentionPolicy'; export type EditRoomInfoFormData = { @@ -33,7 +34,10 @@ export type EditRoomInfoFormData = { export const useEditRoomInitialValues = (room: IRoomWithRetentionPolicy): Partial => { const retentionPolicy = useRetentionPolicy(room); - const canEditRoomRetentionPolicy = usePermission('edit-room-retention-policy', room._id); + const subscription = useRoomSubscription(); + const hasRetentionPermission = usePermission('edit-room-retention-policy', room._id); + const isRoomOwner = Boolean(subscription?.roles?.includes('owner')); + const canEditRoomRetentionPolicy = hasRetentionPermission || isRoomOwner; const { t, ro, archived, topic, description, announcement, joinCodeRequired, sysMes, encrypted, retention, reactWhenReadOnly } = room; @@ -54,7 +58,7 @@ export const useEditRoomInitialValues = (room: IRoomWithRetentionPolicy): Partia hideSysMes: Array.isArray(sysMes) ? !!sysMes?.length : !!sysMes, encrypted, ...(canEditRoomRetentionPolicy && - retentionPolicy?.enabled && { + retentionPolicy && { retentionEnabled: retention?.enabled ?? retentionPolicy.isActive, retentionOverrideGlobal: !!retention?.overrideGlobal, retentionMaxAge: retention?.maxAge ?? msToTimeUnit(TIMEUNIT.days, retentionPolicy.maxAge), @@ -78,6 +82,7 @@ export const useEditRoomInitialValues = (room: IRoomWithRetentionPolicy): Partia encrypted, reactWhenReadOnly, canEditRoomRetentionPolicy, + subscription, ], ); }; diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomPermissions.ts b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomPermissions.ts index 501e92ebaecfd..b9382462643af 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomPermissions.ts +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomPermissions.ts @@ -5,12 +5,14 @@ import { useMemo } from 'react'; import { RoomSettingsEnum } from '../../../../../../definition/IRoomTypeConfig'; import { useTeamInfoQuery } from '../../../../../hooks/useTeamInfoQuery'; import { roomCoordinator } from '../../../../../lib/rooms/roomCoordinator'; +import { useRoomSubscription } from '../../../contexts/RoomContext'; const getCanChangeType = (room: IRoom | IRoomWithRetentionPolicy, canCreateChannel: boolean, canCreateGroup: boolean, isAdmin: boolean) => (!room.default || isAdmin) && ((room.t === 'p' && canCreateChannel) || (room.t === 'c' && canCreateGroup)); export const useEditRoomPermissions = (room: IRoom | IRoomWithRetentionPolicy) => { const isAdmin = useRole('admin'); + const subscription = useRoomSubscription(); const canCreateChannel = usePermission('create-c'); const canCreateGroup = usePermission('create-p'); @@ -28,7 +30,9 @@ export const useEditRoomPermissions = (room: IRoom | IRoomWithRetentionPolicy) = ); const canSetReadOnly = usePermission('set-readonly', room._id); const canSetReactWhenReadOnly = usePermission('set-react-when-readonly', room._id); - const canEditRoomRetentionPolicy = usePermission('edit-room-retention-policy', room._id); + const hasRetentionPermission = usePermission('edit-room-retention-policy', room._id); + const isRoomOwner = Boolean(subscription?.roles?.includes('owner')); + const canEditRoomRetentionPolicy = hasRetentionPermission || isRoomOwner; const canArchiveOrUnarchive = useAtLeastOnePermission( useMemo(() => ['archive-room', 'unarchive-room'], []), room._id,