@@ -45,50 +45,53 @@ interface IProps {
4545 onClose ( ) : void ;
4646}
4747
48+ function getPinnedEventIds ( room ?: Room ) : string [ ] {
49+ return room ?. currentState . getStateEvents ( EventType . RoomPinnedEvents , "" ) ?. getContent ( ) ?. pinned ?? [ ] ;
50+ }
51+
4852export const usePinnedEvents = ( room ?: Room ) : string [ ] => {
49- const [ pinnedEvents , setPinnedEvents ] = useState < string [ ] > ( [ ] ) ;
53+ const [ pinnedEvents , setPinnedEvents ] = useState < string [ ] > ( getPinnedEventIds ( room ) ) ;
5054
5155 const update = useCallback (
5256 ( ev ?: MatrixEvent ) => {
53- if ( ! room ) return ;
5457 if ( ev && ev . getType ( ) !== EventType . RoomPinnedEvents ) return ;
55- setPinnedEvents (
56- room . currentState . getStateEvents ( EventType . RoomPinnedEvents , "" ) ?. getContent ( ) ?. pinned || [ ] ,
57- ) ;
58+ setPinnedEvents ( getPinnedEventIds ( room ) ) ;
5859 } ,
5960 [ room ] ,
6061 ) ;
6162
6263 useTypedEventEmitter ( room ?. currentState , RoomStateEvent . Events , update ) ;
6364 useEffect ( ( ) => {
64- update ( ) ;
65+ setPinnedEvents ( getPinnedEventIds ( room ) ) ;
6566 return ( ) => {
6667 setPinnedEvents ( [ ] ) ;
6768 } ;
68- } , [ update ] ) ;
69+ } , [ room ] ) ;
6970 return pinnedEvents ;
7071} ;
7172
72- export const useReadPinnedEvents = ( room : Room ) : Set < string > => {
73+ function getReadPinnedEventIds ( room ?: Room ) : Set < string > {
74+ return new Set ( room . getAccountData ( ReadPinsEventId ) ?. getContent ( ) ?. event_ids ?? [ ] ) ;
75+ }
76+
77+ export const useReadPinnedEvents = ( room ?: Room ) : Set < string > => {
7378 const [ readPinnedEvents , setReadPinnedEvents ] = useState < Set < string > > ( new Set ( ) ) ;
7479
7580 const update = useCallback (
7681 ( ev ?: MatrixEvent ) => {
77- if ( ! room ) return ;
7882 if ( ev && ev . getType ( ) !== ReadPinsEventId ) return ;
79- const readPins = room . getAccountData ( ReadPinsEventId ) ?. getContent ( ) ?. event_ids ;
80- setReadPinnedEvents ( new Set ( readPins || [ ] ) ) ;
83+ setReadPinnedEvents ( getReadPinnedEventIds ( room ) ) ;
8184 } ,
8285 [ room ] ,
8386 ) ;
8487
8588 useTypedEventEmitter ( room , RoomEvent . AccountData , update ) ;
8689 useEffect ( ( ) => {
87- update ( ) ;
90+ setReadPinnedEvents ( getReadPinnedEventIds ( room ) ) ;
8891 return ( ) => {
8992 setReadPinnedEvents ( new Set ( ) ) ;
9093 } ;
91- } , [ update ] ) ;
94+ } , [ room ] ) ;
9295 return readPinnedEvents ;
9396} ;
9497
@@ -157,34 +160,8 @@ const PinnedMessagesCard: React.FC<IProps> = ({ room, onClose, permalinkCreator
157160 null ,
158161 ) ;
159162
160- let content ;
161- if ( ! pinnedEvents ) {
162- content = < Spinner /> ;
163- } else if ( pinnedEvents . length > 0 ) {
164- const onUnpinClicked = async ( event : MatrixEvent ) : Promise < void > => {
165- const pinnedEvents = room . currentState . getStateEvents ( EventType . RoomPinnedEvents , "" ) ;
166- if ( pinnedEvents ?. getContent ( ) ?. pinned ) {
167- const pinned = pinnedEvents . getContent ( ) . pinned ;
168- const index = pinned . indexOf ( event . getId ( ) ) ;
169- if ( index !== - 1 ) {
170- pinned . splice ( index , 1 ) ;
171- await cli . sendStateEvent ( room . roomId , EventType . RoomPinnedEvents , { pinned } , "" ) ;
172- }
173- }
174- } ;
175-
176- // show them in reverse, with latest pinned at the top
177- content = filterBoolean ( pinnedEvents )
178- . reverse ( )
179- . map ( ( ev ) => (
180- < PinnedEventTile
181- key = { ev . getId ( ) }
182- event = { ev }
183- onUnpinClicked = { canUnpin ? ( ) => onUnpinClicked ( ev ) : undefined }
184- permalinkCreator = { permalinkCreator }
185- />
186- ) ) ;
187- } else {
163+ let content : JSX . Element [ ] | JSX . Element | undefined ;
164+ if ( ! pinnedEventIds . length ) {
188165 content = (
189166 < div className = "mx_PinnedMessagesCard_empty_wrapper" >
190167 < div className = "mx_PinnedMessagesCard_empty" >
@@ -215,6 +192,32 @@ const PinnedMessagesCard: React.FC<IProps> = ({ room, onClose, permalinkCreator
215192 </ div >
216193 </ div >
217194 ) ;
195+ } else if ( pinnedEvents ?. length ) {
196+ const onUnpinClicked = async ( event : MatrixEvent ) : Promise < void > => {
197+ const pinnedEvents = room . currentState . getStateEvents ( EventType . RoomPinnedEvents , "" ) ;
198+ if ( pinnedEvents ?. getContent ( ) ?. pinned ) {
199+ const pinned = pinnedEvents . getContent ( ) . pinned ;
200+ const index = pinned . indexOf ( event . getId ( ) ) ;
201+ if ( index !== - 1 ) {
202+ pinned . splice ( index , 1 ) ;
203+ await cli . sendStateEvent ( room . roomId , EventType . RoomPinnedEvents , { pinned } , "" ) ;
204+ }
205+ }
206+ } ;
207+
208+ // show them in reverse, with latest pinned at the top
209+ content = filterBoolean ( pinnedEvents )
210+ . reverse ( )
211+ . map ( ( ev ) => (
212+ < PinnedEventTile
213+ key = { ev . getId ( ) }
214+ event = { ev }
215+ onUnpinClicked = { canUnpin ? ( ) => onUnpinClicked ( ev ) : undefined }
216+ permalinkCreator = { permalinkCreator }
217+ />
218+ ) ) ;
219+ } else {
220+ content = < Spinner /> ;
218221 }
219222
220223 return (
0 commit comments