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.
+
+
+`;