From 3f2dadf0fe226d572333653c845049cbb6610800 Mon Sep 17 00:00:00 2001 From: Paulo Pinto Date: Tue, 27 Jul 2021 16:58:53 +0100 Subject: [PATCH] When a single message is unpinned, link to it Signed-off-by: Paulo Pinto --- src/TextForEvent.tsx | 33 +++++++++++- src/i18n/strings/en_EN.json | 1 + test/TextForEvent-test.ts | 45 +++++++++++++++- test/__snapshots__/TextForEvent-test.ts.snap | 56 ++++++++++++++++++++ 4 files changed, 132 insertions(+), 3 deletions(-) diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index 17fede0d21..1033ac9fd8 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -428,16 +428,17 @@ const onPinnedMessagesClick = (): void => { function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string | JSX.Element | null { if (!SettingsStore.getValue("feature_pinning")) return null; const senderName = event.sender ? event.sender.name : event.getSender(); + const roomId = event.getRoomId(); const pinned = event.getContent().pinned ?? []; const previouslyPinned = event.getPrevContent().pinned ?? []; const newlyPinned = pinned.filter(item => previouslyPinned.indexOf(item) < 0); + const newlyUnpinned = previouslyPinned.filter(item => pinned.indexOf(item) < 0); if (newlyPinned.length === 1) { // A single message was pinned, include a link to that message. if (allowJSX) { const messageId = newlyPinned.pop(); - const roomId = event.getRoomId(); return () => ( @@ -464,6 +465,36 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string return () => _t("%(senderName)s pinned a message to this room. See all pinned messages.", { senderName }); } + if (newlyUnpinned.length === 1) { + // A single message was unpinned, include a link to that message. + if (allowJSX) { + const messageId = newlyUnpinned.pop(); + + return () => ( + + { + _t( + "%(senderName)s unpinned a message from this room. See all pinned messages.", + { senderName }, + { + "a": (sub) => + onPinnedOrUnpinnedMessageClick(messageId, roomId)}> + { sub } + , + "b": (sub) => + + { sub } + , + }, + ) + } + + ); + } + + return () => _t("%(senderName)s unpinned a message from this room. See all pinned messages.", { senderName }); + } + if (allowJSX) { return () => ( diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb390afb32..91325444c3 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -546,6 +546,7 @@ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s changed the power level of %(powerLevelDiffText)s.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s pinned a message to this room. See all pinned messages.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s unpinned a message from this room. See all pinned messages.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s changed the pinned messages for the room.", "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 91c99c7048..d8c708eea3 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -37,7 +37,7 @@ describe("TextForPinnedEvent - newly pinned message(s)", () => { }); it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); }); }); @@ -58,7 +58,48 @@ describe("TextForPinnedEvent - newly pinned message(s) (JSX)", () => { }); it("shows generic text when multiple messages were pinned", () => { - const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']); + const event = mockPinnedEvent(['message-1', 'message-2', 'message-3'], ['message-1']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); +}); + +describe("TextForPinnedEvent - newly unpinned message(s)", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("mentions message when a single message was unpinned, with a single message previously pinned", () => { + const event = mockPinnedEvent([], ['message-1']); + expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + }); + + it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); + expect(textForEvent(event)).toBe("@foo:example.com unpinned a message from this room. See all pinned messages."); + }); + + it("shows generic text when multiple messages were unpinned", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); + expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room."); + }); +}); + +describe("TextForPinnedEvent - newly unpinned message(s) (JSX)", () => { + SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true); + + it("mentions message when a single message was unpinned, with a single message previously pinned", () => { + const event = mockPinnedEvent([], ['message-1']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { + const event = mockPinnedEvent(['message-2'], ['message-1', 'message-2']); + const component = renderer.create(textForEvent(event, true)); + expect(component.toJSON()).toMatchSnapshot(); + }); + + it("shows generic text when multiple messages were unpinned", () => { + const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2', 'message-3']); const component = renderer.create(textForEvent(event, true)); expect(component.toJSON()).toMatchSnapshot(); }); diff --git a/test/__snapshots__/TextForEvent-test.ts.snap b/test/__snapshots__/TextForEvent-test.ts.snap index 41ccbc0857..124f7e0663 100644 --- a/test/__snapshots__/TextForEvent-test.ts.snap +++ b/test/__snapshots__/TextForEvent-test.ts.snap @@ -55,3 +55,59 @@ exports[`TextForPinnedEvent - newly pinned message(s) (JSX) shows generic text w `; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with a single message previously pinned 1`] = ` + + + @foo:example.com unpinned + + a message + + from this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) mentions message when a single message was unpinned, with multiple previously pinned messages 1`] = ` + + + @foo:example.com unpinned + + a message + + from this room. See all + + pinned messages + + . + + +`; + +exports[`TextForPinnedEvent - newly unpinned message(s) (JSX) shows generic text when multiple messages were unpinned 1`] = ` + + + @foo:example.com changed the + + + pinned messages + + + for the room. + + +`;