From aa01b17f9efbbb5c861330906f58f69cce34beb5 Mon Sep 17 00:00:00 2001 From: R Midhun Suresh Date: Mon, 3 Feb 2025 00:07:12 +0530 Subject: [PATCH] Always show back button in the right panel (#29128) * Construct history on setCard So that back buttons are always shown in the right panel * Check card state to ensure operation is atomic * Fix tests * Fix lint * Remove null case * Fix broken test --- playwright/e2e/read-receipts/index.ts | 3 +- .../with-four-members-linux.png | Bin 18082 -> 18392 bytes src/stores/right-panel/RightPanelStore.ts | 60 ++++++++++++++++-- .../right-panel/RightPanelStore-test.ts | 9 ++- 4 files changed, 61 insertions(+), 11 deletions(-) diff --git a/playwright/e2e/read-receipts/index.ts b/playwright/e2e/read-receipts/index.ts index eab261042e..384cef1d5e 100644 --- a/playwright/e2e/read-receipts/index.ts +++ b/playwright/e2e/read-receipts/index.ts @@ -526,9 +526,10 @@ class Helpers { await expect(threadPanel).toBeVisible(); await threadPanel.evaluate(($panel) => { const $button = $panel.querySelector('[data-testid="base-card-back-button"]'); + const title = $panel.querySelector(".mx_BaseCard_header_title")?.textContent; // If the Threads back button is present then click it - the // threads button can open either threads list or thread panel - if ($button) { + if ($button && title !== "Threads") { $button.click(); } }); diff --git a/playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png b/playwright/snapshots/right-panel/memberlist.spec.ts/with-four-members-linux.png index 460eec3a8c18305eee0da1bbadcd43a44efd1a5d..d8bab27faa947e5558dfcc85f4e24e382b87b1cf 100644 GIT binary patch literal 18392 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­i!|}kqqWPqqVzOs(Z{c#x?yu6>M_POi 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 literal 18082 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 S5c8ok09h%ePn8m1zyCK<>of=e diff --git a/src/stores/right-panel/RightPanelStore.ts b/src/stores/right-panel/RightPanelStore.ts index 42077daded..b89851691a 100644 --- a/src/stores/right-panel/RightPanelStore.ts +++ b/src/stores/right-panel/RightPanelStore.ts @@ -30,6 +30,23 @@ import { ActiveRoomChangedPayload } from "../../dispatcher/payloads/ActiveRoomCh import { SdkContextClass } from "../../contexts/SDKContext"; import { MatrixClientPeg } from "../../MatrixClientPeg"; +/** + * @see RightPanelStore#generateHistoryForPhase + */ +function getPhasesForPhase(phase: IRightPanelCard["phase"]): RightPanelPhases[] { + switch (phase) { + case RightPanelPhases.ThreadPanel: + case RightPanelPhases.MemberList: + case RightPanelPhases.PinnedMessages: + return [RightPanelPhases.RoomSummary]; + case RightPanelPhases.MemberInfo: + case RightPanelPhases.ThreePidMemberInfo: + return [RightPanelPhases.RoomSummary, RightPanelPhases.MemberList]; + default: + return []; + } +} + /** * A class for tracking the state of the right panel between layouts and * sessions. This state includes a history for each room. Each history element @@ -134,16 +151,20 @@ export default class RightPanelStore extends ReadyWatchingStore { return { state: {}, phase: null }; } - // Setters + /** + * This function behaves as following: + * - If the same phase is sent along with a non-empty state, only the state is updated and history is retained. + * - If the provided phase is different to the current phase: + * - Existing history is thrown away. + * - New card is added along with a different history, see {@link generateHistoryForPhase} + * + * If the right panel was set, this function also shows the right panel. + */ public setCard(card: IRightPanelCard, allowClose = true, roomId?: string): void { const rId = roomId ?? this.viewedRoomId ?? ""; - // This function behaves as following: - // Update state: if the same phase is send but with a state - // Set right panel and erase history: if a "different to the current" phase is send (with or without a state) - // If the right panel is set, this function also shows the right panel. const redirect = this.getVerificationRedirect(card); const targetPhase = redirect?.phase ?? card.phase; - const cardState = redirect?.state ?? (Object.keys(card.state ?? {}).length === 0 ? null : card.state); + const cardState = redirect?.state ?? (Object.keys(card.state ?? {}).length === 0 ? undefined : card.state); // Checks for wrong SetRightPanelPhase requests if (!this.isPhaseValid(targetPhase, Boolean(rId))) return; @@ -155,7 +176,7 @@ export default class RightPanelStore extends ReadyWatchingStore { this.emitAndUpdateSettings(); } else if (targetPhase !== this.currentCardForRoom(rId)?.phase || !this.byRoom[rId]) { // Set right panel and initialize/erase history - const history = [{ phase: targetPhase, state: cardState ?? {} }]; + const history = this.generateHistoryForPhase(targetPhase!, cardState ?? {}); this.byRoom[rId] = { history, isOpen: true }; this.emitAndUpdateSettings(); } else { @@ -247,6 +268,31 @@ export default class RightPanelStore extends ReadyWatchingStore { } } + /** + * For a given phase, generates card history such that it looks + * similar to how an user typically would reach said phase in the app. + * eg: User would usually reach the memberlist via room-info panel, so + * that history is added. + */ + private generateHistoryForPhase( + phase: IRightPanelCard["phase"], + cardState?: Partial, + ): IRightPanelCard[] { + const card = { phase, state: cardState }; + if (!this.isCardStateValid(card)) { + /** + * If the card we're adding is not valid, then we just return + * an empty history. + * This is to avoid a scenario where, for eg, you set a member info + * card with invalid card state (no member) but the member list is + * shown since the created history is valid except for the last card. + */ + return []; + } + const cards = getPhasesForPhase(phase).map((p) => ({ phase: p, state: {} })); + return [...cards, card]; + } + private loadCacheFromSettings(): void { if (this.viewedRoomId) { const room = this.mxClient?.getRoom(this.viewedRoomId); diff --git a/test/unit-tests/stores/right-panel/RightPanelStore-test.ts b/test/unit-tests/stores/right-panel/RightPanelStore-test.ts index 1897649cee..8dc197405b 100644 --- a/test/unit-tests/stores/right-panel/RightPanelStore-test.ts +++ b/test/unit-tests/stores/right-panel/RightPanelStore-test.ts @@ -114,11 +114,14 @@ describe("RightPanelStore", () => { expect(store.isOpenForRoom("!1:example.org")).toEqual(true); expect(store.currentCardForRoom("!1:example.org").phase).toEqual(RightPanelPhases.RoomSummary); }); - it("overwrites history if changing the phase", async () => { + it("history is generated for certain phases", async () => { await viewRoom("!1:example.org"); - store.setCard({ phase: RightPanelPhases.RoomSummary }, true, "!1:example.org"); + // Setting the memberlist card should also generate a history with room summary card store.setCard({ phase: RightPanelPhases.MemberList }, true, "!1:example.org"); - expect(store.roomPhaseHistory).toEqual([{ phase: RightPanelPhases.MemberList, state: {} }]); + expect(store.roomPhaseHistory).toEqual([ + { phase: RightPanelPhases.RoomSummary, state: {} }, + { phase: RightPanelPhases.MemberList, state: {} }, + ]); }); });