From a2f31fdfb4cd8183fcdf51e5ec2d3a2e2ed37730 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Fri, 1 Jul 2022 08:01:22 +0200 Subject: [PATCH] Location (live) share replies now provide a fallback content (#8949) * Implement location share reply fallback content * Replace single condition switch with if --- src/utils/Reply.ts | 18 +++++++++ test/Reply-test.ts | 55 ++++++++++++++++++++------- test/__snapshots__/Reply-test.ts.snap | 36 ++++++++++++++++++ 3 files changed, 95 insertions(+), 14 deletions(-) diff --git a/src/utils/Reply.ts b/src/utils/Reply.ts index cdc48c804f..145753e041 100644 --- a/src/utils/Reply.ts +++ b/src/utils/Reply.ts @@ -19,10 +19,12 @@ import sanitizeHtml from "sanitize-html"; import escapeHtml from "escape-html"; import { THREAD_RELATION_TYPE } from "matrix-js-sdk/src/models/thread"; import { MsgType } from "matrix-js-sdk/src/@types/event"; +import { M_BEACON_INFO } from "matrix-js-sdk/src/@types/beacon"; import { PERMITTED_URL_SCHEMES } from "../HtmlUtils"; import { makeUserPermalink, RoomPermalinkCreator } from "./permalinks/Permalinks"; import SettingsStore from "../settings/SettingsStore"; +import { isSelfLocation } from "./location"; export function getParentEventId(ev?: MatrixEvent): string | undefined { if (!ev || ev.isRedacted()) return; @@ -93,6 +95,15 @@ export function getNestedReplyText( const userLink = makeUserPermalink(ev.getSender()); const mxid = ev.getSender(); + if (M_BEACON_INFO.matches(ev.getType())) { + const aTheir = isSelfLocation(ev.getContent()) ? "their" : "a"; + return { + html: `
In reply to ${mxid}` + + `
shared ${aTheir} live location.
`, + body: `> <${mxid}> shared ${aTheir} live location.\n\n`, + }; + } + // This fallback contains text that is explicitly EN. switch (msgtype) { case MsgType.Text: @@ -126,6 +137,13 @@ export function getNestedReplyText( + `
sent a file.`; body = `> <${mxid}> sent a file.\n\n`; break; + case MsgType.Location: { + const aTheir = isSelfLocation(ev.getContent()) ? "their" : "a"; + html = `
In reply to ${mxid}` + + `
shared ${aTheir} location.
`; + body = `> <${mxid}> shared ${aTheir} location.\n\n`; + break; + } case MsgType.Emote: { html = `
In reply to * ` + `${mxid}
${html}
`; diff --git a/test/Reply-test.ts b/test/Reply-test.ts index a485ee5ab0..6d52495165 100644 --- a/test/Reply-test.ts +++ b/test/Reply-test.ts @@ -14,6 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { IContent, MatrixEvent, MsgType } from "matrix-js-sdk/src/matrix"; +import { M_BEACON_INFO } from "matrix-js-sdk/src/@types/beacon"; +import { LocationAssetType, M_ASSET } from "matrix-js-sdk/src/@types/location"; + import { getNestedReplyText, getParentEventId, @@ -24,6 +28,22 @@ import { import { mkEvent } from "./test-utils"; import { RoomPermalinkCreator } from "../src/utils/permalinks/Permalinks"; +function makeTestEvent(type: string, content: IContent): MatrixEvent { + return mkEvent({ + event: true, + type: type, + user: "@user1:server", + room: "!room1:server", + content, + }); +} + +const mockPermalinkGenerator = { + forEvent(eventId: string): string { + return "$$permalink$$"; + }, +} as RoomPermalinkCreator; + // don't litter test console with logs jest.mock("matrix-js-sdk/src/logger"); @@ -99,22 +119,29 @@ But this is not describe("getNestedReplyText", () => { it("Returns valid reply fallback text for m.text msgtypes", () => { - const event = mkEvent({ - event: true, - type: "m.room.message", - user: "@user1:server", - room: "!room1:server", - content: { - body: "body", - msgtype: "m.text", - }, + const event = makeTestEvent(MsgType.Text, { + body: "body", + msgtype: "m.text", }); - expect(getNestedReplyText(event, { - forEvent(eventId: string): string { - return "$$permalink$$"; - }, - } as RoomPermalinkCreator)).toMatchSnapshot(); + expect(getNestedReplyText(event, mockPermalinkGenerator)).toMatchSnapshot(); + }); + + [ + ["m.room.message", MsgType.Location, LocationAssetType.Pin], + ["m.room.message", MsgType.Location, LocationAssetType.Self], + [M_BEACON_INFO.name, undefined, LocationAssetType.Pin], + [M_BEACON_INFO.name, undefined, LocationAssetType.Self], + ].forEach(([type, msgType, assetType]) => { + it(`should create the expected fallback text for ${assetType} ${type}/${msgType}`, () => { + const event = makeTestEvent(type, { + body: "body", + msgtype: msgType, + [M_ASSET.name]: { type: assetType }, + }); + + expect(getNestedReplyText(event, mockPermalinkGenerator)).toMatchSnapshot(); + }); }); }); diff --git a/test/__snapshots__/Reply-test.ts.snap b/test/__snapshots__/Reply-test.ts.snap index df1a11eeb5..a053770ed3 100644 --- a/test/__snapshots__/Reply-test.ts.snap +++ b/test/__snapshots__/Reply-test.ts.snap @@ -8,3 +8,39 @@ Object { "html": "
In reply to @user1:server
body
", } `; + +exports[`Reply getNestedReplyText should create the expected fallback text for m.pin m.room.message/m.location 1`] = ` +Object { + "body": "> <@user1:server> shared a location. + +", + "html": "
In reply to @user1:server
shared a location.
", +} +`; + +exports[`Reply getNestedReplyText should create the expected fallback text for m.pin org.matrix.msc3672.beacon_info/undefined 1`] = ` +Object { + "body": "> <@user1:server> shared a live location. + +", + "html": "
In reply to @user1:server
shared a live location.
", +} +`; + +exports[`Reply getNestedReplyText should create the expected fallback text for m.self m.room.message/m.location 1`] = ` +Object { + "body": "> <@user1:server> shared their location. + +", + "html": "
In reply to @user1:server
shared their location.
", +} +`; + +exports[`Reply getNestedReplyText should create the expected fallback text for m.self org.matrix.msc3672.beacon_info/undefined 1`] = ` +Object { + "body": "> <@user1:server> shared their live location. + +", + "html": "
In reply to @user1:server
shared their live location.
", +} +`;