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:
parent
bebfbacded
commit
232daaff68
5 changed files with 471 additions and 238 deletions
|
@ -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>
|
||||
);
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue