1
1
import React , {
2
- useState , useMemo , useReducer ,
2
+ useState , useMemo , useReducer , useEffect ,
3
3
} from 'react' ;
4
4
import PropTypes from 'prop-types' ;
5
5
import './ImagePack.scss' ;
@@ -12,6 +12,7 @@ import Button from '../../atoms/button/Button';
12
12
import Text from '../../atoms/text/Text' ;
13
13
import Input from '../../atoms/input/Input' ;
14
14
import Checkbox from '../../atoms/button/Checkbox' ;
15
+ import { MenuHeader } from '../../atoms/context-menu/ContextMenu' ;
15
16
16
17
import { ImagePack as ImagePackBuilder } from '../../organisms/emoji-board/custom-emoji' ;
17
18
import { confirmDialog } from '../confirm-dialog/ConfirmDialog' ;
@@ -394,6 +395,75 @@ function ImagePackUser() {
394
395
) ;
395
396
}
396
397
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
+
397
467
export default ImagePack ;
398
468
399
- export { ImagePackUser } ;
469
+ export { ImagePackUser , ImagePackGlobal } ;
0 commit comments