@@ -20,6 +20,7 @@ import RightPanelStore from "../../../../../src/stores/right-panel/RightPanelSto
20
20
import { RightPanelPhases } from "../../../../../src/stores/right-panel/RightPanelStorePhases" ;
21
21
import { UPDATE_EVENT } from "../../../../../src/stores/AsyncStore" ;
22
22
import { Action } from "../../../../../src/dispatcher/actions" ;
23
+ import ResizeNotifier from "../../../../../src/utils/ResizeNotifier.ts" ;
23
24
24
25
describe ( "<PinnedMessageBanner />" , ( ) => {
25
26
const userId = "@alice:server.org" ;
@@ -28,10 +29,12 @@ describe("<PinnedMessageBanner />", () => {
28
29
let mockClient : MatrixClient ;
29
30
let room : Room ;
30
31
let permalinkCreator : RoomPermalinkCreator ;
32
+ let resizeNotifier : ResizeNotifier ;
31
33
beforeEach ( ( ) => {
32
34
mockClient = stubClient ( ) ;
33
35
room = new Room ( roomId , mockClient , userId ) ;
34
36
permalinkCreator = new RoomPermalinkCreator ( room ) ;
37
+ resizeNotifier = new ResizeNotifier ( ) ;
35
38
jest . spyOn ( dis , "dispatch" ) . mockReturnValue ( undefined ) ;
36
39
} ) ;
37
40
@@ -77,7 +80,7 @@ describe("<PinnedMessageBanner />", () => {
77
80
*/
78
81
function renderBanner ( ) {
79
82
return render (
80
- < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } /> ,
83
+ < PinnedMessageBanner permalinkCreator = { permalinkCreator } room = { room } resizeNotifier = { resizeNotifier } /> ,
81
84
withClientContextRenderOptions ( mockClient ) ,
82
85
) ;
83
86
}
@@ -145,7 +148,9 @@ describe("<PinnedMessageBanner />", () => {
145
148
event3 . getId ( ) ! ,
146
149
] ) ;
147
150
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
+ ) ;
149
154
await expect ( screen . findByText ( "Third pinned message" ) ) . resolves . toBeVisible ( ) ;
150
155
expect ( asFragment ( ) ) . toMatchSnapshot ( ) ;
151
156
} ) ;
@@ -206,6 +211,42 @@ describe("<PinnedMessageBanner />", () => {
206
211
expect ( asFragment ( ) ) . toMatchSnapshot ( ) ;
207
212
} ) ;
208
213
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
+
209
250
describe ( "Right button" , ( ) => {
210
251
beforeEach ( ( ) => {
211
252
jest . spyOn ( pinnedEventHooks , "usePinnedEvents" ) . mockReturnValue ( [ event1 . getId ( ) ! , event2 . getId ( ) ! ] ) ;
@@ -217,6 +258,8 @@ describe("<PinnedMessageBanner />", () => {
217
258
jest . spyOn ( RightPanelStore . instance , "isOpenForRoom" ) . mockReturnValue ( false ) ;
218
259
219
260
renderBanner ( ) ;
261
+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
262
+
220
263
expect ( screen . getByRole ( "button" , { name : "View all" } ) ) . toBeVisible ( ) ;
221
264
} ) ;
222
265
@@ -228,6 +271,8 @@ describe("<PinnedMessageBanner />", () => {
228
271
} ) ;
229
272
230
273
renderBanner ( ) ;
274
+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
275
+
231
276
expect ( screen . getByRole ( "button" , { name : "View all" } ) ) . toBeVisible ( ) ;
232
277
} ) ;
233
278
@@ -239,6 +284,8 @@ describe("<PinnedMessageBanner />", () => {
239
284
} ) ;
240
285
241
286
renderBanner ( ) ;
287
+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
288
+
242
289
expect ( screen . getByRole ( "button" , { name : "Close list" } ) ) . toBeVisible ( ) ;
243
290
} ) ;
244
291
@@ -263,6 +310,7 @@ describe("<PinnedMessageBanner />", () => {
263
310
} ) ;
264
311
265
312
renderBanner ( ) ;
313
+ await expect ( screen . findByText ( "Second pinned message" ) ) . resolves . toBeVisible ( ) ;
266
314
expect ( screen . getByRole ( "button" , { name : "Close list" } ) ) . toBeVisible ( ) ;
267
315
268
316
jest . spyOn ( RightPanelStore . instance , "isOpenForRoom" ) . mockReturnValue ( false ) ;
0 commit comments