mirror of
https://github.com/element-hq/element-web
synced 2024-11-22 17:25:50 +03:00
When a single message is pinned, link to it
Signed-off-by: Paulo Pinto <paulo.pinto@automattic.com>
This commit is contained in:
parent
40ead34c08
commit
8fe7df9171
4 changed files with 114 additions and 7 deletions
|
@ -408,6 +408,15 @@ function textForPowerEvent(event: MatrixEvent): () => string | null {
|
|||
});
|
||||
}
|
||||
|
||||
const onPinnedOrUnpinnedMessageClick = (messageId: string, roomId: string): void => {
|
||||
defaultDispatcher.dispatch({
|
||||
action: 'view_room',
|
||||
event_id: messageId,
|
||||
highlighted: true,
|
||||
room_id: roomId,
|
||||
});
|
||||
};
|
||||
|
||||
const onPinnedMessagesClick = (): void => {
|
||||
defaultDispatcher.dispatch<SetRightPanelPhasePayload>({
|
||||
action: Action.SetRightPanelPhase,
|
||||
|
@ -420,6 +429,41 @@ function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): () => string
|
|||
if (!SettingsStore.getValue("feature_pinning")) return null;
|
||||
const senderName = event.sender ? event.sender.name : event.getSender();
|
||||
|
||||
const pinned = event.getContent().pinned ?? [];
|
||||
const previouslyPinned = event.getPrevContent().pinned ?? [];
|
||||
const newlyPinned = pinned.filter(item => previouslyPinned.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 () => (
|
||||
<span>
|
||||
{
|
||||
_t(
|
||||
"%(senderName)s pinned <a>a message</a> to this room. See all <b>pinned messages</b>.",
|
||||
{ senderName },
|
||||
{
|
||||
"a": (sub) =>
|
||||
<a onClick={(e) => onPinnedOrUnpinnedMessageClick(messageId, roomId)}>
|
||||
{ sub }
|
||||
</a>,
|
||||
"b": (sub) =>
|
||||
<a onClick={onPinnedMessagesClick}>
|
||||
{ sub }
|
||||
</a>,
|
||||
},
|
||||
)
|
||||
}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
return () => _t("%(senderName)s pinned a message to this room. See all pinned messages.", { senderName });
|
||||
}
|
||||
|
||||
if (allowJSX) {
|
||||
return () => (
|
||||
<span>
|
||||
|
|
|
@ -545,6 +545,7 @@
|
|||
"%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s made future room history visible to unknown (%(visibility)s).",
|
||||
"%(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>a message</a> to this room. See all <b>pinned messages</b>.": "%(senderName)s pinned <a>a message</a> to this room. See all <b>pinned messages</b>.",
|
||||
"%(senderName)s changed the <a>pinned messages</a> for the room.": "%(senderName)s changed the <a>pinned messages</a> 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",
|
||||
|
|
|
@ -23,20 +23,42 @@ function mockPinnedEvent(
|
|||
});
|
||||
}
|
||||
|
||||
describe("TextForPinnedEvent", () => {
|
||||
describe("TextForPinnedEvent - newly pinned message(s)", () => {
|
||||
SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true);
|
||||
|
||||
it("should mention sender", () => {
|
||||
const event = mockPinnedEvent();
|
||||
it("mentions message when a single message was pinned, with no previously pinned messages", () => {
|
||||
const event = mockPinnedEvent(['message-1']);
|
||||
expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages.");
|
||||
});
|
||||
|
||||
it("mentions message when a single message was pinned, with multiple previously pinned messages", () => {
|
||||
const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']);
|
||||
expect(textForEvent(event)).toBe("@foo:example.com pinned a message to this room. See all pinned messages.");
|
||||
});
|
||||
|
||||
it("shows generic text when multiple messages were pinned", () => {
|
||||
const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']);
|
||||
expect(textForEvent(event)).toBe("@foo:example.com changed the pinned messages for the room.");
|
||||
});
|
||||
});
|
||||
|
||||
describe("TextForPinnedEvent (JSX)", () => {
|
||||
describe("TextForPinnedEvent - newly pinned message(s) (JSX)", () => {
|
||||
SettingsStore.setValue("feature_pinning", null, SettingLevel.DEVICE, true);
|
||||
|
||||
it("should mention sender", () => {
|
||||
const event = mockPinnedEvent();
|
||||
it("mentions message when a single message was pinned, with no previously pinned messages", () => {
|
||||
const event = mockPinnedEvent(['message-1']);
|
||||
const component = renderer.create(textForEvent(event, true));
|
||||
expect(component.toJSON()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("mentions message when a single message was pinned, with multiple previously pinned messages", () => {
|
||||
const event = mockPinnedEvent(['message-3'], ['message-1', 'message-2']);
|
||||
const component = renderer.create(textForEvent(event, true));
|
||||
expect(component.toJSON()).toMatchSnapshot();
|
||||
});
|
||||
|
||||
it("shows generic text when multiple messages were pinned", () => {
|
||||
const event = mockPinnedEvent(['message-2', 'message-3'], ['message-1']);
|
||||
const component = renderer.create(textForEvent(event, true));
|
||||
expect(component.toJSON()).toMatchSnapshot();
|
||||
});
|
||||
|
|
|
@ -1,6 +1,46 @@
|
|||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`TextForPinnedEvent (JSX) should mention sender 1`] = `
|
||||
exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with multiple previously pinned messages 1`] = `
|
||||
<span>
|
||||
<span>
|
||||
@foo:example.com pinned
|
||||
<a
|
||||
onClick={[Function]}
|
||||
>
|
||||
a message
|
||||
</a>
|
||||
to this room. See all
|
||||
<a
|
||||
onClick={[Function]}
|
||||
>
|
||||
pinned messages
|
||||
</a>
|
||||
.
|
||||
</span>
|
||||
</span>
|
||||
`;
|
||||
|
||||
exports[`TextForPinnedEvent - newly pinned message(s) (JSX) mentions message when a single message was pinned, with no previously pinned messages 1`] = `
|
||||
<span>
|
||||
<span>
|
||||
@foo:example.com pinned
|
||||
<a
|
||||
onClick={[Function]}
|
||||
>
|
||||
a message
|
||||
</a>
|
||||
to this room. See all
|
||||
<a
|
||||
onClick={[Function]}
|
||||
>
|
||||
pinned messages
|
||||
</a>
|
||||
.
|
||||
</span>
|
||||
</span>
|
||||
`;
|
||||
|
||||
exports[`TextForPinnedEvent - newly pinned message(s) (JSX) shows generic text when multiple messages were pinned 1`] = `
|
||||
<span>
|
||||
<span>
|
||||
@foo:example.com changed the
|
||||
|
|
Loading…
Reference in a new issue