From 6f3dc30693180425da1b2940145b9ede344a792f Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Fri, 16 Aug 2024 14:16:06 +0200 Subject: [PATCH] Message Pinning: rework the message pinning list in the right panel (#12825) * Fix pinning event loading after restart * Update deps * Replace pinned event list * Add a dialog to confirm to unpin all messages * Use `EmptyState` when there is no pinned messages * Rework `PinnedEventTile` tests * Add comments and refactor `PinnedMessageCard` * Rework `PinnedMessageCard` tests * Add tests for `UnpinAllDialog` * Add e2e tests for pinned messages * Replace 3px custom gap by 4px gap * Use string interpolation for `Pin` action. * Update playright sceenshot for empty state --- playwright/e2e/pinned-messages/index.ts | 226 +++++++++ .../pinned-messages/pinned-messages.spec.ts | 79 +++ .../pinned-messages-list-empty-linux.png | Bin 0 -> 80948 bytes .../pinned-messages-list-messages-2-linux.png | Bin 0 -> 13654 bytes .../pinned-messages-list-messages-3-linux.png | Bin 0 -> 16907 bytes .../unpin-all-dialog-linux.png | Bin 0 -> 13367 bytes res/css/_common.pcss | 12 +- res/css/_components.pcss | 1 + res/css/views/dialogs/_UnpinAllDialog.pcss | 38 ++ .../right_panel/_PinnedMessagesCard.pcss | 68 ++- res/css/views/rooms/_PinnedEventTile.pcss | 104 +--- src/components/structures/RightPanel.tsx | 2 +- .../views/dialogs/UnpinAllDialog.tsx | 77 +++ .../views/right_panel/PinnedMessagesCard.tsx | 286 +++++++---- .../views/rooms/PinnedEventTile.tsx | 268 ++++++---- src/i18n/strings/en_EN.json | 18 +- .../views/dialogs/UnpinAllDialog-test.tsx | 46 ++ .../UnpinAllDialog-test.tsx.snap | 66 +++ .../right_panel/PinnedMessagesCard-test.tsx | 344 ++++++++----- .../PinnedMessagesCard-test.tsx.snap | 457 ++++++++++++++++++ .../views/rooms/PinnedEventTile-test.tsx | 195 ++++++-- .../PinnedEventTile-test.tsx.snap | 319 ++++++++++-- 22 files changed, 2099 insertions(+), 507 deletions(-) create mode 100644 playwright/e2e/pinned-messages/index.ts create mode 100644 playwright/e2e/pinned-messages/pinned-messages.spec.ts create mode 100644 playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png create mode 100644 playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-2-linux.png create mode 100644 playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-3-linux.png create mode 100644 playwright/snapshots/pinned-messages/pinned-messages.spec.ts/unpin-all-dialog-linux.png create mode 100644 res/css/views/dialogs/_UnpinAllDialog.pcss create mode 100644 src/components/views/dialogs/UnpinAllDialog.tsx create mode 100644 test/components/views/dialogs/UnpinAllDialog-test.tsx create mode 100644 test/components/views/dialogs/__snapshots__/UnpinAllDialog-test.tsx.snap create mode 100644 test/components/views/right_panel/__snapshots__/PinnedMessagesCard-test.tsx.snap diff --git a/playwright/e2e/pinned-messages/index.ts b/playwright/e2e/pinned-messages/index.ts new file mode 100644 index 0000000000..a67df09d86 --- /dev/null +++ b/playwright/e2e/pinned-messages/index.ts @@ -0,0 +1,226 @@ +/* + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Page } from "@playwright/test"; + +import { test as base, expect } from "../../element-web-test"; +import { Client } from "../../pages/client"; +import { ElementAppPage } from "../../pages/ElementAppPage"; +import { Bot } from "../../pages/bot"; + +/** + * Set up for pinned message tests. + */ +export const test = base.extend<{ + room1Name?: string; + room1: { name: string; roomId: string }; + util: Helpers; +}>({ + displayName: "Alice", + botCreateOpts: { displayName: "Other User" }, + + room1Name: "Room 1", + room1: async ({ room1Name: name, app, user, bot }, use) => { + const roomId = await app.client.createRoom({ name, invite: [bot.credentials.userId] }); + await use({ name, roomId }); + }, + + util: async ({ page, app, bot }, use) => { + await use(new Helpers(page, app, bot)); + }, +}); + +export class Helpers { + constructor( + private page: Page, + private app: ElementAppPage, + private bot: Bot, + ) {} + + /** + * Sends messages into given room as a bot + * @param room - the name of the room to send messages into + * @param messages - the list of messages to send, these can be strings or implementations of MessageSpec like `editOf` + */ + async receiveMessages(room: string | { name: string }, messages: string[]) { + await this.sendMessageAsClient(this.bot, room, messages); + } + + /** + * Use the supplied client to send messages or perform actions as specified by + * the supplied {@link Message} items. + */ + private async sendMessageAsClient(cli: Client, roomName: string | { name: string }, messages: string[]) { + const room = await this.findRoomByName(typeof roomName === "string" ? roomName : roomName.name); + const roomId = await room.evaluate((room) => room.roomId); + + for (const message of messages) { + await cli.sendMessage(roomId, { body: message, msgtype: "m.text" }); + + // TODO: without this wait, some tests that send lots of messages flake + // from time to time. I (andyb) have done some investigation, but it + // needs more work to figure out. The messages do arrive over sync, but + // they never appear in the timeline, and they never fire a + // Room.timeline event. I think this only happens with events that refer + // to other events (e.g. replies), so it might be caused by the + // referring event arriving before the referred-to event. + await this.page.waitForTimeout(100); + } + } + + /** + * Find a room by its name + * @param roomName + * @private + */ + private async findRoomByName(roomName: string) { + return this.app.client.evaluateHandle((cli, roomName) => { + return cli.getRooms().find((r) => r.name === roomName); + }, roomName); + } + + /** + * Open the room with the supplied name. + */ + async goTo(room: string | { name: string }) { + await this.app.viewRoomByName(typeof room === "string" ? room : room.name); + } + + /** + * Pin the given message + * @param message + */ + async pinMessage(message: string) { + const timelineMessage = this.page.locator(".mx_MTextBody", { hasText: message }); + await timelineMessage.click({ button: "right" }); + await this.page.getByRole("menuitem", { name: "Pin" }).click(); + } + + /** + * Pin the given messages + * @param messages + */ + async pinMessages(messages: string[]) { + for (const message of messages) { + await this.pinMessage(message); + } + } + + /** + * Open the room info panel + */ + async openRoomInfo() { + await this.page.getByRole("button", { name: "Room info" }).nth(1).click(); + } + + /** + * Assert that the pinned count in the room info is correct + * Open the room info and check the pinned count + * @param count + */ + async assertPinnedCountInRoomInfo(count: number) { + await expect(this.page.getByRole("menuitem", { name: "Pinned messages" })).toHaveText( + `Pinned messages${count}`, + ); + } + + /** + * Open the pinned messages list + */ + async openPinnedMessagesList() { + await this.page.getByRole("menuitem", { name: "Pinned messages" }).click(); + } + + /** + * Return the right panel + * @private + */ + private getRightPanel() { + return this.page.locator("#mx_RightPanel"); + } + + /** + * Assert that the pinned message list contains the given messages + * @param messages + */ + async assertPinnedMessagesList(messages: string[]) { + const rightPanel = this.getRightPanel(); + await expect(rightPanel.getByRole("heading", { name: "Pinned messages" })).toHaveText( + `${messages.length} Pinned messages`, + ); + await expect(rightPanel).toMatchScreenshot(`pinned-messages-list-messages-${messages.length}.png`); + + const list = rightPanel.getByRole("list"); + await expect(list.getByRole("listitem")).toHaveCount(messages.length); + + for (const message of messages) { + await expect(list.getByText(message)).toBeVisible(); + } + } + + /** + * Assert that the pinned message list is empty + */ + async assertEmptyPinnedMessagesList() { + const rightPanel = this.getRightPanel(); + await expect(rightPanel).toMatchScreenshot(`pinned-messages-list-empty.png`); + } + + /** + * Open the unpin all dialog + */ + async openUnpinAllDialog() { + await this.openRoomInfo(); + await this.openPinnedMessagesList(); + await this.page.getByRole("button", { name: "Unpin all" }).click(); + } + + /** + * Return the unpin all dialog + */ + getUnpinAllDialog() { + return this.page.locator(".mx_Dialog", { hasText: "Unpin all messages?" }); + } + + /** + * Click on the Continue button of the unoin all dialog + */ + async confirmUnpinAllDialog() { + await this.getUnpinAllDialog().getByRole("button", { name: "Continue" }).click(); + } + + /** + * Go back from the pinned messages list + */ + async backPinnedMessagesList() { + await this.page.locator("#mx_RightPanel").getByTestId("base-card-back-button").click(); + } + + /** + * Open the contextual menu of a message in the pin message list and click on unpin + * @param message + */ + async unpinMessageFromMessageList(message: string) { + const item = this.getRightPanel().getByRole("list").getByRole("listitem").filter({ + hasText: message, + }); + + await item.getByRole("button").click(); + await this.page.getByRole("menu", { name: "Open menu" }).getByRole("menuitem", { name: "Unpin" }).click(); + } +} + +export { expect }; diff --git a/playwright/e2e/pinned-messages/pinned-messages.spec.ts b/playwright/e2e/pinned-messages/pinned-messages.spec.ts new file mode 100644 index 0000000000..be1c92223f --- /dev/null +++ b/playwright/e2e/pinned-messages/pinned-messages.spec.ts @@ -0,0 +1,79 @@ +/* + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test } from "./index"; +import { expect } from "../../element-web-test"; + +test.describe("Pinned messages", () => { + test.use({ + labsFlags: ["feature_pinning"], + }); + + test("should show the empty state when there are no pinned messages", async ({ page, app, room1, util }) => { + await util.goTo(room1); + await util.openRoomInfo(); + await util.assertPinnedCountInRoomInfo(0); + await util.openPinnedMessagesList(); + await util.assertEmptyPinnedMessagesList(); + }); + + test("should pin messages and show them in the room info panel", async ({ page, app, room1, util }) => { + await util.goTo(room1); + await util.receiveMessages(room1, ["Msg1", "Msg2", "Msg3", "Msg4"]); + + await util.pinMessages(["Msg1", "Msg2", "Msg4"]); + await util.openRoomInfo(); + await util.assertPinnedCountInRoomInfo(3); + }); + + test("should pin messages and show them in the pinned message panel", async ({ page, app, room1, util }) => { + await util.goTo(room1); + await util.receiveMessages(room1, ["Msg1", "Msg2", "Msg3", "Msg4"]); + + // Pin the messages + await util.pinMessages(["Msg1", "Msg2", "Msg4"]); + await util.openRoomInfo(); + await util.openPinnedMessagesList(); + await util.assertPinnedMessagesList(["Msg1", "Msg2", "Msg4"]); + }); + + test("should unpin one message", async ({ page, app, room1, util }) => { + await util.goTo(room1); + await util.receiveMessages(room1, ["Msg1", "Msg2", "Msg3", "Msg4"]); + await util.pinMessages(["Msg1", "Msg2", "Msg4"]); + + await util.openRoomInfo(); + await util.openPinnedMessagesList(); + await util.unpinMessageFromMessageList("Msg2"); + await util.assertPinnedMessagesList(["Msg1", "Msg4"]); + await util.backPinnedMessagesList(); + await util.assertPinnedCountInRoomInfo(2); + }); + + test("should unpin all messages", async ({ page, app, room1, util }) => { + await util.goTo(room1); + await util.receiveMessages(room1, ["Msg1", "Msg2", "Msg3", "Msg4"]); + await util.pinMessages(["Msg1", "Msg2", "Msg4"]); + + await util.openUnpinAllDialog(); + await expect(util.getUnpinAllDialog()).toMatchScreenshot("unpin-all-dialog.png"); + await util.confirmUnpinAllDialog(); + + await util.assertEmptyPinnedMessagesList(); + await util.backPinnedMessagesList(); + await util.assertPinnedCountInRoomInfo(0); + }); +}); diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png b/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-empty-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..28099d338c179df8b861471496409acdbe548799 GIT binary patch literal 80948 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

_S%Mw3@sK2a#W*%|0emjZl7c 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 z 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 SN(_?$pL;5r%B6~C!T$#cqP|Z6 literal 0 HcmV?d00001 diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-2-linux.png b/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-2-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..82666b0d95ff5d0728af128f5f1e66757199a8df GIT binary patch literal 13654 zcmeI3cT`hr*WjaGK}FyyDAFw#=^)ait0*W{snV;28cHDaq9~{|h0qD07?2uz3rSQ2 zq)V?MbOb^|50He+xnEf`v(~J6-}hVd*Q_u9q@1&!v(K~3*}uJa-aawVW<}Si#cyn5b$;aYNUN1RME$`3IbgPJ$`V{Bq(PCA82j5$N0L{ zk0D+Y6Y2WX;^oVw+(u@S+$C^@4lcD|xGRPrAztI)^8Cx>qL`BJg{(R2_I{AM+7&--!Qqj&s0IveY->f0g_e7B+u5y+M7{urd z@JhUR!YtS|Hlug&eSolvabSo2t!Y^s?^|E^Gz}7M(^Ja_Tyqe7eEgo%H)ee|-?Pi` zdd?fb3<{-mQMkY#6xl21xic-A%T)Rd64~})qhy{SKF-c-E*q;I2x89ed7FDoUZ2Kz z2W9;yCX~!be;*yW=3>edA6@T>uRV|FUjt>BzKYFQa{INucbR=sL`^fjV9cuKbp93b zNzI;Zxz84gt~bOZ{r>&?_o??5fz>PlTPa+a89-q46Gf9T?@6q~&i*2=qE5QlNXz5s zH2nfOo?f-?^W0l8s~%ijD>~m^;L-jfb`@ntYxJZdIrk?;!6`AL?CN%!S}hk$ar;r~ zc){=3Cq0~V*Ib+(cy0$+oVMOx?uFwjtP{$tJ9`Sxsgq3C6(pZke{w50GW~v^p&A@Q z`c4RFE@ShuoW?mnSkfuaQoQ|}^>OEzdD+B4C){m;z_UamDFoT)B@5|t`UKv6+PVIx z3T%FN#N)Ak!J2y=>g#w`!KyzLZh78ct7 zBCYpR{0iIGf}WmhFiDxiUjrJ(5CUnq9$Cx=Xaa|_3_P9}!rY6DroY<`e{iYaG8!FH}8>qN&JGj?K2cgc3TTB|+THydrxh`fN(ri3c z{aiJn21ZtC3>%3lef!on7n!#@A&=SuRHoJK@{}q18e~izX;Q!xFj)r?P>EdqcB6xj zkB?`xe54$zGGuCGi$({_KA%a}NaWW*c6V({t&dcBbx+FYatiY_)C5oUv0BYn*y{Sh zU?I1w{rW2q*48-*HTy)3UFy34K<=>aQ1;(L;q!~$Ya7BU4Pb@@#_f)t_b}q5_pK{TyCi|j7i(SUY3%BU)t=n__xg9wu$_N~iP)*YFmL1W zin5XFe#8ewuyQ7LqRnVG6j*AZU-%72f}(2#qDJJ_*T~JNner_8Ni3AyljoFxzT-#y zu`3t>4S)t$MD`yAcpQ^s34VU`NQ?0koSTFT%b7|)YAwB1_RCMv!lnMQwyh4+A4RCd z9XC#$b`t$jClQqMJ-H?(jGXA~vbHR3@gX^Rvcv+Oi9UamqCt_h%gk){1|OFUxHiMw z(>t#2Dchudvwx(AJ)W9wgTY{R9y3(M-l?hXgN7=Xx{?*?n|vz1Vgw7_bX4&ynM#YA zY4<*LiblvjXzRl>TgrJg`fU_mBtdT2@-6Kl}P} zl^0fUQg*>xhY?FH-EX>oY)pbxZOnC2Mds9l?8)0Rl$qzZ5K$t?7FAtF@U|Ydrmx-Z z*J^bPZr^~kVcnGW1>SrxhU{|q*e-P?DOgtHdlAW zk>VX#hFg&9BiBdvb;2cgl$75AH(F646@qbC-Ijj~#ITDg98xw4UK_MF-1qy@`sQID zOuze)ODj*^+PP6MyRG)O=BdAzWg~M_kllX%KCWXWnVC}0eBMkPr>1KKxU2dq9DmP* zaQudZpgSl zbGj+qpCl?EAOtt!K|XC_JoMW9n$m=?^BO5L+Y?UYQwb)~+75No`fU!VU*@9Q-d>`G zElWJBhYZ!bo0h(M%`{eQAqn^whMA4PUpQmmm1(3?+CAWa3t*LpErE%gV%lS=QS_a>rvtZR6NKqj_b;p@o+7M}S zI+6g`+2D|@wG9xrwG;D#e9%MBpCeQQ>OHwp%lbTW=ByCpbc7c%)~cQya{W3j_pPrA z#q9T_?@&ELJ~uuLFp2iw3hRc>T9&-+nWDZNG*o!%+c#U$0NSEk9JBp&`ksb7V0Iyx zh|XA=5jea09etAzBbqbTUlG)ZY>M$Gce$vtn~@- zoxqUujl}X_lIa}cOb4RKuHbYf-!CoBpw*amUY`TEsKW`OihXp{p^mwA*}5fwCuE zw8?W{ATHLr(=YExpR5tzq#AloHfxIRt#r!TMNp$xaVIN0I2=BHD~MsOuc^tF2M?4r z#o6Q_wAlsc*NqKC_nb$>G@14u_y0T~tteSFkRu}QN(*ZjG1sbSGsh0JGE?D{+=kyt z+!}P)VOL!Q2CYzHw{rZpeJZmx=KPtm--2lS31YA=;Hx7j4`Su;x7Pm}8 zeg+Am?w6+^Qc}`ve+jz?3)$hqHH>>|E!;}R_#2!u1Zw9~N}LR_5tK-{(TIw2@3 zxv=Ec!r32ZR*GbK=-Rz+gZm-ndC?T*_v{f2wja~$%aafzEPY8*Hul+rrC)ElzJK!u zgSqgZsv70H*<^J4c*?@K57n$~a)LUFt~=klG76+vf*^Onbr5+iLL}to6&%PV_IG(x^aB=P!duJKYGX4@wF{#$h-{>0;KJoo@AIy!{wSjtczJuTke02#tXR6$ zWnF~yjcV|p`SRV;P$hx zYvK-cY`eeVGoedjR;)q@F_i=vBsMAUC&J7~{87CVS6MR~0towgP)CoJ)9Yp)yz0NR zrTT<&%D6$G?3(>7#@gy)l4XBw8H-MFw76jyr`k?e@n7PxC%)E~>1ew99Svh^P`OoW zti`BYgX2Ow;>Krx4~3Io>m_jcKbs2jc88O|l)uKE`K|?s$6Km??b4Q7?m*D|4zZeC z7gLQ4nc(~bSQiSD!?O9n4?RC_=Y;otsg=5=1DLm#V|25^_xko5P z)n6ML?$kD?@8645CF!owQj*<0Ck-Hp`b?u0JO0iSR}GQFbG41#W|sDy-jY)~#q1%9+dctu23tM>w0v`uvHr9O^qReY-Q5LIjBnZ&OKZzOB;yXc zKc42>I%4Ife_gC6?Aqkm5dKbhf2KIOXF?!weh`t9lXY)thGd4*-$Q3_@AwN&RE-`4 z``%C)4QbGBy`Qi@xHqim;$;zj>sZUOFs~>Sck=`Jhg{{5dk=Z|h<@@kxYI&Y>m7tj zq`O?+WZMe!z|TU+_2<4UFU-#^&d-@tWf@W^mbfMtpNafI7qj>{wf7%B)!08m8`wP6 zk*}Cf4|QA+JJu<-DU#;Jh2zZO1(?x;HY(8WgO?4LID={lL0Fpo-+1A`P4E?qw%a z8b&Ly#0CqWIym$dlp25f9%0#JN3(KvUfUN`&MiiVO5`X7&P^Zw;X4}b)M?TBwtU5p z^m`|3eb$jNZ>ZM&I*5BW=2A)nF(>kwsHyaFC+r4qI?81EwP0ujr`ipx^cxk~h*YTK zdehp5I2Y_uXEFD_WrF$H^l6UnpvG|z`Ns{i@r1+;v&i{R2#blMD*PJ5sVD@{5#oMV zdI-`zHH=68!Aw0b?q}cMK-ddQ!FC)^h9wgwGG$Cj+4~W!B#nuzi~0|DZ}P_Xvk8y z5%4hQxFC=mI(mvfTFC8AGbui^i8a)ea#p$&Zn@uCxRgSgIcy?yeMJOM0Co^jG$1^}#_HQnQ@GMLZ**T;qEQ*Zfg^!-L6`eOKzILHV@wvE+HC zXd|7Jbq^$5tDp%ydg}RO9w~t)M;FM3)Q9$1g)u`yX6VtRo62N@XIb6Y=!WHp9#4YXmCvgr zXP4(HDl_ywTf<%xom77e^>hCg=2POjvca$=$-=xm9DlLw#5! z^Tlv%LAc-KEXz}!hh}U6etsr8ubECy%dWquUbNNhsxy&=Vl-ReMq_<9!86AlOHZ`k zktUng3r|Z-1=-rZsVIaWc@yj5yJ$siZ?H365tePV*7n=Iuq__n+t<0{F4EAP8g?EK zCtz*nYFTJ>rIsnJ&la6Z73tND_OZj%EbC#jPn!BFN*0<@{8YhraV`^VX%7pG&*(V}dbEr>~%W7-h^I$u&$n+9)eGE+qWm z;Gv6qno$>iXqp@Q+|AYe#_v=%dE9}M-N;joeb*}$@GP#t`TK(#ANbwt$}c!umQ|xx za%;@3u!_LQ-9T#(t{U76QUO?h=mOV8t%EHqtsa`aABy_3u}xVUVPEJ9&@B;(-hf0si{*ee6mZAIQ2QOAac6? z!1o#Y0s%D@aMU%&^41A0?-OvFvY>dLf|tXtgaWJ%(fE*x;2^CZ8t6se>n&YYNnU#~ z6RJT{jEIQSUrB_FXp zq_I-hTol=PmKv-e^W=v_)0<2EXY}?ZluO`)lWvyS&7_Vq1+fallWuS$^ku&KpaqZs zo9^I~k0ni^$G%WD+auYhq9deKErhMNrPPm7>o?{_GQFQ-5zwyM9t=R5US+-Zh*{`?LG)_^96|)W>22Hv1-K(Q1V@HS0tWMbrbq~#2e|H-v zsw2a6o@uB!GYQy3iHdWw^i#=XmfRG1k>g% z3u>}DDO{;B5%;{*9CA@k9g?wi!T^-SHWgNhxaU27JoTcDW0Z>)Zl??P-JrR| zeF3|>*0!8FvH7!VsbkKi(53t!th=2YxJ31B)Mp-rD3(;EnqLPA@L3gp6R}E%dM;$D z#UrRelh!=MRE#Ep{rGUp}j0Z`B{&pakj+g+K%b&NM5f)Vvz zx-cw&Q6`{9Jz{?KjIlh;6#dbQTI5+RIy+#lH)t;hCWQ@6k$G$yeSAZw*|I&u<~|7t z8|GGb7Dj2?Rq3>*ikmlh#dWJa@0&gp5Kss*N;62`>nuu%IUg~4q9>yuS) zBAuG>7l5!Whb*B#{1x>lFrkJGB+PyBhYw83)fY9Sg@g(8Fy`oQxAwB#0@fAT*vbdd z-V8~rdOUP)6Hn1NI5>FF0NL}2yqf=$vs7+(74NZBVyftk4<~dB>00jKzyn~_^1yWE7xTY!JniBHzQjqvKpZc+?gXiq>D zMNs#%Q5w5~XGCtdtvzQ6SRdKi*|Dm1?aY5cPc^E7E(dH(wsmfiYJ`)MlVxw;4%v%8 zd+wZx4*h6{-BLwmq3t`cwElrln7_X`(&UM~J?(Hu)+Nk)lE`I@tuRMH5XyCw4Oz*IkNg@;h&Y>lT|f}tZN@|ckJ442n2F}rKrLs+MDE?d5R;FfRRys4z3B#NA0 zSTHs=ULQTA$}cDI9MjJZZ>{wAXUS80Wl(Cnf~Q4v+9X+J@aSCC;I+-U8!TLsXW7}~ z-h4?8C4ut{tn2(NOj?(U1<(46Nseg6P&(dS+B?`IW+tj~BF-x`M}wZP3n- zlctB($4aRaMI1%?*;{>$6zd$DECsLaPGOGtnwbb_e0J&7coq4k9nQ7^g778B^Ka*+ z$JgA~WE?-5hr>CMCO$szp%ta<`OoI%IRo)c(2hAq|LM^R8;!-+AHfFvLz^G=f~+sK z)-bWe)5++LM8U}Qgt74OaDzN`6^D7@fr0YhCk4Pc@*>FLUaJQ6C{}b5$VYj7nF{N7C+8_dSJwnfS8$jJg-w3Ca>%0+_&>WHUeb(M!GIGe}?(A-Vd z2@54&Fv;@xFm2Z=^R#ta-DfCuKtD^(yklmduM2akQi=ETwVis>)G^e+GoisA@9x#g z96r?6^eRRE6v!SrYP(~nhM+xN&rA!rCmP_h^fu`e*j6dkdFd8tJk1o$THLvsSIan_ zoLDzw`>yh1r;d;(`LuncYojMg<#1^`JXY#2F=Xy}5tUEjy(HG}J*ZD_GZ&Yg^N!ZL z%}C0G|HL{lt5V=DL6yTJoa^tT%sNlO-k^^kBhMTBPr+Ra0C&MWqhU34V(uSS2@5?H zaUR$S$ktjZdwXQPr{QPZ*oS^*1D;==gHbNp>VjA1$a|}U_)>Pupep0LA(*)r5XRFf zX#tMQg>x{Yqj#NFUMlcZJ5LNE!)2nGP^O#@Kgtih!EUa-z{zgj!5;EZ6p6J7_;u$Y zhpec6x)*Ie7aEI1_rE%iSUv86?{i$XZO(Pi!mjkB0-w_aHtVRe##uB)*vN~Zp+XvC z2lu#pA5LV90C@A7e*?K*OvhP1JwEhCgc!03C_7E(Y$!D)?zF(%=@Bnp*4$#%)tJoJ z?Y>oEDU;G49}L}?HItV2@q^x~(Q$Df9em3x$=hFHYz{X{C_Pxp z9dCSxGjbnW?QZubkS{H{qU0mCB2Xejj?F4c(ABbJ!_`aFepW^V#`lOcWX_Y2 zfR7}teO>+_{lHu!aKnsxmPL=*{a+%r{8@=$1?T?-Gx?ND1DoFC$Plx#Wn%y_3&8Gr zKz_3|ozU_(V*U!S7UxR3uaTCSljVRK2}Y$pgrz1kQ_BUX z$|Fc^)q63)1uC!M(tA1`mg><(UU&TFNZVCb0TW6!TK;E5fLzesO09B_x+5$xJy95v zZ={ossF~k@%wcn1^OqQ{1>LVUE4YlCY5H86LNe&1@e7w81YdS8G9z&@E^}u#YZ&I1 zUlbq`7eB+5p`@2)rK}~tBmXTWm&+Ls>FbfyWagrBMXp&${pikDEX!zlzCvr&DGre_ ztmmC*3`5?Qrj73u{N|o$=JUl9%W^oZ`c1voyeRiy<}Z-pDBoOSQ2$B`z{fFv2PW9_G|B6D`fQ7C`)wd8lhHifq;xxp`gnFG?A+ zGL!D0k3XJU7RtL{LgKJB6Rjhr=ywa_!=vn1wRz7g9kHS0_u@7y2sM+Vd6dkF#?x+J zI4mPpb7ixWgj8)%$!_y$3ukqTC$BB_qDluA)pU!;Kk(NzrByZzEu+oOf@9_Ih@LV} za0ePUvtFF3Q=D88D64@rH)%L>h$O0@$;1)B@LSYE*BdjK$osAtWP@HZS6j?C`&-9( z_D7bY$N^VU=H6WkKh)g(2XU8Wpw{IU<_e|nBASX&hcGoFp zv_o_s<3gDiVOpb+P7R_++xQ9>%btVo-agS^1)l@N53j(*R@a6x_nrY&rG%0L1O_Hf zd772ZG=~j|K5}TiFa%%qU=u}t5~GSDA;@(XaEk^j2z2R>zh?m|R9eW>BMr@?*^D*g zSYg&DI&|;ed*Xrb=AED9Rq%hx-Y1Vd6uo4jRBK2{3~vrByLdUQzl^yH=#arZid~jN zVuM7H6$t&lmhx^jwHpruH>UTtQ@esUnpH!8 z5a!qgu+}zzPe;GpM8tL2@16h;HUx^e68t-CUXa?C3WFZyo8Lgf(KQP{9;)tPxv7tYJW`F;%G&wV!^@r_ULi-NeHdO*jwDKrax&>+F8 zQ`~tfdyI82v)PXkUk3oL;UDnK@rK7_Ek>il;lD<8y@>5AKviLe>WkajSs3M4XHaKq zo~v0i$tUq~4OKc?up{9Jvl@tXQUloACh&kZZ&MVmi%wd5<`LE}A|7~dJWa?DF0f2- zfTe{AJ{8^D`tTIsP&>oMJ+lN+O3%^nS#e~z8pIY$Z%;|tvBb{|kk)ZCQo})@@f;zp zDuEf2%d)K+;xk-qX~97?{Fd*IzoZ{m#KH(V zy1V-;#!@8#2&*q!FMIO=Z1tE&%tW5zV?Uh}oqnumqEi=&d|EV?oyM{y#x+0UrdRXZ zfi>0WtTu|26ZmsJ;Z)EaiKa0h`@_5;rXKm4sKCmVUxec=&qoE_!YPIO2n1)|O3k%Y zqgE&CgZlH5|1NCOlUM&nezH*EZQyasVcF-Z`~?P-TV}rHwu_><1SWPDa?AXo-n?!r z`K;c2&MqfF?6I%Cmu`FP3R*?Xcel)H{D(`jF@H$ka za}zrS%V*s|s2&klJj)}f*mD39j?#|xQXlWjSM+3Te4RhL&T@=J33WBXB5EEE%gW1H z&gA?Nv^c)K;3I2XV-|*ezCb~5)9*|dp7Lnm9U1QuzW`!SlpL~$mv<}GZ}sH1X-ntn z>FFC7Vsb0a167m}eD{cOi)VS?1yd`tYUr$2T$Fa!#tCIFj?CztrxTLJ71sYnjyecd)gdBctyviCbGGQ}}9Mq!}b zrQ?{cbrIc!TxhVWhv*vWdJGlTZB1n>dhZ9j z*eCFejFs7{N0Nx27Z;xvbX)=JAJ3Pr%3>Mzw8j7r^I9(s`ecTp{*=GZEs7H2uCHmC zZT*u5TYe1<+{3uE^E~5rqL);_wqq4GIecXG(Ceb2N;hs4nD=Mo=ifyRqcj-#bv4F1 ztNs>4;4sCx)-52#ha25{@#1eP%h(Ek%8y0MjMGqN^blfZ~{c7AMMfox>iy&7|vbkcD(0fzP>vFbUb~V z1Qw?2JPe=4^9Q}+Y}H7@gi`qKxK<(%^|~uXeuf%hi>{~{x;kwZQ>f2FX!Ld3CpI}a zIPfI2x3wYd7}$lGP{Kf`jH;^VN*{iQOG2V~?o`q%$BdYp3B0M|D>g;2jbtIlmMZdS zZ!Kbf^@rP#ON%T?jSHM!sGl9S-TB8tSp$J@VR=mfMnrdxp~lLsz|$&Dv9uNBbsqK2 zN3;LIV7qsgChOK?TW;<46g%;-N?+-4D!Gy?|ID5kNl=5)4y?ReNbBp+quq(K92##E zArHAW?<|x7V`Pw-=Dn?symCv-^3fje^KQ7?l)_Ph463;n_%<^2Av5Gea! znOFPQvFM)~gZuAg|Iwh}fA7$L@6bOnPx{|x^8cNg*xPMBWMyiN<~th|d#_-C)457@ z=>&t0d8wi4WaQhvM${qrj>F$nfPbd;WO z>-78#%exkApU1m5wjlP*L+$HiJ7TWLG_=e9)|JJn_hwAj8QS_i{Y+P7pw^c*zqBxx z?~_EPLwRpg&YeE{DzgTDGBH^WNRl&E5`!NC3_6X;2dc80d+DHe;xoJ#|G81@|2M7^ zR9p6}$(>VZ52>p3CF`Y9{MG{W&~{tC)QSFX3jrf9C-YbsmL;}V~x zP_uq4P?}z{m7xgTwdHNS; z9V_GIG-|qMGSq)F`~y%)Crj)^+tm}3E|*U-y*7dH<0BX^qEEa?^|Rx!P`JYRr(4jI ziySF84G&9({SFeigJTe~s%vG6diJ$7wTb zoWsJD6PdL8^_!+);D+zw?*RcBJXLLIW&ZW62zs78|NDLo#`l-6XkK4Udl9PdH#gWo6n%Ey2Ps{6lJ7>bF zRMRsv%>h#r(3QSim4@IQGvJao=smeU)>7K5$h$wwtwe#@Ygyw4`?-0|Shf|F?w(mR zY<<=IT2N>5^LB5im7Z?;jc2NW8XB$%a)QAtU*BCyHBw*dMmIK2H>Wyg0d*P6I!^~$ zvwpVg-de^&2Sb9Wr3a+ykm<%M`?*gVhB+-h$KQdj#5olcE-o%RJ3FLF=55<{Z%hl& zW}lgPo@&I+&E4L%Pr{?%YZGWYQh;HuGEg`@Tw&5b++L4)s=q#3YK*b0OOwocsHL^| zw~R@AYA^}~O5qv_*)4U_gGvgVKleuN+4tUFNi{V!<02@`@3uix@J^voS8Ks5H|_*2 zCl?l`=s6Nsm%WR_4zElI1;g$VL1|4fR3E6nl++8CCWpTwaw zH#Ron?OOKNezI*$RoFDl{rqrasHmT|IP@4mG?|d$?qzT$cbI`eqE^9xJNcNYmS=8$ z?B%!osKzn-x0ZG8SI);YL07U1Y0BbeqNczw_RBKJtt)0ITMt@D+dEU8;x}TZ5&}JC z1V?$E-uc&1?el^>7oHw|3-}na2b8cb3J58~T*s<3(aizwc8xyYX8LSJQGsw_HO|$r~&t58)hQF zfPZ}a_^l%;?^#2HW@oYh3a8L~wbY|-QpOvLQG>+VqVi+|vA|3NSL`#@3;=C97^*Ux z6W=~uxKL__@`b@7?gj*T?TV`el0uFTxtaq)o1Ht8b<^p&?>EO91KY)r)6>>P5waV! zLl#~I&+})`P6#w;ikhMz{5v&0>=8d_!Lh7@N}dNl0oU4PYRzIK70XB8yXM0?cpKc8 z!>>R~U6WroJAba!0)6~*0A<&bVV@P+uZH_o`3NxHCUCh88XMfL@aEBec2Vx(P~pPhPprHd`sl&-?MZl)NLQ~ zf9ZG=dG}3RTz4^t_Pda)Ny-SR^@F^~7}IkB0Rg5uHZ2*yu9g%hCH0dK+ov#@VZbPw9R4RC-*AOjHZXUrk%j^qe8d6# zJYnj~2k9gprSGHBlJ$2yg2wN7h%^F1N6=Q&0Zpz#{a$Lm45h5e_}s<4RCPbK4#3w* qftEl1i*t(qu991O6xldi>DfLB)Ohm;VD*8PDke literal 0 HcmV?d00001 diff --git a/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-3-linux.png b/playwright/snapshots/pinned-messages/pinned-messages.spec.ts/pinned-messages-list-messages-3-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..98e804d897d1de7194d1c924ef1f3170f44e81f2 GIT binary patch literal 16907 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 span { - font-size: $font-12px; - line-height: $font-15px; - color: $secondary-content; - } + .mx_PinnedMessagesCard_Separator { + min-height: 1px; + /* Override default compound value */ + margin-block: 0; } } + .mx_PinnedMessagesCard_wrapper_unpin_all { + /* Remove the unpin all button height and the top and bottom padding */ + height: calc(100% - var(--unpin-height) - calc(var(--cpd-space-4x) * 2)); + } + + .mx_PinnedMessagesCard_unpin { + /* Make it float at the bottom of the unpin panel */ + position: absolute; + bottom: 0; + width: 100%; + height: var(--unpin-height); + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 4px 24px 0 rgba(27, 29, 34, 0.1); + background: var(--cpd-color-bg-canvas-default); + } + .mx_EventTile_body { word-break: break-word; } diff --git a/res/css/views/rooms/_PinnedEventTile.pcss b/res/css/views/rooms/_PinnedEventTile.pcss index e755c3a71d..b42de75649 100644 --- a/res/css/views/rooms/_PinnedEventTile.pcss +++ b/res/css/views/rooms/_PinnedEventTile.pcss @@ -15,95 +15,27 @@ limitations under the License. */ .mx_PinnedEventTile { - min-height: 40px; - width: 100%; - padding: 0 4px 12px; + display: flex; + gap: var(--cpd-space-4x); + align-items: flex-start; - display: grid; - grid-template-areas: - "avatar name remove" - "content content content" - "footer footer footer"; - grid-template-rows: max-content auto max-content; - grid-template-columns: 24px auto 24px; - grid-row-gap: 12px; - grid-column-gap: 8px; + .mx_PinnedEventTile_wrapper { + display: flex; + flex-direction: column; + gap: var(--cpd-space-1x); + width: 100%; - & + .mx_PinnedEventTile { - padding: 12px 4px; - border-top: 1px solid $menu-border-color; - } + .mx_PinnedEventTile_top { + display: flex; + gap: var(--cpd-space-1x); + justify-content: space-between; + align-items: center; - .mx_PinnedEventTile_senderAvatar, - .mx_PinnedEventTile_sender, - .mx_PinnedEventTile_unpinButton, - .mx_PinnedEventTile_message, - .mx_PinnedEventTile_footer { - min-width: 0; /* Prevent a grid blowout */ - } - - .mx_PinnedEventTile_senderAvatar { - grid-area: avatar; - } - - .mx_PinnedEventTile_sender { - grid-area: name; - font-weight: var(--cpd-font-weight-semibold); - font-size: $font-15px; - line-height: $font-24px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; - } - - .mx_PinnedEventTile_unpinButton { - visibility: hidden; - grid-area: remove; - position: relative; - width: 24px; - height: 24px; - border-radius: 8px; - - &:hover { - background-color: $roomheader-addroom-bg-color; - } - - &::before { - content: ""; - position: absolute; - height: inherit; - width: inherit; - background: $secondary-content; - mask-position: center; - mask-size: 8px; - mask-repeat: no-repeat; - mask-image: url("$(res)/img/image-view/close.svg"); - } - } - - .mx_PinnedEventTile_message { - grid-area: content; - } - - .mx_PinnedEventTile_footer { - grid-area: footer; - font-size: $font-10px; - line-height: 12px; - - .mx_PinnedEventTile_timestamp { - color: $secondary-content; - display: unset; - width: unset; /* Cancel the default width value */ - } - - .mx_AccessibleButton_kind_link { - margin-left: 12px; - } - } - - &:hover { - .mx_PinnedEventTile_unpinButton { - visibility: visible; + .mx_PinnedEventTile_sender { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } } } } diff --git a/src/components/structures/RightPanel.tsx b/src/components/structures/RightPanel.tsx index 9e228de611..8f1ba7aecf 100644 --- a/src/components/structures/RightPanel.tsx +++ b/src/components/structures/RightPanel.tsx @@ -34,7 +34,7 @@ import ThreadView from "./ThreadView"; import ThreadPanel from "./ThreadPanel"; import NotificationPanel from "./NotificationPanel"; import ResizeNotifier from "../../utils/ResizeNotifier"; -import PinnedMessagesCard from "../views/right_panel/PinnedMessagesCard"; +import { PinnedMessagesCard } from "../views/right_panel/PinnedMessagesCard"; import { RoomPermalinkCreator } from "../../utils/permalinks/Permalinks"; import { E2EStatus } from "../../utils/ShieldUtils"; import TimelineCard from "../views/right_panel/TimelineCard"; diff --git a/src/components/views/dialogs/UnpinAllDialog.tsx b/src/components/views/dialogs/UnpinAllDialog.tsx new file mode 100644 index 0000000000..ef7439d858 --- /dev/null +++ b/src/components/views/dialogs/UnpinAllDialog.tsx @@ -0,0 +1,77 @@ +/* + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { JSX } from "react"; +import { Button, Text } from "@vector-im/compound-web"; +import { EventType, MatrixClient } from "matrix-js-sdk/src/matrix"; +import { logger } from "matrix-js-sdk/src/logger"; + +import BaseDialog from "../dialogs/BaseDialog"; +import { _t } from "../../../languageHandler"; + +/** + * Properties for {@link UnpinAllDialog}. + */ +interface UnpinAllDialogProps { + /* + * The matrix client to use. + */ + matrixClient: MatrixClient; + /* + * The room ID to unpin all events in. + */ + roomId: string; + /* + * Callback for when the dialog is closed. + */ + onFinished: () => void; +} + +/** + * A dialog that asks the user to confirm unpinning all events in a room. + */ +export function UnpinAllDialog({ matrixClient, roomId, onFinished }: UnpinAllDialogProps): JSX.Element { + return ( + + {_t("right_panel|pinned_messages|unpin_all|content")} +

+ + ); +} diff --git a/src/components/views/right_panel/PinnedMessagesCard.tsx b/src/components/views/right_panel/PinnedMessagesCard.tsx index f813dd3427..85be2e6d03 100644 --- a/src/components/views/right_panel/PinnedMessagesCard.tsx +++ b/src/components/views/right_panel/PinnedMessagesCard.tsx @@ -14,41 +14,62 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { useCallback, useContext, useEffect, useState } from "react"; -import { Room, RoomEvent, RoomStateEvent, MatrixEvent, EventType, RelationType } from "matrix-js-sdk/src/matrix"; +import React, { useCallback, useEffect, useState, JSX } from "react"; +import { + Room, + RoomEvent, + RoomStateEvent, + MatrixEvent, + EventType, + RelationType, + EventTimeline, +} from "matrix-js-sdk/src/matrix"; import { logger } from "matrix-js-sdk/src/logger"; +import { Button, Separator } from "@vector-im/compound-web"; +import classNames from "classnames"; +import PinIcon from "@vector-im/compound-design-tokens/assets/web/icons/pin"; -import { Icon as ContextMenuIcon } from "../../../../res/img/element-icons/context-menu.svg"; -import { Icon as EmojiIcon } from "../../../../res/img/element-icons/room/message-bar/emoji.svg"; -import { Icon as ReplyIcon } from "../../../../res/img/element-icons/room/message-bar/reply.svg"; import { _t } from "../../../languageHandler"; import BaseCard from "./BaseCard"; import Spinner from "../elements/Spinner"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import { useTypedEventEmitter } from "../../../hooks/useEventEmitter"; import PinningUtils from "../../../utils/PinningUtils"; import { useAsyncMemo } from "../../../hooks/useAsyncMemo"; -import PinnedEventTile from "../rooms/PinnedEventTile"; +import { PinnedEventTile } from "../rooms/PinnedEventTile"; import { useRoomState } from "../../../hooks/useRoomState"; -import RoomContext, { TimelineRenderingType } from "../../../contexts/RoomContext"; +import RoomContext, { TimelineRenderingType, useRoomContext } from "../../../contexts/RoomContext"; import { ReadPinsEventId } from "./types"; import Heading from "../typography/Heading"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { filterBoolean } from "../../../utils/arrays"; +import Modal from "../../../Modal"; +import { UnpinAllDialog } from "../dialogs/UnpinAllDialog"; +import EmptyState from "./EmptyState"; -interface IProps { - room: Room; - permalinkCreator: RoomPermalinkCreator; - onClose(): void; -} - +/** + * Get the pinned event IDs from a room. + * @param room + */ function getPinnedEventIds(room?: Room): string[] { - return room?.currentState.getStateEvents(EventType.RoomPinnedEvents, "")?.getContent()?.pinned ?? []; + return ( + room + ?.getLiveTimeline() + .getState(EventTimeline.FORWARDS) + ?.getStateEvents(EventType.RoomPinnedEvents, "") + ?.getContent()?.pinned ?? [] + ); } +/** + * Get the pinned event IDs from a room. + * @param room + */ export const usePinnedEvents = (room?: Room): string[] => { const [pinnedEvents, setPinnedEvents] = useState(getPinnedEventIds(room)); + // Update the pinned events when the room state changes + // Filter out events that are not pinned events const update = useCallback( (ev?: MatrixEvent) => { if (ev && ev.getType() !== EventType.RoomPinnedEvents) return; @@ -57,7 +78,7 @@ export const usePinnedEvents = (room?: Room): string[] => { [room], ); - useTypedEventEmitter(room?.currentState, RoomStateEvent.Events, update); + useTypedEventEmitter(room?.getLiveTimeline().getState(EventTimeline.FORWARDS), RoomStateEvent.Events, update); useEffect(() => { setPinnedEvents(getPinnedEventIds(room)); return () => { @@ -67,13 +88,23 @@ export const usePinnedEvents = (room?: Room): string[] => { return pinnedEvents; }; +/** + * Get the read pinned event IDs from a room. + * @param room + */ function getReadPinnedEventIds(room?: Room): Set { return new Set(room?.getAccountData(ReadPinsEventId)?.getContent()?.event_ids ?? []); } +/** + * Get the read pinned event IDs from a room. + * @param room + */ export const useReadPinnedEvents = (room?: Room): Set => { const [readPinnedEvents, setReadPinnedEvents] = useState>(new Set()); + // Update the read pinned events when the room state changes + // Filter out events that are not read pinned events const update = useCallback( (ev?: MatrixEvent) => { if (ev && ev.getType() !== ReadPinsEventId) return; @@ -92,36 +123,36 @@ export const useReadPinnedEvents = (room?: Room): Set => { return readPinnedEvents; }; -const PinnedMessagesCard: React.FC = ({ room, onClose, permalinkCreator }) => { - const cli = useContext(MatrixClientContext); - const roomContext = useContext(RoomContext); - const canUnpin = useRoomState(room, (state) => state.mayClientSendStateEvent(EventType.RoomPinnedEvents, cli)); - const pinnedEventIds = usePinnedEvents(room); - const readPinnedEvents = useReadPinnedEvents(room); +/** + * Fetch the pinned events + * @param room + * @param pinnedEventIds + */ +function useFetchedPinnedEvents(room: Room, pinnedEventIds: string[]): Array | null { + const cli = useMatrixClientContext(); - useEffect(() => { - if (!cli || cli.isGuest()) return; // nothing to do - const newlyRead = pinnedEventIds.filter((id) => !readPinnedEvents.has(id)); - if (newlyRead.length > 0) { - // clear out any read pinned events which no longer are pinned - cli.setRoomAccountData(room.roomId, ReadPinsEventId, { - event_ids: pinnedEventIds, - }); - } - }, [cli, room.roomId, pinnedEventIds, readPinnedEvents]); - - const pinnedEvents = useAsyncMemo( + return useAsyncMemo( () => { const promises = pinnedEventIds.map(async (eventId): Promise => { const timelineSet = room.getUnfilteredTimelineSet(); + // Get the event from the local timeline const localEvent = timelineSet ?.getTimelineForEvent(eventId) ?.getEvents() .find((e) => e.getId() === eventId); + + // Decrypt the event if it's encrypted + // Can happen when the tab is refreshed and the pinned events card is opened directly + if (localEvent?.isEncrypted()) { + await cli.decryptEventIfNeeded(localEvent); + } + + // If the event is available locally, return it if it's pinnable + // Otherwise, return null if (localEvent) return PinningUtils.isPinnable(localEvent) ? localEvent : null; try { - // Fetch the event and latest edit in parallel + // The event is not available locally, so we fetch the event and latest edit in parallel const [ evJson, { @@ -131,10 +162,15 @@ const PinnedMessagesCard: React.FC = ({ room, onClose, permalinkCreator cli.fetchRoomEvent(room.roomId, eventId), cli.relations(room.roomId, eventId, RelationType.Replace, null, { limit: 1 }), ]); + const event = new MatrixEvent(evJson); + + // Decrypt the event if it's encrypted if (event.isEncrypted()) { - await cli.decryptEventIfNeeded(event); // TODO await? + await cli.decryptEventIfNeeded(event); } + + // Handle poll events await room.processPollEvents([event]); const senderUserId = event.getSender(); @@ -158,62 +194,59 @@ const PinnedMessagesCard: React.FC = ({ room, onClose, permalinkCreator [cli, room, pinnedEventIds], null, ); +} - let content: JSX.Element[] | JSX.Element | undefined; +/** + * List the pinned messages in a room inside a Card. + */ +interface PinnedMessagesCardProps { + /** + * The room to list the pinned messages for. + */ + room: Room; + /** + * Permalink of the room. + */ + permalinkCreator: RoomPermalinkCreator; + /** + * Callback for when the card is closed. + */ + onClose(): void; +} + +export function PinnedMessagesCard({ room, onClose, permalinkCreator }: PinnedMessagesCardProps): JSX.Element { + const cli = useMatrixClientContext(); + const roomContext = useRoomContext(); + const pinnedEventIds = usePinnedEvents(room); + const readPinnedEvents = useReadPinnedEvents(room); + const pinnedEvents = useFetchedPinnedEvents(room, pinnedEventIds); + + useEffect(() => { + if (!cli || cli.isGuest()) return; // nothing to do + const newlyRead = pinnedEventIds.filter((id) => !readPinnedEvents.has(id)); + if (newlyRead.length > 0) { + // clear out any read pinned events which no longer are pinned + cli.setRoomAccountData(room.roomId, ReadPinsEventId, { + event_ids: pinnedEventIds, + }); + } + }, [cli, room.roomId, pinnedEventIds, readPinnedEvents]); + + let content: JSX.Element; if (!pinnedEventIds.length) { content = ( -
-
- {/* XXX: We reuse the classes for simplicity, but deliberately not the components for non-interactivity. */} -
-
- -
-
- -
-
- -
-
- - - {_t("right_panel|pinned_messages|empty")} - - {_t( - "right_panel|pinned_messages|explainer", - {}, - { - b: (sub) => {sub}, - }, - )} -
-
+ ); } else if (pinnedEvents?.length) { - const onUnpinClicked = async (event: MatrixEvent): Promise => { - const pinnedEvents = room.currentState.getStateEvents(EventType.RoomPinnedEvents, ""); - if (pinnedEvents?.getContent()?.pinned) { - const pinned = pinnedEvents.getContent().pinned; - const index = pinned.indexOf(event.getId()); - if (index !== -1) { - pinned.splice(index, 1); - await cli.sendStateEvent(room.roomId, EventType.RoomPinnedEvents, { pinned }, ""); - } - } - }; - - // show them in reverse, with latest pinned at the top - content = filterBoolean(pinnedEvents) - .reverse() - .map((ev) => ( - onUnpinClicked(ev) : undefined} - permalinkCreator={permalinkCreator} - /> - )); + content = ( + + ); } else { content = ; } @@ -223,7 +256,7 @@ const PinnedMessagesCard: React.FC = ({ room, onClose, permalinkCreator header={
- {_t("right_panel|pinned_messages|title")} + {_t("right_panel|pinned_messages|header", { count: pinnedEventIds.length })}
} @@ -240,6 +273,79 @@ const PinnedMessagesCard: React.FC = ({ room, onClose, permalinkCreator ); -}; +} -export default PinnedMessagesCard; +/** + * The pinned messages in a room. + */ +interface PinnedMessagesProps { + /** + * The pinned events. + */ + events: MatrixEvent[]; + /** + * The room the events are in. + */ + room: Room; + /** + * The permalink creator to use. + */ + permalinkCreator: RoomPermalinkCreator; +} + +/** + * The pinned messages in a room. + */ +function PinnedMessages({ events, room, permalinkCreator }: PinnedMessagesProps): JSX.Element { + const matrixClient = useMatrixClientContext(); + + /** + * Whether the client can unpin events from the room. + */ + const canUnpin = useRoomState(room, (state) => + state.mayClientSendStateEvent(EventType.RoomPinnedEvents, matrixClient), + ); + + /** + * Opens the unpin all dialog. + */ + const onUnpinAll = useCallback(async (): Promise => { + Modal.createDialog(UnpinAllDialog, { + roomId: room.roomId, + matrixClient, + }); + }, [room, matrixClient]); + + return ( + <> +
+ {events.reverse().map((event, i) => ( + <> + + {/* Add a separator if this isn't the last pinned message */} + {events.length - 1 !== i && ( + + )} + + ))} +
+ {canUnpin && ( +
+ +
+ )} + + ); +} diff --git a/src/components/views/rooms/PinnedEventTile.tsx b/src/components/views/rooms/PinnedEventTile.tsx index 6c63efc352..5252e5124d 100644 --- a/src/components/views/rooms/PinnedEventTile.tsx +++ b/src/components/views/rooms/PinnedEventTile.tsx @@ -15,112 +15,206 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from "react"; -import { MatrixEvent, EventType, RelationType, Relations } from "matrix-js-sdk/src/matrix"; +import React, { JSX, useCallback, useState } from "react"; +import { EventTimeline, EventType, MatrixEvent, Room } from "matrix-js-sdk/src/matrix"; +import { IconButton, Menu, MenuItem, Separator, Text } from "@vector-im/compound-web"; +import { Icon as ViewIcon } from "@vector-im/compound-design-tokens/icons/visibility-on.svg"; +import { Icon as UnpinIcon } from "@vector-im/compound-design-tokens/icons/unpin.svg"; +import { Icon as ForwardIcon } from "@vector-im/compound-design-tokens/icons/forward.svg"; +import { Icon as TriggerIcon } from "@vector-im/compound-design-tokens/icons/overflow-horizontal.svg"; +import { Icon as DeleteIcon } from "@vector-im/compound-design-tokens/icons/delete.svg"; +import classNames from "classnames"; import dis from "../../../dispatcher/dispatcher"; import { Action } from "../../../dispatcher/actions"; -import AccessibleButton from "../elements/AccessibleButton"; import MessageEvent from "../messages/MessageEvent"; import MemberAvatar from "../avatars/MemberAvatar"; import { _t } from "../../../languageHandler"; -import { formatDate } from "../../../DateUtils"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { getUserNameColorClass } from "../../../utils/FormattingUtils"; import { ViewRoomPayload } from "../../../dispatcher/payloads/ViewRoomPayload"; import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; +import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; +import { useRoomState } from "../../../hooks/useRoomState"; +import { isContentActionable } from "../../../utils/EventUtils"; +import { getForwardableEvent } from "../../../events"; +import { OpenForwardDialogPayload } from "../../../dispatcher/payloads/OpenForwardDialogPayload"; +import { createRedactEventDialog } from "../dialogs/ConfirmRedactDialog"; -interface IProps { +const AVATAR_SIZE = "32px"; + +/** + * Properties for {@link PinnedEventTile}. + */ +interface PinnedEventTileProps { + /** + * The event to display. + */ event: MatrixEvent; + /** + * The permalink creator to use. + */ permalinkCreator: RoomPermalinkCreator; - onUnpinClicked?(): void; + /** + * The room the event is in. + */ + room: Room; } -const AVATAR_SIZE = "24px"; +/** + * A pinned event tile. + */ +export function PinnedEventTile({ event, room, permalinkCreator }: PinnedEventTileProps): JSX.Element { + const sender = event.getSender(); + if (!sender) { + throw new Error("Pinned event unexpectedly has no sender"); + } -export default class PinnedEventTile extends React.Component { - public static contextType = MatrixClientContext; - public declare context: React.ContextType; - - private onTileClicked = (): void => { - dis.dispatch({ - action: Action.ViewRoom, - event_id: this.props.event.getId(), - highlighted: true, - room_id: this.props.event.getRoomId(), - metricsTrigger: undefined, // room doesn't change - }); - }; - - // For event types like polls that use relations, we fetch those manually on - // mount and store them here, exposing them through getRelationsForEvent - private relations = new Map>(); - private getRelationsForEvent = ( - eventId: string, - relationType: RelationType | string, - eventType: EventType | string, - ): Relations | undefined => { - if (eventId === this.props.event.getId()) { - return this.relations.get(relationType)?.get(eventType); - } - }; - - public render(): React.ReactNode { - const sender = this.props.event.getSender(); - - if (!sender) { - throw new Error("Pinned event unexpectedly has no sender"); - } - - let unpinButton: JSX.Element | undefined; - if (this.props.onUnpinClicked) { - unpinButton = ( - - ); - } - - return ( -
+ return ( +
+
- - - {this.props.event.sender?.name || sender} - - - {unpinButton} - -
- {}} // we need to give this, apparently - permalinkCreator={this.props.permalinkCreator} - replacingEventId={this.props.event.replacingEventId()} - /> -
- -
- - {formatDate(new Date(this.props.event.getTs()))} - - - - {_t("common|view_message")} - -
- ); - } +
+
+ + {event.sender?.name || sender} + + +
+ {}} // we need to give this, apparently + permalinkCreator={permalinkCreator} + replacingEventId={event.replacingEventId()} + /> +
+
+ ); +} + +/** + * Properties for {@link PinMenu}. + */ +interface PinMenuProps extends PinnedEventTileProps {} + +/** + * A popover menu with actions on the pinned event + */ +function PinMenu({ event, room, permalinkCreator }: PinMenuProps): JSX.Element { + const [open, setOpen] = useState(false); + const matrixClient = useMatrixClientContext(); + + /** + * View the event in the timeline. + */ + const onViewInTimeline = useCallback(() => { + dis.dispatch({ + action: Action.ViewRoom, + event_id: event.getId(), + highlighted: true, + room_id: event.getRoomId(), + metricsTrigger: undefined, // room doesn't change + }); + }, [event]); + + /** + * Whether the client can unpin the event. + * Pin and unpin are using the same permission. + */ + const canUnpin = useRoomState(room, (state) => + state.mayClientSendStateEvent(EventType.RoomPinnedEvents, matrixClient), + ); + + /** + * Unpin the event. + * @param event + */ + const onUnpin = useCallback(async (): Promise => { + const pinnedEvents = room + .getLiveTimeline() + .getState(EventTimeline.FORWARDS) + ?.getStateEvents(EventType.RoomPinnedEvents, ""); + if (pinnedEvents?.getContent()?.pinned) { + const pinned = pinnedEvents.getContent().pinned; + const index = pinned.indexOf(event.getId()); + if (index !== -1) { + pinned.splice(index, 1); + await matrixClient.sendStateEvent(room.roomId, EventType.RoomPinnedEvents, { pinned }, ""); + } + } + }, [event, room, matrixClient]); + + const contentActionable = isContentActionable(event); + // Get the forwardable event for the given event + const forwardableEvent = contentActionable && getForwardableEvent(event, matrixClient); + /** + * Open the forward dialog. + */ + const onForward = useCallback(() => { + if (forwardableEvent) { + dis.dispatch({ + action: Action.OpenForwardDialog, + event: forwardableEvent, + permalinkCreator: permalinkCreator, + }); + } + }, [forwardableEvent, permalinkCreator]); + + /** + * Whether the client can redact the event. + */ + const canRedact = + room + .getLiveTimeline() + .getState(EventTimeline.FORWARDS) + ?.maySendRedactionForEvent(event, matrixClient.getSafeUserId()) && + event.getType() !== EventType.RoomServerAcl && + event.getType() !== EventType.RoomEncryption; + + /** + * Redact the event. + */ + const onRedact = useCallback( + (): void => + createRedactEventDialog({ + mxEvent: event, + }), + [event], + ); + + return ( + + + + } + > + + {canUnpin && } + {forwardableEvent && } + {canRedact && ( + <> + + + + )} + + ); } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 8bae5b5bad..1b7b1f2ed9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1839,12 +1839,24 @@ "files_button": "Files", "info": "Info", "pinned_messages": { - "empty": "Nothing pinned, yet", - "explainer": "If you have permissions, open the menu on any message and select Pin to stick them here.", + "empty_description": "Select a message and choose “%(pinAction)s” to it include here.", + "empty_title": "Pin important messages so that they can be easily discovered", + "header": { + "one": "1 Pinned message", + "other": "%(count)s Pinned messages", + "zero": "Pinned message" + }, "limits": { "other": "You can only pin up to %(count)s widgets" }, - "title": "Pinned messages" + "menu": "Open menu", + "title": "Pinned messages", + "unpin_all": { + "button": "Unpin all messages", + "content": "Make sure that you really want to remove all pinned messages. This action can’t be undone.", + "title": "Unpin all messages?" + }, + "view": "View in timeline" }, "pinned_messages_button": "Pinned messages", "poll": { diff --git a/test/components/views/dialogs/UnpinAllDialog-test.tsx b/test/components/views/dialogs/UnpinAllDialog-test.tsx new file mode 100644 index 0000000000..95018cc72d --- /dev/null +++ b/test/components/views/dialogs/UnpinAllDialog-test.tsx @@ -0,0 +1,46 @@ +/* + * Copyright 2024 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React from "react"; +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { EventType } from "matrix-js-sdk/src/matrix"; + +import { UnpinAllDialog } from "../../../../src/components/views/dialogs/UnpinAllDialog"; +import { createTestClient } from "../../../test-utils"; + +describe("", () => { + const client = createTestClient(); + const roomId = "!room:example.org"; + + function renderDialog(onFinished = jest.fn()) { + return render(); + } + + it("should render", () => { + const { asFragment } = renderDialog(); + expect(asFragment()).toMatchSnapshot(); + }); + + it("should remove all pinned events when clicked on Continue", async () => { + const onFinished = jest.fn(); + renderDialog(onFinished); + + await userEvent.click(screen.getByText("Continue")); + expect(client.sendStateEvent).toHaveBeenCalledWith(roomId, EventType.RoomPinnedEvents, { pinned: [] }, ""); + expect(onFinished).toHaveBeenCalled(); + }); +}); diff --git a/test/components/views/dialogs/__snapshots__/UnpinAllDialog-test.tsx.snap b/test/components/views/dialogs/__snapshots__/UnpinAllDialog-test.tsx.snap new file mode 100644 index 0000000000..8213a9b917 --- /dev/null +++ b/test/components/views/dialogs/__snapshots__/UnpinAllDialog-test.tsx.snap @@ -0,0 +1,66 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should render 1`] = ` + +
+