@@ -20,6 +20,7 @@ import RightPanelStore from "../../../../../src/stores/right-panel/RightPanelSto
2020import { RightPanelPhases } from "../../../../../src/stores/right-panel/RightPanelStorePhases" ;
2121import { UPDATE_EVENT } from "../../../../../src/stores/AsyncStore" ;
2222import { Action } from "../../../../../src/dispatcher/actions" ;
23+ import ResizeNotifier from "../../../../../src/utils/ResizeNotifier.ts" ;
2324
2425describe ( "<PinnedMessageBanner />" , ( ) => {
2526 const userId = "@alice:server.org" ;
@@ -28,10 +29,12 @@ describe("<PinnedMessageBanner />", () => {
2829 let mockClient : MatrixClient ;
2930 let room : Room ;
3031 let permalinkCreator : RoomPermalinkCreator ;
32+ let resizeNotifier : ResizeNotifier ;
3133 beforeEach ( ( ) => {
3234 mockClient = stubClient ( ) ;
3335 room = new Room ( roomId , mockClient , userId ) ;
3436 permalinkCreator = new RoomPermalinkCreator ( room ) ;
37+ resizeNotifier = new ResizeNotifier ( ) ;
3538 jest . spyOn ( dis , "dispatch" ) . mockReturnValue ( undefined ) ;
3639 } ) ;
3740
@@ -77,7 +80,7 @@ describe("<PinnedMessageBanner />", () => {
7780 */
7881 function renderBanner ( ) {
7982 return render (
80- < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } /> ,
83+ < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } resizeNotifier = { resizeNotifier } /> ,
8184 withClientContextRenderOptions ( mockClient ) ,
8285 ) ;
8386 }
@@ -145,7 +148,9 @@ describe("<PinnedMessageBanner />", () => {
145148 event3 . getId ( ) ! ,
146149 ] ) ;
147150 jest . spyOn ( pinnedEventHooks , "useSortedFetchedPinnedEvents" ) . mockReturnValue ( [ event1 , event2 , event3 ] ) ;
148- rerender ( < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } /> ) ;
151+ rerender (
152+ < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } resizeNotifier = { resizeNotifier } /> ,
153+ ) ;
149154 await expect ( screen . findByText ( "Third pinned message" ) ) . resolves . toBeVisible ( ) ;
150155 expect ( asFragment ( ) ) . toMatchSnapshot ( ) ;
151156 } ) ;
@@ -206,6 +211,42 @@ describe("<PinnedMessageBanner />", () => {
206211 expect ( asFragment ( ) ) . toMatchSnapshot ( ) ;
207212 } ) ;
208213
214+ describe ( "Notify the timeline to resize" , ( ) => {
215+ beforeEach ( ( ) => {
216+ jest . spyOn ( resizeNotifier , "notifyTimelineHeightChanged" ) ;
217+ jest . spyOn ( pinnedEventHooks , "usePinnedEvents" ) . mockReturnValue ( [ event1 . getId ( ) ! , event2 . getId ( ) ! ] ) ;
218+ jest . spyOn ( pinnedEventHooks , "useSortedFetchedPinnedEvents" ) . mockReturnValue ( [ event1 , event2 ] ) ;
219+ } ) ;
220+
221+ it ( "should notify the timeline to resize when we display the banner" , async ( ) => {
222+ renderBanner ( ) ;
223+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
224+ // The banner is displayed, so we need to resize the timeline
225+ expect ( resizeNotifier . notifyTimelineHeightChanged ) . toHaveBeenCalledTimes ( 1 ) ;
226+
227+ await userEvent . click ( screen . getByRole ( "button" , { name : "View the pinned message in the timeline." } ) ) ;
228+ await expect ( screen . findByText ( "First pinned message" ) ) . resolves . toBeVisible ( ) ;
229+ // The banner is already displayed, so we don't need to resize the timeline
230+ expect ( resizeNotifier . notifyTimelineHeightChanged ) . toHaveBeenCalledTimes ( 1 ) ;
231+ } ) ;
232+
233+ it ( "should notify the timeline to resize when we hide the banner" , async ( ) => {
234+ const { rerender } = renderBanner ( ) ;
235+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
236+ // The banner is displayed, so we need to resize the timeline
237+ expect ( resizeNotifier . notifyTimelineHeightChanged ) . toHaveBeenCalledTimes ( 1 ) ;
238+
239+ // The banner has no event to display and is hidden
240+ jest . spyOn ( pinnedEventHooks , "usePinnedEvents" ) . mockReturnValue ( [ ] ) ;
241+ jest . spyOn ( pinnedEventHooks , "useSortedFetchedPinnedEvents" ) . mockReturnValue ( [ ] ) ;
242+ rerender (
243+ < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } resizeNotifier = { resizeNotifier } /> ,
244+ ) ;
245+ // The timeline should be resized
246+ expect ( resizeNotifier . notifyTimelineHeightChanged ) . toHaveBeenCalledTimes ( 2 ) ;
247+ } ) ;
248+ } ) ;
249+
209250 describe ( "Right button" , ( ) => {
210251 beforeEach ( ( ) => {
211252 jest . spyOn ( pinnedEventHooks , "usePinnedEvents" ) . mockReturnValue ( [ event1 . getId ( ) ! , event2 . getId ( ) ! ] ) ;
@@ -217,6 +258,8 @@ describe("<PinnedMessageBanner />", () => {
217258 jest . spyOn ( RightPanelStore . instance , "isOpenForRoom" ) . mockReturnValue ( false ) ;
218259
219260 renderBanner ( ) ;
261+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
262+
220263 expect ( screen . getByRole ( "button" , { name : "View all" } ) ) . toBeVisible ( ) ;
221264 } ) ;
222265
@@ -228,6 +271,8 @@ describe("<PinnedMessageBanner />", () => {
228271 } ) ;
229272
230273 renderBanner ( ) ;
274+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
275+
231276 expect ( screen . getByRole ( "button" , { name : "View all" } ) ) . toBeVisible ( ) ;
232277 } ) ;
233278
@@ -239,6 +284,8 @@ describe("<PinnedMessageBanner />", () => {
239284 } ) ;
240285
241286 renderBanner ( ) ;
287+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
288+
242289 expect ( screen . getByRole ( "button" , { name : "Close list" } ) ) . toBeVisible ( ) ;
243290 } ) ;
244291
@@ -263,6 +310,7 @@ describe("<PinnedMessageBanner />", () => {
263310 } ) ;
264311
265312 renderBanner ( ) ;
313+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
266314 expect ( screen . getByRole ( "button" , { name : "Close list" } ) ) . toBeVisible ( ) ;
267315
268316 jest . spyOn ( RightPanelStore . instance , "isOpenForRoom" ) . mockReturnValue ( false ) ;
0 commit comments