From 49da2166559841c9233c5a37e47859e152e27640 Mon Sep 17 00:00:00 2001 From: Ajay Bura <32841439+ajbura@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:52:38 +0530 Subject: [PATCH] support room v12 creators power --- .../image-pack-view/RoomImagePack.tsx | 9 +- src/app/components/message/Reply.tsx | 11 +- src/app/components/room-intro/RoomIntro.tsx | 2 +- .../components/user-profile/CreatorChip.tsx | 101 ++++++++++++++++++ src/app/components/user-profile/PowerChip.tsx | 47 +++++--- .../user-profile/UserRoomProfile.tsx | 36 ++++--- .../developer-tools/StateEventEditor.tsx | 10 +- .../emojis-stickers/RoomPacks.tsx | 10 +- .../common-settings/general/RoomAddress.tsx | 22 ++-- .../general/RoomEncryption.tsx | 14 +-- .../general/RoomHistoryVisibility.tsx | 14 +-- .../common-settings/general/RoomJoinRules.tsx | 13 +-- .../common-settings/general/RoomProfile.tsx | 14 ++- .../common-settings/general/RoomPublish.tsx | 13 ++- .../common-settings/general/RoomUpgrade.tsx | 13 +-- .../common-settings/members/Members.tsx | 25 ++--- .../permissions/PermissionGroups.tsx | 30 +++--- .../common-settings/permissions/Powers.tsx | 7 +- .../permissions/PowersEditor.tsx | 23 ++-- src/app/features/lobby/HierarchyItemMenu.tsx | 22 +++- src/app/features/lobby/Lobby.tsx | 63 +++++------ src/app/features/lobby/LobbyHeader.tsx | 21 ++-- src/app/features/lobby/SpaceHierarchy.tsx | 59 +++++----- .../message-search/SearchResultGroup.tsx | 39 ++++--- src/app/features/room-nav/RoomNavItem.tsx | 10 +- .../room-settings/general/General.tsx | 20 ++-- .../room-settings/permissions/Permissions.tsx | 21 ++-- src/app/features/room/MembersDrawer.tsx | 27 ++--- src/app/features/room/RoomInput.tsx | 31 ++++-- src/app/features/room/RoomTimeline.tsx | 70 ++++++------ src/app/features/room/RoomView.tsx | 21 ++-- src/app/features/room/RoomViewHeader.tsx | 10 +- src/app/features/room/message/Message.tsx | 18 ++-- .../room/room-pin-menu/RoomPinMenu.tsx | 91 +++++++++++----- .../space-settings/general/General.tsx | 16 +-- .../permissions/Permissions.tsx | 21 ++-- src/app/hooks/useMemberPowerCompare.ts | 28 +++++ src/app/hooks/useMemberPowerTag.ts | 87 +++++++++++++++ src/app/hooks/useMemberSort.ts | 19 +++- src/app/hooks/usePowerLevelTags.ts | 99 +++-------------- src/app/hooks/usePowerLevels.ts | 85 +-------------- src/app/hooks/useRoomCreators.ts | 13 ++- src/app/hooks/useRoomCreatorsTag.ts | 8 ++ src/app/pages/client/inbox/Notifications.tsx | 39 ++++--- src/app/pages/client/sidebar/SpaceTabs.tsx | 10 +- src/app/pages/client/space/Space.tsx | 10 +- src/types/matrix/room.ts | 12 +++ 47 files changed, 800 insertions(+), 584 deletions(-) create mode 100644 src/app/components/user-profile/CreatorChip.tsx create mode 100644 src/app/hooks/useMemberPowerCompare.ts create mode 100644 src/app/hooks/useMemberPowerTag.ts create mode 100644 src/app/hooks/useRoomCreatorsTag.ts diff --git a/src/app/components/image-pack-view/RoomImagePack.tsx b/src/app/components/image-pack-view/RoomImagePack.tsx index 9dd45c1f..92b4ff21 100644 --- a/src/app/components/image-pack-view/RoomImagePack.tsx +++ b/src/app/components/image-pack-view/RoomImagePack.tsx @@ -1,12 +1,14 @@ import React, { useCallback, useMemo } from 'react'; import { Room } from 'matrix-js-sdk'; -import { usePowerLevels, usePowerLevelsAPI } from '../../hooks/usePowerLevels'; +import { usePowerLevels } from '../../hooks/usePowerLevels'; import { useMatrixClient } from '../../hooks/useMatrixClient'; import { ImagePackContent } from './ImagePackContent'; import { ImagePack, PackContent } from '../../plugins/custom-emoji'; import { StateEvent } from '../../../types/matrix/room'; import { useRoomImagePack } from '../../hooks/useImagePacks'; import { randomStr } from '../../utils/common'; +import { useRoomPermissions } from '../../hooks/useRoomPermissions'; +import { useRoomCreators } from '../../hooks/useRoomCreators'; type RoomImagePackProps = { room: Room; @@ -17,9 +19,10 @@ export function RoomImagePack({ room, stateKey }: RoomImagePackProps) { const mx = useMatrixClient(); const userId = mx.getUserId()!; const powerLevels = usePowerLevels(room); + const creators = useRoomCreators(room); - const { getPowerLevel, canSendStateEvent } = usePowerLevelsAPI(powerLevels); - const canEditImagePack = canSendStateEvent(StateEvent.PoniesRoomEmotes, getPowerLevel(userId)); + const permissions = useRoomPermissions(creators, powerLevels); + const canEditImagePack = permissions.stateEvent(StateEvent.PoniesRoomEmotes, userId); const fallbackPack = useMemo(() => { const fakePackId = randomStr(4); diff --git a/src/app/components/message/Reply.tsx b/src/app/components/message/Reply.tsx index dc92bf83..57bf2af9 100644 --- a/src/app/components/message/Reply.tsx +++ b/src/app/components/message/Reply.tsx @@ -10,8 +10,8 @@ import * as css from './Reply.css'; import { MessageBadEncryptedContent, MessageDeletedContent, MessageFailedContent } from './content'; import { scaleSystemEmoji } from '../../plugins/react-custom-html-parser'; import { useRoomEvent } from '../../hooks/useRoomEvent'; -import { GetPowerLevelTag } from '../../hooks/usePowerLevelTags'; import colorMXID from '../../../util/colorMXID'; +import { GetMemberPowerTag } from '../../hooks/useMemberPowerTag'; type ReplyLayoutProps = { userColor?: string; @@ -57,8 +57,7 @@ type ReplyProps = { replyEventId: string; threadRootId?: string | undefined; onClick?: MouseEventHandler | undefined; - getPowerLevel?: (userId: string) => number; - getPowerLevelTag?: GetPowerLevelTag; + getMemberPowerTag?: GetMemberPowerTag; accessibleTagColors?: Map; legacyUsernameColor?: boolean; }; @@ -71,8 +70,7 @@ export const Reply = as<'div', ReplyProps>( replyEventId, threadRootId, onClick, - getPowerLevel, - getPowerLevelTag, + getMemberPowerTag, accessibleTagColors, legacyUsernameColor, ...props @@ -88,8 +86,7 @@ export const Reply = as<'div', ReplyProps>( const { body } = replyEvent?.getContent() ?? {}; const sender = replyEvent?.getSender(); - const senderPL = sender && getPowerLevel?.(sender); - const powerTag = typeof senderPL === 'number' ? getPowerLevelTag?.(senderPL) : undefined; + const powerTag = sender ? getMemberPowerTag?.(sender) : undefined; const tagColor = powerTag?.color ? accessibleTagColors?.get(powerTag.color) : undefined; const usernameColor = legacyUsernameColor ? colorMXID(sender ?? replyEventId) : tagColor; diff --git a/src/app/components/room-intro/RoomIntro.tsx b/src/app/components/room-intro/RoomIntro.tsx index b02d9f5a..c388efd4 100644 --- a/src/app/components/room-intro/RoomIntro.tsx +++ b/src/app/components/room-intro/RoomIntro.tsx @@ -87,7 +87,7 @@ export const RoomIntro = as<'div', RoomIntroProps>(({ room, ...props }, ref) => {typeof prevRoomId === 'string' && (mx.getRoom(prevRoomId)?.getMyMembership() === Membership.Join ? (