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>
pull/28788/head^2
Suguru Hirahara 2023-03-30 18:11:16 +09:00 committed by GitHub
parent bebfbacded
commit 232daaff68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 471 additions and 238 deletions

View File

@ -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();
});
});

View File

@ -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 */

View File

@ -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;
display: flex;
align-items: flex-start;
gap: $spacing-12;
}
.mx_DecryptionFailureBar_icon {
width: 24px;
height: 24px;
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--withEnd {
display: flex;
flex-flow: wrap;
align-items: flex-start;
justify-content: space-between;
row-gap: calc(var(--gap-row) + $spacing-4); /* Increase spacing between the message and the buttons */
.mx_DecryptionFailureBar_icon,
.mx_DecryptionFailureBar .mx_Spinner {
flex-shrink: 0;
flex-grow: 0;
}
.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_message {
flex-grow: 1;
}
.mx_DecryptionFailureBar_start {
display: grid;
gap: var(--gap);
grid-template-areas:
"status headline"
". message";
grid-template-columns: var(--size-icon) auto;
.mx_DecryptionFailureBar_message_headline {
font-weight: $font-semi-bold;
font-size: $font-16px;
margin-bottom: $spacing-4;
}
.mx_DecryptionFailureBar_start_status {
grid-area: status;
.mx_DecryptionFailureBar_message_body {
color: $secondary-content;
}
display: flex;
align-items: center;
gap: var(--gap);
.mx_DecryptionFailureBar_button {
flex-shrink: 0;
.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_start_headline {
grid-area: headline;
font-weight: $font-semi-bold;
font-size: $font-16px;
align-self: center;
}
.mx_DecryptionFailureBar_start_message {
grid-area: message;
color: $secondary-content;
}
}
}

View File

@ -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}>
{_t("Resend key requests")}
</AccessibleButton>
</div>
<AccessibleButton
className="mx_DecryptionFailureBar_end_button"
kind="primary"
onClick={sendKeyRequests}
data-testid="decryption-failure-bar-button"
>
{_t("Resend key requests")}
</AccessibleButton>
);
}
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_start_headline">{headline}</div>
<div className="mx_DecryptionFailureBar_start_message">{message}</div>
</div>
<div className="mx_DecryptionFailureBar_end">
{button}
{keyRequestButton}
</div>
<div className="mx_DecryptionFailureBar_button">{button}</div>
{keyRequestButton}
</div>
);
};

View File

@ -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>
`;
@ -32,73 +41,88 @@ exports[`<DecryptionFailureBar /> Displays a loading spinner 1`] = `
class="mx_DecryptionFailureBar"
>
<div
class="mx_Spinner"
class="mx_DecryptionFailureBar_start"
>
<div
aria-label="Loading…"
class="mx_Spinner_icon"
data-testid="spinner"
role="progressbar"
style="width: 32px; height: 32px;"
/>
</div>
<div
class="mx_DecryptionFailureBar_message"
>
class="mx_DecryptionFailureBar_start_status"
>
<div
data-testid="decryption-failure-bar-indicator"
>
<div
class="mx_Spinner"
>
<div
aria-label="Loading…"
class="mx_Spinner_icon"
data-testid="spinner"
role="progressbar"
style="width: 24px; height: 24px;"
/>
</div>
</div>
</div>
<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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
/>
<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"
>
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"
>