Skip to content

Commit 5fb2958

Browse files
committed
Show global pack selector in settings
1 parent d05c03c commit 5fb2958

File tree

4 files changed

+94
-4
lines changed

4 files changed

+94
-4
lines changed

src/app/molecules/image-pack/ImagePack.jsx

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, {
2-
useState, useMemo, useReducer,
2+
useState, useMemo, useReducer, useEffect,
33
} from 'react';
44
import PropTypes from 'prop-types';
55
import './ImagePack.scss';
@@ -12,6 +12,7 @@ import Button from '../../atoms/button/Button';
1212
import Text from '../../atoms/text/Text';
1313
import Input from '../../atoms/input/Input';
1414
import Checkbox from '../../atoms/button/Checkbox';
15+
import { MenuHeader } from '../../atoms/context-menu/ContextMenu';
1516

1617
import { ImagePack as ImagePackBuilder } from '../../organisms/emoji-board/custom-emoji';
1718
import { confirmDialog } from '../confirm-dialog/ConfirmDialog';
@@ -394,6 +395,75 @@ function ImagePackUser() {
394395
);
395396
}
396397

398+
function useGlobalImagePack() {
399+
const [, forceUpdate] = useReducer((count) => count + 1, 0);
400+
const mx = initMatrix.matrixClient;
401+
402+
const roomIdToStateKeys = new Map();
403+
const globalContent = mx.getAccountData('im.ponies.emote_rooms')?.getContent() ?? { rooms: {} };
404+
const { rooms } = globalContent;
405+
406+
Object.keys(rooms).forEach((roomId) => {
407+
if (typeof rooms[roomId] !== 'object') return;
408+
const room = mx.getRoom(roomId);
409+
const stateKeys = Object.keys(rooms[roomId]);
410+
if (!room || stateKeys.length === 0) return;
411+
roomIdToStateKeys.set(roomId, stateKeys);
412+
});
413+
414+
useEffect(() => {
415+
const handleEvent = (event) => {
416+
if (event.getType() === 'im.ponies.emote_rooms') forceUpdate();
417+
};
418+
mx.addListener('accountData', handleEvent);
419+
return () => {
420+
mx.removeListener('accountData', handleEvent);
421+
};
422+
}, []);
423+
424+
return roomIdToStateKeys;
425+
}
426+
427+
function ImagePackGlobal() {
428+
const mx = initMatrix.matrixClient;
429+
const roomIdToStateKeys = useGlobalImagePack();
430+
431+
const handleChange = (roomId, stateKey) => {
432+
removeGlobalImagePack(mx, roomId, stateKey);
433+
};
434+
435+
return (
436+
<div className="image-pack-global">
437+
<MenuHeader>Global packs</MenuHeader>
438+
<div>
439+
{
440+
roomIdToStateKeys.size > 0
441+
? [...roomIdToStateKeys].map(([roomId, stateKeys]) => {
442+
const room = mx.getRoom(roomId);
443+
return (
444+
stateKeys.map((stateKey) => {
445+
const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey);
446+
const pack = ImagePackBuilder.parsePack(data?.getId(), data?.getContent());
447+
if (!pack) return null;
448+
return (
449+
<div className="image-pack__global" key={pack.id}>
450+
<Checkbox variant="positive" onToggle={() => handleChange(roomId, stateKey)} isActive />
451+
<div>
452+
<Text variant="b2">{pack.displayName ?? 'Unknown'}</Text>
453+
<Text variant="b3">{room.name}</Text>
454+
</div>
455+
</div>
456+
);
457+
})
458+
);
459+
})
460+
: <div className="image-pack-global__empty"><Text>No global packs</Text></div>
461+
}
462+
</div>
463+
</div>
464+
);
465+
}
466+
397467
export default ImagePack;
398468

399-
export { ImagePackUser };
469+
export { ImagePackUser, ImagePackGlobal };

src/app/molecules/image-pack/ImagePack.scss

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,17 @@
3131
gap: var(--sp-normal);
3232
}
3333
}
34+
35+
.image-pack-global {
36+
&__empty {
37+
text-align: center;
38+
padding: var(--sp-extra-loose) var(--sp-normal);
39+
}
40+
& .image-pack__global {
41+
padding: 0 var(--sp-normal);
42+
padding-bottom: var(--sp-normal);
43+
&:first-child {
44+
padding-top: var(--sp-normal);
45+
}
46+
}
47+
}

src/app/organisms/emoji-board/custom-emoji.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ function getGlobalImagePacks(mx) {
153153
const packs = roomIds.flatMap((roomId) => {
154154
if (typeof rooms[roomId] !== 'object') return [];
155155
const room = mx.getRoom(roomId);
156+
if (!room) return [];
156157
const stateKeys = Object.keys(rooms[roomId]);
157158

158159
return stateKeys.map((stateKey) => {

src/app/organisms/settings/Settings.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import PopupWindow from '../../molecules/popup-window/PopupWindow';
2424
import SettingTile from '../../molecules/setting-tile/SettingTile';
2525
import ImportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ImportE2ERoomKeys';
2626
import ExportE2ERoomKeys from '../../molecules/import-export-e2e-room-keys/ExportE2ERoomKeys';
27-
import { ImagePackUser } from '../../molecules/image-pack/ImagePack';
27+
import { ImagePackUser, ImagePackGlobal } from '../../molecules/image-pack/ImagePack';
2828

2929
import ProfileEditor from '../profile-editor/ProfileEditor';
3030
import CrossSigning from './CrossSigning';
@@ -172,7 +172,12 @@ function NotificationsSection() {
172172
}
173173

174174
function EmojiSection() {
175-
return <div className="settings-emoji__card"><ImagePackUser /></div>;
175+
return (
176+
<>
177+
<div className="settings-emoji__card"><ImagePackUser /></div>
178+
<div className="settings-emoji__card"><ImagePackGlobal /></div>
179+
</>
180+
);
176181
}
177182

178183
function SecuritySection() {

0 commit comments

Comments
 (0)