Skip to content

Commit 41686bb

Browse files
authored
Always display last pinned message on the banner (#12945)
* Fix when an event is pinned and the banner displays the correct event. Fix when an event is pinned and the banner displays the good event. * Update e2e tests
1 parent 1ac533e commit 41686bb

File tree

4 files changed

+95
-11
lines changed

4 files changed

+95
-11
lines changed

playwright/e2e/pinned-messages/pinned-messages.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,24 +103,24 @@ test.describe("Pinned messages", () => {
103103
await util.receiveMessages(room1, ["Msg1", "Msg2"]);
104104
await util.pinMessages(["Msg1", "Msg2"]);
105105

106-
await util.assertMessageInBanner("Msg1");
107-
await expect(util.getBanner()).toMatchScreenshot("pinned-message-banner-2-Msg1.png");
108-
109-
await util.getBanner().click();
110106
await util.assertMessageInBanner("Msg2");
111107
await expect(util.getBanner()).toMatchScreenshot("pinned-message-banner-2-Msg2.png");
112108

113109
await util.getBanner().click();
114110
await util.assertMessageInBanner("Msg1");
115111
await expect(util.getBanner()).toMatchScreenshot("pinned-message-banner-2-Msg1.png");
112+
113+
await util.getBanner().click();
114+
await util.assertMessageInBanner("Msg2");
115+
await expect(util.getBanner()).toMatchScreenshot("pinned-message-banner-2-Msg2.png");
116116
});
117117

118118
test("should display 4 messages in the banner", async ({ page, app, room1, util }) => {
119119
await util.goTo(room1);
120120
await util.receiveMessages(room1, ["Msg1", "Msg2", "Msg3", "Msg4"]);
121121
await util.pinMessages(["Msg1", "Msg2", "Msg3", "Msg4"]);
122122

123-
for (const msg of ["Msg1", "Msg4", "Msg3", "Msg2"]) {
123+
for (const msg of ["Msg4", "Msg3", "Msg2", "Msg1"]) {
124124
await util.assertMessageInBanner(msg);
125125
await expect(util.getBanner()).toMatchScreenshot(`pinned-message-banner-4-${msg}.png`);
126126
await util.getBanner().click();

src/components/views/rooms/PinnedMessageBanner.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,9 @@ export function PinnedMessageBanner({ room, permalinkCreator }: PinnedMessageBan
5757
const isSinglePinnedEvent = eventCount === 1;
5858

5959
const [currentEventIndex, setCurrentEventIndex] = useState(eventCount - 1);
60-
// If the list of pinned events changes, we need to make sure the current index isn't out of bound
60+
// When the number of pinned messages changes, we want to display the last message
6161
useEffect(() => {
62-
setCurrentEventIndex((currentEventIndex) => {
63-
// If the current index is out of bound, we set it to the last index
64-
if (currentEventIndex < 0 || currentEventIndex >= eventCount) return eventCount - 1;
65-
return currentEventIndex;
66-
});
62+
setCurrentEventIndex((currentEventIndex) => eventCount - 1);
6763
}, [eventCount]);
6864

6965
const pinnedEvent = pinnedEvents[currentEventIndex];

test/components/views/rooms/PinnedMessageBanner-test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,25 @@ describe("<PinnedMessageBanner />", () => {
136136
expect(asFragment()).toMatchSnapshot();
137137
});
138138

139+
it("should display the last message when the pinned event array changed", async () => {
140+
jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([event1.getId()!, event2.getId()!]);
141+
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2]);
142+
143+
const { asFragment, rerender } = renderBanner();
144+
await userEvent.click(screen.getByRole("button", { name: "View the pinned message in the timeline." }));
145+
expect(screen.getByText("First pinned message")).toBeVisible();
146+
147+
jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([
148+
event1.getId()!,
149+
event2.getId()!,
150+
event3.getId()!,
151+
]);
152+
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2, event3]);
153+
rerender(<PinnedMessageBanner permalinkCreator={permalinkCreator} room={room} />);
154+
expect(screen.getByText("Third pinned message")).toBeVisible();
155+
expect(asFragment()).toMatchSnapshot();
156+
});
157+
139158
it("should rotate the pinned events when the banner is clicked", async () => {
140159
jest.spyOn(pinnedEventHooks, "usePinnedEvents").mockReturnValue([event1.getId()!, event2.getId()!]);
141160
jest.spyOn(pinnedEventHooks, "useSortedFetchedPinnedEvents").mockReturnValue([event1, event2]);

test/components/views/rooms/__snapshots__/PinnedMessageBanner-test.tsx.snap

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,74 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

3+
exports[`<PinnedMessageBanner /> should display the last message when the pinned event array changed 1`] = `
4+
<DocumentFragment>
5+
<div
6+
aria-label="This room has pinned messages. Click to view them."
7+
class="mx_PinnedMessageBanner"
8+
data-single-message="false"
9+
data-testid="pinned-message-banner"
10+
>
11+
<button
12+
aria-label="View the pinned message in the timeline."
13+
class="mx_PinnedMessageBanner_main"
14+
type="button"
15+
>
16+
<div
17+
class="mx_PinnedMessageBanner_content"
18+
>
19+
<div
20+
class="mx_PinnedMessageBanner_Indicators"
21+
>
22+
<div
23+
class="mx_PinnedMessageBanner_Indicator"
24+
data-testid="banner-indicator"
25+
/>
26+
<div
27+
class="mx_PinnedMessageBanner_Indicator"
28+
data-testid="banner-indicator"
29+
/>
30+
<div
31+
class="mx_PinnedMessageBanner_Indicator mx_PinnedMessageBanner_Indicator--active"
32+
data-testid="banner-indicator"
33+
/>
34+
</div>
35+
<div
36+
class="mx_PinnedMessageBanner_PinIcon"
37+
width="20"
38+
/>
39+
<div
40+
class="mx_PinnedMessageBanner_title"
41+
data-testid="banner-counter"
42+
>
43+
<span>
44+
<span
45+
class="mx_PinnedMessageBanner_title_counter"
46+
>
47+
3 of 3
48+
</span>
49+
Pinned messages
50+
</span>
51+
</div>
52+
<span
53+
class="mx_PinnedMessageBanner_message"
54+
>
55+
Third pinned message
56+
</span>
57+
</div>
58+
</button>
59+
<button
60+
class="_button_zt6rp_17 mx_PinnedMessageBanner_actions"
61+
data-kind="tertiary"
62+
data-size="lg"
63+
role="button"
64+
tabindex="0"
65+
>
66+
View all
67+
</button>
68+
</div>
69+
</DocumentFragment>
70+
`;
71+
372
exports[`<PinnedMessageBanner /> should render 2 pinned event 1`] = `
473
<DocumentFragment>
574
<div

0 commit comments

Comments
 (0)