From 3f7ba561060ddaacc1940f9fdaefb9c914d174e8 Mon Sep 17 00:00:00 2001 From: Ajay Bura Date: Sun, 31 Jul 2022 16:07:17 +0530 Subject: [PATCH] Add checkbox to make pack global --- src/app/molecules/image-pack/ImagePack.jsx | 29 +++++++++++++++++-- src/app/molecules/room-emojis/RoomEmojis.jsx | 2 +- src/app/organisms/emoji-board/custom-emoji.js | 26 ++++++++++++----- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/app/molecules/image-pack/ImagePack.jsx b/src/app/molecules/image-pack/ImagePack.jsx index bf132759..79cc2036 100644 --- a/src/app/molecules/image-pack/ImagePack.jsx +++ b/src/app/molecules/image-pack/ImagePack.jsx @@ -79,7 +79,7 @@ function useRoomImagePack(roomId, stateKey) { const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); const pack = useMemo(() => ( - ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent(), room) + ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent()) ), [room, stateKey]); const sendPackContent = (content) => { @@ -183,10 +183,29 @@ function useImagePackHandles(pack, sendPackContent) { }; } +function addGlobalImagePack(mx, roomId, stateKey) { + const content = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? {}; + if (!content.rooms) content.rooms = {}; + if (!content.rooms[roomId]) content.rooms[roomId] = {}; + content.rooms[roomId][stateKey] = {}; + return mx.setAccountData('im.ponies.emote_rooms', content); +} +function removeGlobalImagePack(mx, roomId, stateKey) { + const content = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? {}; + if (!content.rooms) return Promise.resolve(); + if (!content.rooms[roomId]) return Promise.resolve(); + delete content.rooms[roomId][stateKey]; + if (Object.keys(content.rooms[roomId]).length === 0) { + delete content.rooms[roomId]; + } + return mx.setAccountData('im.ponies.emote_rooms', content); +} + function ImagePack({ roomId, stateKey }) { const mx = initMatrix.matrixClient; const room = mx.getRoom(roomId); const [viewMore, setViewMore] = useState(false); + const [isGlobal, setIsGlobal] = useState(isGlobalPack(roomId, stateKey)); const { pack, sendPackContent } = useRoomImagePack(roomId, stateKey); @@ -200,6 +219,12 @@ function ImagePack({ roomId, stateKey }) { handleAddItem, } = useImagePackHandles(pack, sendPackContent); + const handleGlobalChange = (isG) => { + setIsGlobal(isG); + if (isG) addGlobalImagePack(mx, roomId, stateKey); + else removeGlobalImagePack(mx, roomId, stateKey); + }; + const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0; const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel); @@ -251,7 +276,7 @@ function ImagePack({ roomId, stateKey }) { )}
- +
Use globally Add this pack to your account to use in all rooms. diff --git a/src/app/molecules/room-emojis/RoomEmojis.jsx b/src/app/molecules/room-emojis/RoomEmojis.jsx index 5e2d8651..a70be847 100644 --- a/src/app/molecules/room-emojis/RoomEmojis.jsx +++ b/src/app/molecules/room-emojis/RoomEmojis.jsx @@ -18,7 +18,7 @@ function RoomEmojis({ roomId }) { return true; }); - return usablePacks.map((mEvent) => ( + return usablePacks.reverse().map((mEvent) => ( { const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey); - return ImagePack.parsePack(data?.getId(), data?.getContent(), room); + const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); + if (pack) { + pack.displayName ??= room.name; + pack.avatarUrl ??= room.getMxcAvatarUrl(); + } + return pack; }).filter((pack) => pack !== null); }); @@ -174,6 +176,7 @@ function getUserImagePack(mx) { } const userImagePack = ImagePack.parsePack(mx.getUserId(), accountDataEmoji.event.content); + userImagePack.displayName ??= 'Personal Emoji'; return userImagePack; } @@ -181,7 +184,14 @@ function getRoomImagePacks(room) { const dataEvents = room.currentState.getStateEvents('im.ponies.room_emotes'); return dataEvents - .map((data) => ImagePack.parsePack(data.getId(), data.getContent(), room)) + .map((data) => { + const pack = ImagePack.parsePack(data?.getId(), data?.getContent()); + if (pack) { + pack.displayName ??= room.name; + pack.avatarUrl ??= room.getMxcAvatarUrl(); + } + return pack; + }) .filter((pack) => pack !== null); }