Skip to content

Commit 40269ad

Browse files
ryanmldanjm
andauthored
Fixing sign type data message formatting, requiring content scroll before sign (#13642)
* Fixing signature request formatting, requiring scroll before sign * Ensure sign button not disable when no scroll is required * Test fix attempt #1 * Clean up e2e tests Co-authored-by: Dan Miller <danjm.com@gmail.com>
1 parent 3dc60e8 commit 40269ad

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

test/e2e/tests/signature-request.spec.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
const { strict: assert } = require('assert');
2-
const { convertToHexValue, withFixtures } = require('../helpers');
2+
const {
3+
convertToHexValue,
4+
withFixtures,
5+
regularDelayMs,
6+
} = require('../helpers');
37

48
describe('Sign Typed Data V4 Signature Request', function () {
59
it('can initiate and confirm a Signature Request', async function () {
@@ -61,8 +65,12 @@ describe('Sign Typed Data V4 Signature Request', function () {
6165
)}`,
6266
);
6367
assert.equal(await message.getText(), 'Hello, Bob!');
64-
6568
// Approve signing typed data
69+
await driver.executeScript(`
70+
const lastNodeInMessage = document.querySelectorAll('.signature-request-message--node')[7];
71+
lastNodeInMessage.scrollIntoView();
72+
`);
73+
await driver.delay(regularDelayMs);
6674
await driver.clickElement({ text: 'Sign', tag: 'button' });
6775
await driver.waitUntilXWindowHandles(2);
6876
windowHandles = await driver.getAllWindowHandles();

ui/components/app/signature-request/signature-request-message/index.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.signature-request-message {
22
flex: 1 60%;
33
display: flex;
4+
max-height: 250px;
45
flex-direction: column;
56

67
&__title {

ui/components/app/signature-request/signature-request-message/signature-request-message.component.js

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,41 @@
11
import React, { PureComponent } from 'react';
22
import PropTypes from 'prop-types';
3+
import { debounce } from 'lodash';
34
import classnames from 'classnames';
45

56
export default class SignatureRequestMessage extends PureComponent {
67
static propTypes = {
78
data: PropTypes.object.isRequired,
9+
onMessageScrolled: PropTypes.func,
10+
setMessageRootRef: PropTypes.func,
811
};
912

1013
static contextTypes = {
1114
t: PropTypes.func,
1215
};
1316

17+
messageAreaRef;
18+
19+
state = {
20+
messageIsScrolled: false,
21+
};
22+
23+
setMessageIsScrolled = () => {
24+
if (!this.messageAreaRef || this.state.messageIsScrolled) {
25+
return;
26+
}
27+
28+
const { scrollTop, offsetHeight, scrollHeight } = this.messageAreaRef;
29+
const isAtBottom = scrollTop + offsetHeight >= scrollHeight;
30+
31+
if (isAtBottom) {
32+
this.setState({ messageIsScrolled: true });
33+
this.props.onMessageScrolled();
34+
}
35+
};
36+
37+
onScroll = debounce(this.setMessageIsScrolled, 25);
38+
1439
renderNode(data) {
1540
return (
1641
<div className="signature-request-message--node">
@@ -42,11 +67,20 @@ export default class SignatureRequestMessage extends PureComponent {
4267
const { data } = this.props;
4368

4469
return (
45-
<div className="signature-request-message">
70+
<div
71+
onScroll={this.onScroll}
72+
ref={(ref) => {
73+
this.messageAreaRef = ref;
74+
}}
75+
className="signature-request-message"
76+
>
4677
<div className="signature-request-message__title">
4778
{this.context.t('signatureRequest1')}
4879
</div>
49-
<div className="signature-request-message--root">
80+
<div
81+
className="signature-request-message--root"
82+
ref={this.props.setMessageRootRef}
83+
>
5084
{this.renderNode(data)}
5185
</div>
5286
</div>

ui/components/app/signature-request/signature-request.component.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ export default class SignatureRequest extends PureComponent {
4444
metricsEvent: PropTypes.func,
4545
};
4646

47+
state = {
48+
hasScrolledMessage: false,
49+
};
50+
51+
setMessageRootRef(ref) {
52+
this.messageRootRef = ref;
53+
}
54+
4755
formatWallet(wallet) {
4856
return `${wallet.slice(0, 8)}...${wallet.slice(
4957
wallet.length - 8,
@@ -97,6 +105,9 @@ export default class SignatureRequest extends PureComponent {
97105
});
98106
};
99107

108+
const messageIsScrollable =
109+
this.messageRootRef?.scrollHeight > this.messageRootRef?.clientHeight;
110+
100111
return (
101112
<div className="signature-request page-container">
102113
<Header fromAccount={fromAccount} />
@@ -124,11 +135,18 @@ export default class SignatureRequest extends PureComponent {
124135
<LedgerInstructionField showDataInstruction />
125136
</div>
126137
) : null}
127-
<Message data={sanitizeMessage(message, primaryType, types)} />
138+
<Message
139+
data={sanitizeMessage(message, primaryType, types)}
140+
onMessageScrolled={() => this.setState({ hasScrolledMessage: true })}
141+
setMessageRootRef={this.setMessageRootRef.bind(this)}
142+
/>
128143
<Footer
129144
cancelAction={onCancel}
130145
signAction={onSign}
131-
disabled={hardwareWalletRequiresConnection}
146+
disabled={
147+
hardwareWalletRequiresConnection ||
148+
(messageIsScrollable && !this.state.hasScrolledMessage)
149+
}
132150
/>
133151
</div>
134152
);

0 commit comments

Comments
 (0)