From d1c5274738d60826c1ce0e5b6e410373141b1674 Mon Sep 17 00:00:00 2001 From: Dan J Miller Date: Tue, 15 Feb 2022 20:29:59 -0330 Subject: [PATCH] Ensure sign message button is only enabled on scroll (#13645) * Ensure sign message button is only enabled on scroll * Add button for message scrolling to signature request screen * lint fix * Only show scroll button if message is scrollable Co-authored-by: ryanml --- test/e2e/tests/signature-request.spec.js | 7 ++-- .../signature-request-footer/index.scss | 8 +++- .../signature-request-message/index.scss | 13 ++++++ .../signature-request-message.component.js | 41 ++++++++++++++----- .../signature-request.component.js | 2 + 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/test/e2e/tests/signature-request.spec.js b/test/e2e/tests/signature-request.spec.js index b1276865a..335826069 100644 --- a/test/e2e/tests/signature-request.spec.js +++ b/test/e2e/tests/signature-request.spec.js @@ -66,10 +66,9 @@ describe('Sign Typed Data V4 Signature Request', function () { ); assert.equal(await message.getText(), 'Hello, Bob!'); // Approve signing typed data - await driver.executeScript(` - const lastNodeInMessage = document.querySelectorAll('.signature-request-message--node')[7]; - lastNodeInMessage.scrollIntoView(); - `); + await driver.clickElement( + '[data-testid="signature-request-scroll-button"]', + ); await driver.delay(regularDelayMs); await driver.clickElement({ text: 'Sign', tag: 'button' }); await driver.waitUntilXWindowHandles(2); diff --git a/ui/components/app/signature-request/signature-request-footer/index.scss b/ui/components/app/signature-request/signature-request-footer/index.scss index b1470d3e3..e679bef43 100644 --- a/ui/components/app/signature-request/signature-request-footer/index.scss +++ b/ui/components/app/signature-request/signature-request-footer/index.scss @@ -9,10 +9,16 @@ } button:first-child { - margin-left: 1rem; + flex: 1 1 100%; + padding: 0; } button:last-child { + flex: 1 1 100%; margin-right: 1rem; } + + &__tooltip { + display: flex; + } } diff --git a/ui/components/app/signature-request/signature-request-message/index.scss b/ui/components/app/signature-request/signature-request-message/index.scss index ed4fea304..14f8d4f39 100644 --- a/ui/components/app/signature-request/signature-request-message/index.scss +++ b/ui/components/app/signature-request/signature-request-message/index.scss @@ -3,6 +3,7 @@ display: flex; max-height: 250px; flex-direction: column; + position: relative; &__title { @include H6; @@ -57,4 +58,16 @@ &--node-leaf { display: flex; } + + &__scroll-button { + display: flex; + align-items: center; + justify-content: center; + background-color: var(--Grey-500); + position: absolute; + right: 24px; + bottom: 12px; + border-radius: 50%; + cursor: pointer; + } } diff --git a/ui/components/app/signature-request/signature-request-message/signature-request-message.component.js b/ui/components/app/signature-request/signature-request-message/signature-request-message.component.js index fbdc8671b..3c186f4c5 100644 --- a/ui/components/app/signature-request/signature-request-message/signature-request-message.component.js +++ b/ui/components/app/signature-request/signature-request-message/signature-request-message.component.js @@ -8,24 +8,24 @@ export default class SignatureRequestMessage extends PureComponent { data: PropTypes.object.isRequired, onMessageScrolled: PropTypes.func, setMessageRootRef: PropTypes.func, + messageRootRef: PropTypes.object, + messageIsScrollable: PropTypes.bool, }; static contextTypes = { t: PropTypes.func, }; - messageAreaRef; - state = { messageIsScrolled: false, }; setMessageIsScrolled = () => { - if (!this.messageAreaRef || this.state.messageIsScrolled) { + if (!this.props.messageRootRef || this.state.messageIsScrolled) { return; } - const { scrollTop, offsetHeight, scrollHeight } = this.messageAreaRef; + const { scrollTop, offsetHeight, scrollHeight } = this.props.messageRootRef; const isAtBottom = scrollTop + offsetHeight >= scrollHeight; if (isAtBottom) { @@ -63,17 +63,36 @@ export default class SignatureRequestMessage extends PureComponent { ); } - render() { - const { data } = this.props; - + renderScrollButton() { return (
{ - this.messageAreaRef = ref; + onClick={() => { + this.setState({ messageIsScrolled: true }); + this.props.onMessageScrolled(); + this.props.messageRootRef.scrollTo( + 0, + this.props.messageRootRef.scrollHeight, + ); }} - className="signature-request-message" + className="signature-request-message__scroll-button" + data-testid="signature-request-scroll-button" > + {this.context.t('scrollDown')} +
+ ); + } + + render() { + const { data, messageIsScrollable } = this.props; + + return ( +
+ {messageIsScrollable ? this.renderScrollButton() : null}
{this.context.t('signatureRequest1')}
diff --git a/ui/components/app/signature-request/signature-request.component.js b/ui/components/app/signature-request/signature-request.component.js index abc9a1a76..164221e16 100644 --- a/ui/components/app/signature-request/signature-request.component.js +++ b/ui/components/app/signature-request/signature-request.component.js @@ -139,6 +139,8 @@ export default class SignatureRequest extends PureComponent { data={sanitizeMessage(message, primaryType, types)} onMessageScrolled={() => this.setState({ hasScrolledMessage: true })} setMessageRootRef={this.setMessageRootRef.bind(this)} + messageRootRef={this.messageRootRef} + messageIsScrollable={messageIsScrollable} />