You've already forked matrix-react-sdk
							
							
				mirror of
				https://github.com/matrix-org/matrix-react-sdk.git
				synced 2025-11-03 00:33:22 +03:00 
			
		
		
		
	Fix decryption failure bar covering the timeline (#10360)
* Use grid layout instead - BEM naming style - Increase block gap from 4px to 8px - Use flexbox inside 'header' grid-area to let the buttons wrapped - Use variables - Remove 4px gap when one of the buttons is not rendered - Change 'body' to 'message' - Set 'align-self: start' to the icon and spinner Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Unset height of spinner Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Break lines at newline characters with white-space: pre-line Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Edit tests to check decryption failure bars on narrow timeline - checkTimelineNarrow() looks for buttons by default - Test indicator as well Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Remove a line Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Edit the test to have it check mx_EventTile_last only inside mx_RoomView_body Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Fix double underscores Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Fix double underscores - pcss Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Iterate - buttons at the bottom - Set common spacing to buttons with variables - Remove line breaks, yarn run i18n - Set data-testid for headlines and buttons in case the tested strings would be displayed elsewhere simultaneously Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Check waiting headline as well Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Increase spacing between the message and the buttons Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * lint Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Increase block gap between wrapped buttons for clickability Apply 8px between wrapped buttons Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Revert bottom margin of buttons which are not expected to be wrapped Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Check visibility instead of existence This commit removes data-testid from headlines and data-testid-button and checks whether the elements are really visible, not overflowing the viewport. Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Remove redundant gap between 'mx_DecryptionFailureBar_start' and the bottom edge This commit adds '.mx_DecryptionFailureBar--withEnd' class name to have it applied to the bar only if it has button(s). This way the bar is rendered with a flexbox and the row-gap declaration is respected only if there is a 'mx_DecryptionFailureBar--withEnd' element. The element currently includes the button(s) only. Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * lint - prettier Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> * Have Percy take a snapshot of the bar loading spinner before checkTimelineNarrow() The loading spinner is likely to disappear while checking the bar on the narrow timeline. Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> --------- Signed-off-by: Suguru Hirahara <luixxiul@users.noreply.github.com> Co-authored-by: Kerry <kerrya@element.io>
This commit is contained in:
		@@ -57,6 +57,28 @@ const handleVerificationRequest = (request: VerificationRequest): Chainable<Emoj
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const checkTimelineNarrow = (button = true) => {
 | 
			
		||||
    cy.viewport(800, 600); // SVGA
 | 
			
		||||
    cy.get(".mx_LeftPanel_minimized").should("exist"); // Wait until the left panel is minimized
 | 
			
		||||
    cy.get(".mx_RightPanel_roomSummaryButton").click(); // Open the right panel to make the timeline narrow
 | 
			
		||||
    cy.get(".mx_BaseCard").should("exist");
 | 
			
		||||
 | 
			
		||||
    // Ensure the failure bar does not cover the timeline
 | 
			
		||||
    cy.get(".mx_RoomView_body .mx_EventTile.mx_EventTile_last").should("be.visible");
 | 
			
		||||
 | 
			
		||||
    // Ensure the indicator does not overflow the timeline
 | 
			
		||||
    cy.get("[data-testid='decryption-failure-bar-indicator']").should("be.visible");
 | 
			
		||||
 | 
			
		||||
    if (button) {
 | 
			
		||||
        // Ensure the button does not overflow the timeline
 | 
			
		||||
        cy.get("[data-testid='decryption-failure-bar-button']:last-of-type").should("be.visible");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    cy.get(".mx_RightPanel_roomSummaryButton").click(); // Close the right panel
 | 
			
		||||
    cy.get(".mx_BaseCard").should("not.exist");
 | 
			
		||||
    cy.viewport(1000, 660); // Reset to the default size
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
describe("Decryption Failure Bar", () => {
 | 
			
		||||
    let homeserver: HomeserverInstance | undefined;
 | 
			
		||||
    let testUser: UserCredentials | undefined;
 | 
			
		||||
@@ -113,10 +135,13 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
                })
 | 
			
		||||
                .then(() => {
 | 
			
		||||
                    cy.botSendMessage(bot, roomId, "test");
 | 
			
		||||
                    cy.contains(".mx_DecryptionFailureBar_start_headline", "Decrypting messages…").should("be.visible");
 | 
			
		||||
                    cy.contains(
 | 
			
		||||
                        ".mx_DecryptionFailureBar .mx_DecryptionFailureBar_message_headline",
 | 
			
		||||
                        ".mx_DecryptionFailureBar_start_headline",
 | 
			
		||||
                        "Verify this device to access all messages",
 | 
			
		||||
                    );
 | 
			
		||||
                    ).should("be.visible");
 | 
			
		||||
 | 
			
		||||
                    checkTimelineNarrow();
 | 
			
		||||
 | 
			
		||||
                    cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
 | 
			
		||||
                        "DecryptionFailureBar prompts user to verify",
 | 
			
		||||
@@ -125,12 +150,14 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
                        },
 | 
			
		||||
                    );
 | 
			
		||||
 | 
			
		||||
                    cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").should("not.exist");
 | 
			
		||||
                    cy.contains(".mx_DecryptionFailureBar_button", "Verify").click();
 | 
			
		||||
                    cy.contains(".mx_DecryptionFailureBar_end", "Resend key requests").should("not.exist");
 | 
			
		||||
                    cy.contains(".mx_DecryptionFailureBar_end", "Verify").should("be.visible").click();
 | 
			
		||||
 | 
			
		||||
                    const verificationRequestPromise = waitForVerificationRequest(otherDevice);
 | 
			
		||||
                    cy.get(".mx_CompleteSecurity_actionRow .mx_AccessibleButton").click();
 | 
			
		||||
                    cy.contains("To proceed, please accept the verification request on your other device.");
 | 
			
		||||
                    cy.contains("To proceed, please accept the verification request on your other device.").should(
 | 
			
		||||
                        "be.visible",
 | 
			
		||||
                    );
 | 
			
		||||
                    cy.wrap(verificationRequestPromise).then((verificationRequest: VerificationRequest) => {
 | 
			
		||||
                        cy.wrap(verificationRequest.accept());
 | 
			
		||||
                        handleVerificationRequest(verificationRequest).then((emojis) => {
 | 
			
		||||
@@ -146,10 +173,12 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
            cy.get(".mx_VerificationPanel_verified_section .mx_E2EIcon_verified").should("exist");
 | 
			
		||||
            cy.contains(".mx_AccessibleButton", "Got it").click();
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar .mx_DecryptionFailureBar_message_headline").should(
 | 
			
		||||
                "have.text",
 | 
			
		||||
            cy.contains(
 | 
			
		||||
                ".mx_DecryptionFailureBar_start_headline",
 | 
			
		||||
                "Open another device to load encrypted messages",
 | 
			
		||||
            );
 | 
			
		||||
            ).should("be.visible");
 | 
			
		||||
 | 
			
		||||
            checkTimelineNarrow();
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
 | 
			
		||||
                "DecryptionFailureBar prompts user to open another device, with Resend Key Requests button",
 | 
			
		||||
@@ -159,9 +188,12 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            cy.intercept("/_matrix/client/r0/sendToDevice/m.room_key_request/*").as("keyRequest");
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").click();
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_end_button", "Resend key requests").should("be.visible").click();
 | 
			
		||||
            cy.wait("@keyRequest");
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_button", "Resend key requests").should("not.exist");
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_end_button", "Resend key requests").should("not.exist");
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_end_button", "View your device list").should("be.visible");
 | 
			
		||||
 | 
			
		||||
            checkTimelineNarrow();
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
 | 
			
		||||
                "DecryptionFailureBar prompts user to open another device, without Resend Key Requests button",
 | 
			
		||||
@@ -184,15 +216,17 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
 | 
			
		||||
            cy.botSendMessage(bot, roomId, "test");
 | 
			
		||||
            cy.contains(
 | 
			
		||||
                ".mx_DecryptionFailureBar .mx_DecryptionFailureBar_message_headline",
 | 
			
		||||
                ".mx_DecryptionFailureBar_start_headline",
 | 
			
		||||
                "Reset your keys to prevent future decryption errors",
 | 
			
		||||
            );
 | 
			
		||||
            ).should("be.visible");
 | 
			
		||||
 | 
			
		||||
            checkTimelineNarrow();
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar").percySnapshotElement("DecryptionFailureBar prompts user to reset keys", {
 | 
			
		||||
                widths: [320, 640],
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_button", "Reset").click();
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_end_button", "Reset").should("be.visible").click();
 | 
			
		||||
 | 
			
		||||
            // Set up key backup
 | 
			
		||||
            cy.get(".mx_Dialog").within(() => {
 | 
			
		||||
@@ -204,11 +238,12 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
                cy.contains("Done").click();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar .mx_DecryptionFailureBar_message_headline").should(
 | 
			
		||||
                "have.text",
 | 
			
		||||
                "Some messages could not be decrypted",
 | 
			
		||||
            cy.contains(".mx_DecryptionFailureBar_start_headline", "Some messages could not be decrypted").should(
 | 
			
		||||
                "be.visible",
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            checkTimelineNarrow(false); // button should not be rendered here
 | 
			
		||||
 | 
			
		||||
            cy.get(".mx_DecryptionFailureBar").percySnapshotElement(
 | 
			
		||||
                "DecryptionFailureBar displays general message with no call to action",
 | 
			
		||||
                {
 | 
			
		||||
@@ -233,9 +268,11 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
            widths: [320, 640],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        checkTimelineNarrow();
 | 
			
		||||
 | 
			
		||||
        cy.wait(5000);
 | 
			
		||||
        cy.get(".mx_DecryptionFailureBar .mx_Spinner").should("not.exist");
 | 
			
		||||
        cy.get(".mx_DecryptionFailureBar .mx_DecryptionFailureBar_icon").should("exist");
 | 
			
		||||
        cy.get("[data-testid='decryption-failure-bar-icon']").should("be.visible");
 | 
			
		||||
 | 
			
		||||
        cy.get(".mx_RoomView_messagePanel").scrollTo("top");
 | 
			
		||||
        cy.get(".mx_DecryptionFailureBar").should("not.exist");
 | 
			
		||||
@@ -245,5 +282,7 @@ describe("Decryption Failure Bar", () => {
 | 
			
		||||
 | 
			
		||||
        cy.get(".mx_RoomView_messagePanel").scrollTo("bottom");
 | 
			
		||||
        cy.get(".mx_DecryptionFailureBar").should("exist");
 | 
			
		||||
 | 
			
		||||
        checkTimelineNarrow();
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,8 @@ $timeline-image-border-radius: 8px;
 | 
			
		||||
    --transition-short: 0.1s;
 | 
			
		||||
    --transition-standard: 0.3s;
 | 
			
		||||
    --MessageTimestamp-width: $MessageTimestamp_width;
 | 
			
		||||
    --buttons-dialog-gap-row: $spacing-8;
 | 
			
		||||
    --buttons-dialog-gap-column: $spacing-8;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@media only percy {
 | 
			
		||||
@@ -525,8 +527,8 @@ legend {
 | 
			
		||||
    margin-inline-start: auto;
 | 
			
		||||
 | 
			
		||||
    /* default gap among elements */
 | 
			
		||||
    column-gap: $spacing-8; /* See margin-right below inside the button style */
 | 
			
		||||
    row-gap: 5px; /* See margin-bottom below inside the button style */
 | 
			
		||||
    column-gap: var(--buttons-dialog-gap-column);
 | 
			
		||||
    row-gap: var(--buttons-dialog-gap-row);
 | 
			
		||||
 | 
			
		||||
    button {
 | 
			
		||||
        margin: 0 !important; /* override the margin settings */
 | 
			
		||||
@@ -548,7 +550,7 @@ legend {
 | 
			
		||||
.mx_Dialog_buttons input[type="submit"] {
 | 
			
		||||
    @mixin mx_DialogButton;
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    margin-right: 8px;
 | 
			
		||||
    margin-right: var(--buttons-dialog-gap-column);
 | 
			
		||||
    margin-bottom: 5px;
 | 
			
		||||
 | 
			
		||||
    /* flip colours for the secondary ones */
 | 
			
		||||
 
 | 
			
		||||
@@ -15,46 +15,73 @@ limitations under the License.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar {
 | 
			
		||||
    --gap-row: $spacing-8;
 | 
			
		||||
    --gap-column: $spacing-12;
 | 
			
		||||
    --gap: var(--gap-row) var(--gap-column);
 | 
			
		||||
    --size-icon: 24px;
 | 
			
		||||
 | 
			
		||||
    background-color: $system;
 | 
			
		||||
    padding: $spacing-12;
 | 
			
		||||
    margin-left: $spacing-16;
 | 
			
		||||
    margin-right: $spacing-16;
 | 
			
		||||
    margin-inline: $spacing-16;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
 | 
			
		||||
    &.mx_DecryptionFailureBar--withEnd {
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-flow: wrap;
 | 
			
		||||
        align-items: flex-start;
 | 
			
		||||
    gap: $spacing-12;
 | 
			
		||||
        justify-content: space-between;
 | 
			
		||||
        row-gap: calc(var(--gap-row) + $spacing-4); /* Increase spacing between the message and the buttons */
 | 
			
		||||
 | 
			
		||||
        .mx_DecryptionFailureBar_end {
 | 
			
		||||
            display: flex;
 | 
			
		||||
            flex-wrap: wrap; /* Let the buttons wrapped on a narrow column */
 | 
			
		||||
            gap: var(--buttons-dialog-gap-row) var(--buttons-dialog-gap-column);
 | 
			
		||||
            margin-inline-start: calc(var(--size-icon) + var(--gap-column)); /* Align the button(s) and the message */
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_icon {
 | 
			
		||||
    width: 24px;
 | 
			
		||||
    height: 24px;
 | 
			
		||||
    .mx_DecryptionFailureBar_start {
 | 
			
		||||
        display: grid;
 | 
			
		||||
        gap: var(--gap);
 | 
			
		||||
        grid-template-areas:
 | 
			
		||||
            "status headline"
 | 
			
		||||
            ".      message";
 | 
			
		||||
        grid-template-columns: var(--size-icon) auto;
 | 
			
		||||
 | 
			
		||||
        .mx_DecryptionFailureBar_start_status {
 | 
			
		||||
            grid-area: status;
 | 
			
		||||
 | 
			
		||||
            display: flex;
 | 
			
		||||
            align-items: center;
 | 
			
		||||
            gap: var(--gap);
 | 
			
		||||
 | 
			
		||||
            .mx_Spinner {
 | 
			
		||||
                height: unset; /* Unset height: 100% */
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            .mx_DecryptionFailureBar_start_status_icon {
 | 
			
		||||
                min-width: var(--size-icon);
 | 
			
		||||
                height: var(--size-icon);
 | 
			
		||||
                mask-image: url("$(res)/img/e2e/decryption-failure.svg");
 | 
			
		||||
                background-color: $e2e-warning-color;
 | 
			
		||||
                mask-repeat: no-repeat;
 | 
			
		||||
                mask-position: center;
 | 
			
		||||
                mask-size: contain;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_icon,
 | 
			
		||||
.mx_DecryptionFailureBar .mx_Spinner {
 | 
			
		||||
    flex-shrink: 0;
 | 
			
		||||
    flex-grow: 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_message {
 | 
			
		||||
    flex-grow: 1;
 | 
			
		||||
}
 | 
			
		||||
        .mx_DecryptionFailureBar_start_headline {
 | 
			
		||||
            grid-area: headline;
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_message_headline {
 | 
			
		||||
            font-weight: $font-semi-bold;
 | 
			
		||||
            font-size: $font-16px;
 | 
			
		||||
    margin-bottom: $spacing-4;
 | 
			
		||||
            align-self: center;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_message_body {
 | 
			
		||||
        .mx_DecryptionFailureBar_start_message {
 | 
			
		||||
            grid-area: message;
 | 
			
		||||
 | 
			
		||||
            color: $secondary-content;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
.mx_DecryptionFailureBar_button {
 | 
			
		||||
    flex-shrink: 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -145,34 +145,47 @@ export const DecryptionFailureBar: React.FC<IProps> = ({ failures }) => {
 | 
			
		||||
        store.resetConfirm();
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const statusIndicator = waiting ? <Spinner /> : <div className="mx_DecryptionFailureBar_icon" />;
 | 
			
		||||
    const statusIndicator = waiting ? (
 | 
			
		||||
        <Spinner w={24} h={24} />
 | 
			
		||||
    ) : (
 | 
			
		||||
        <div className="mx_DecryptionFailureBar_start_status_icon" data-testid="decryption-failure-bar-icon" />
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    let className;
 | 
			
		||||
    let headline: JSX.Element;
 | 
			
		||||
    let body: JSX.Element;
 | 
			
		||||
    let message: JSX.Element;
 | 
			
		||||
    let button = <React.Fragment />;
 | 
			
		||||
    if (waiting) {
 | 
			
		||||
        className = "mx_DecryptionFailureBar";
 | 
			
		||||
        headline = <React.Fragment>{_t("Decrypting messages…")}</React.Fragment>;
 | 
			
		||||
        body = (
 | 
			
		||||
        message = (
 | 
			
		||||
            <React.Fragment>
 | 
			
		||||
                {_t("Please wait as we try to decrypt your messages. This may take a few moments.")}
 | 
			
		||||
            </React.Fragment>
 | 
			
		||||
        );
 | 
			
		||||
    } else if (needsVerification) {
 | 
			
		||||
        if (hasOtherVerifiedDevices || hasKeyBackup) {
 | 
			
		||||
            className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd";
 | 
			
		||||
            headline = <React.Fragment>{_t("Verify this device to access all messages")}</React.Fragment>;
 | 
			
		||||
            body = (
 | 
			
		||||
            message = (
 | 
			
		||||
                <React.Fragment>
 | 
			
		||||
                    {_t("This device was unable to decrypt some messages because it has not been verified yet.")}
 | 
			
		||||
                </React.Fragment>
 | 
			
		||||
            );
 | 
			
		||||
            button = (
 | 
			
		||||
                <AccessibleButton kind="primary" onClick={onVerifyClick}>
 | 
			
		||||
                <AccessibleButton
 | 
			
		||||
                    className="mx_DecryptionFailureBar_end_button"
 | 
			
		||||
                    kind="primary"
 | 
			
		||||
                    onClick={onVerifyClick}
 | 
			
		||||
                    data-testid="decryption-failure-bar-button"
 | 
			
		||||
                >
 | 
			
		||||
                    {_t("Verify")}
 | 
			
		||||
                </AccessibleButton>
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd";
 | 
			
		||||
            headline = <React.Fragment>{_t("Reset your keys to prevent future decryption errors")}</React.Fragment>;
 | 
			
		||||
            body = (
 | 
			
		||||
            message = (
 | 
			
		||||
                <React.Fragment>
 | 
			
		||||
                    {_t(
 | 
			
		||||
                        "You will not be able to access old undecryptable messages, " +
 | 
			
		||||
@@ -181,14 +194,20 @@ export const DecryptionFailureBar: React.FC<IProps> = ({ failures }) => {
 | 
			
		||||
                </React.Fragment>
 | 
			
		||||
            );
 | 
			
		||||
            button = (
 | 
			
		||||
                <AccessibleButton kind="primary" onClick={onResetClick}>
 | 
			
		||||
                <AccessibleButton
 | 
			
		||||
                    className="mx_DecryptionFailureBar_end_button"
 | 
			
		||||
                    kind="primary"
 | 
			
		||||
                    onClick={onResetClick}
 | 
			
		||||
                    data-testid="decryption-failure-bar-button"
 | 
			
		||||
                >
 | 
			
		||||
                    {_t("Reset")}
 | 
			
		||||
                </AccessibleButton>
 | 
			
		||||
            );
 | 
			
		||||
        }
 | 
			
		||||
    } else if (hasOtherVerifiedDevices) {
 | 
			
		||||
        className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd";
 | 
			
		||||
        headline = <React.Fragment>{_t("Open another device to load encrypted messages")}</React.Fragment>;
 | 
			
		||||
        body = (
 | 
			
		||||
        message = (
 | 
			
		||||
            <React.Fragment>
 | 
			
		||||
                {_t(
 | 
			
		||||
                    "This device is requesting decryption keys from your other devices. " +
 | 
			
		||||
@@ -197,13 +216,19 @@ export const DecryptionFailureBar: React.FC<IProps> = ({ failures }) => {
 | 
			
		||||
            </React.Fragment>
 | 
			
		||||
        );
 | 
			
		||||
        button = (
 | 
			
		||||
            <AccessibleButton kind="primary_outline" onClick={onDeviceListClick}>
 | 
			
		||||
            <AccessibleButton
 | 
			
		||||
                className="mx_DecryptionFailureBar_end_button"
 | 
			
		||||
                kind="primary_outline"
 | 
			
		||||
                onClick={onDeviceListClick}
 | 
			
		||||
                data-testid="decryption-failure-bar-button"
 | 
			
		||||
            >
 | 
			
		||||
                {_t("View your device list")}
 | 
			
		||||
            </AccessibleButton>
 | 
			
		||||
        );
 | 
			
		||||
    } else {
 | 
			
		||||
        className = "mx_DecryptionFailureBar";
 | 
			
		||||
        headline = <React.Fragment>{_t("Some messages could not be decrypted")}</React.Fragment>;
 | 
			
		||||
        body = (
 | 
			
		||||
        message = (
 | 
			
		||||
            <React.Fragment>
 | 
			
		||||
                {_t(
 | 
			
		||||
                    "Unfortunately, there are no other verified devices to request decryption keys from. " +
 | 
			
		||||
@@ -215,24 +240,32 @@ export const DecryptionFailureBar: React.FC<IProps> = ({ failures }) => {
 | 
			
		||||
 | 
			
		||||
    let keyRequestButton = <React.Fragment />;
 | 
			
		||||
    if (!needsVerification && hasOtherVerifiedDevices && anyUnrequestedSessions) {
 | 
			
		||||
        className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd";
 | 
			
		||||
        keyRequestButton = (
 | 
			
		||||
            <div className="mx_DecryptionFailureBar_button">
 | 
			
		||||
                <AccessibleButton kind="primary" onClick={sendKeyRequests}>
 | 
			
		||||
            <AccessibleButton
 | 
			
		||||
                className="mx_DecryptionFailureBar_end_button"
 | 
			
		||||
                kind="primary"
 | 
			
		||||
                onClick={sendKeyRequests}
 | 
			
		||||
                data-testid="decryption-failure-bar-button"
 | 
			
		||||
            >
 | 
			
		||||
                {_t("Resend key requests")}
 | 
			
		||||
            </AccessibleButton>
 | 
			
		||||
            </div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <div className="mx_DecryptionFailureBar">
 | 
			
		||||
            {statusIndicator}
 | 
			
		||||
            <div className="mx_DecryptionFailureBar_message">
 | 
			
		||||
                <div className="mx_DecryptionFailureBar_message_headline">{headline}</div>
 | 
			
		||||
                <div className="mx_DecryptionFailureBar_message_body">{body}</div>
 | 
			
		||||
        <div className={className}>
 | 
			
		||||
            <div className="mx_DecryptionFailureBar_start">
 | 
			
		||||
                <div className="mx_DecryptionFailureBar_start_status">
 | 
			
		||||
                    <div data-testid="decryption-failure-bar-indicator">{statusIndicator}</div>
 | 
			
		||||
                </div>
 | 
			
		||||
            <div className="mx_DecryptionFailureBar_button">{button}</div>
 | 
			
		||||
                <div className="mx_DecryptionFailureBar_start_headline">{headline}</div>
 | 
			
		||||
                <div className="mx_DecryptionFailureBar_start_message">{message}</div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div className="mx_DecryptionFailureBar_end">
 | 
			
		||||
                {button}
 | 
			
		||||
                {keyRequestButton}
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -5,24 +5,33 @@ exports[`<DecryptionFailureBar /> Displays a general error message if there are
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
  />
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Some messages could not be decrypted
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  />
 | 
			
		||||
</div>
 | 
			
		||||
`;
 | 
			
		||||
@@ -30,6 +39,15 @@ exports[`<DecryptionFailureBar /> Displays a general error message if there are
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays a loading spinner 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_Spinner"
 | 
			
		||||
@@ -39,66 +57,72 @@ exports[`<DecryptionFailureBar /> Displays a loading spinner 1`] = `
 | 
			
		||||
            class="mx_Spinner_icon"
 | 
			
		||||
            data-testid="spinner"
 | 
			
		||||
            role="progressbar"
 | 
			
		||||
      style="width: 32px; height: 32px;"
 | 
			
		||||
            style="width: 24px; height: 24px;"
 | 
			
		||||
          />
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Decrypting messages…
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      Please wait as we try to decrypt your messages. This may take a few moments.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  />
 | 
			
		||||
</div>
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays button to resend key requests if we are verified 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
      View your device list
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -110,30 +134,40 @@ exports[`<DecryptionFailureBar /> Displays button to resend key requests if we a
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays button to resend key requests if we are verified 2`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -145,41 +179,48 @@ exports[`<DecryptionFailureBar /> Displays button to resend key requests if we a
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays the button to resend key requests only if there are sessions we haven't already requested 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
      View your device list
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -191,30 +232,40 @@ exports[`<DecryptionFailureBar /> Displays the button to resend key requests onl
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays the button to resend key requests only if there are sessions we haven't already requested 2`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -226,41 +277,48 @@ exports[`<DecryptionFailureBar /> Displays the button to resend key requests onl
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays the button to resend key requests only if there are sessions we haven't already requested 3`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
      View your device list
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -272,30 +330,40 @@ exports[`<DecryptionFailureBar /> Displays the button to resend key requests onl
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Displays the button to resend key requests only if there are sessions we haven't already requested 4`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -307,30 +375,40 @@ exports[`<DecryptionFailureBar /> Displays the button to resend key requests onl
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Does not display a button to send key requests if we are unverified 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Verify this device to access all messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device was unable to decrypt some messages because it has not been verified yet.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -342,30 +420,40 @@ exports[`<DecryptionFailureBar /> Does not display a button to send key requests
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Handles device updates 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Verify this device to access all messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device was unable to decrypt some messages because it has not been verified yet.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -377,41 +465,48 @@ exports[`<DecryptionFailureBar /> Handles device updates 1`] = `
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Handles device updates 2`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
      View your device list
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -423,30 +518,40 @@ exports[`<DecryptionFailureBar /> Handles device updates 2`] = `
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Prompts the user to reset if they have no other verified devices and no backups 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Reset your keys to prevent future decryption errors
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -458,30 +563,40 @@ exports[`<DecryptionFailureBar /> Prompts the user to reset if they have no othe
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Prompts the user to verify if they have backups 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Verify this device to access all messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device was unable to decrypt some messages because it has not been verified yet.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -493,30 +608,40 @@ exports[`<DecryptionFailureBar /> Prompts the user to verify if they have backup
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Prompts the user to verify if they have other devices 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Verify this device to access all messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device was unable to decrypt some messages because it has not been verified yet.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
@@ -528,41 +653,48 @@ exports[`<DecryptionFailureBar /> Prompts the user to verify if they have other
 | 
			
		||||
 | 
			
		||||
exports[`<DecryptionFailureBar /> Recommends opening other devices if there are other verified devices 1`] = `
 | 
			
		||||
<div
 | 
			
		||||
  class="mx_DecryptionFailureBar"
 | 
			
		||||
  class="mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"
 | 
			
		||||
>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_icon"
 | 
			
		||||
    class="mx_DecryptionFailureBar_start"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_status"
 | 
			
		||||
    >
 | 
			
		||||
      <div
 | 
			
		||||
        data-testid="decryption-failure-bar-indicator"
 | 
			
		||||
      >
 | 
			
		||||
        <div
 | 
			
		||||
          class="mx_DecryptionFailureBar_start_status_icon"
 | 
			
		||||
          data-testid="decryption-failure-bar-icon"
 | 
			
		||||
        />
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_message"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_headline"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_headline"
 | 
			
		||||
    >
 | 
			
		||||
      Open another device to load encrypted messages
 | 
			
		||||
    </div>
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_DecryptionFailureBar_message_body"
 | 
			
		||||
      class="mx_DecryptionFailureBar_start_message"
 | 
			
		||||
    >
 | 
			
		||||
      This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
    class="mx_DecryptionFailureBar_end"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary_outline"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
      View your device list
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
    <div
 | 
			
		||||
    class="mx_DecryptionFailureBar_button"
 | 
			
		||||
  >
 | 
			
		||||
    <div
 | 
			
		||||
      class="mx_AccessibleButton mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      class="mx_AccessibleButton mx_DecryptionFailureBar_end_button mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary"
 | 
			
		||||
      data-testid="decryption-failure-bar-button"
 | 
			
		||||
      role="button"
 | 
			
		||||
      tabindex="0"
 | 
			
		||||
    >
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user