Skip to content

Commit 6d73517

Browse files
authored
Add passwordless support to prefill (#1505)
The `prefill` option makes the input text to be automatically filled with the given value. For example #### Will initialize the email input with `foo@bar.com` ```js prefill: { email: 'foo@bar.com' } ``` #### Will initialize the phone input with `489999999` ```js prefill: { phoneNumber: '489999999' } ``` This was already supported by Auth0Lock. This PR adds support for the same behavior in Auth0LockPasswordless.
1 parent 3525fd4 commit 6d73517

File tree

3 files changed

+70
-10
lines changed

3 files changed

+70
-10
lines changed
+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { mockComponent } from 'testUtils';
2+
const getEngine = () => require('engine/passwordless').default;
3+
4+
jest.mock('core/error_screen', () => mockComponent('error_screen'));
5+
jest.mock('core/loading_screen', () => mockComponent('loading_screen'));
6+
jest.mock('engine/passwordless/social_or_email_login_screen', () =>
7+
mockComponent('social_or_email_login_screen')
8+
);
9+
jest.mock('engine/passwordless/social_or_phone_number_login_screen', () =>
10+
mockComponent('social_or_phone_number_login_screen')
11+
);
12+
jest.mock('connection/passwordless/ask_vcode', () => mockComponent('ask_vcode'));
13+
jest.mock('core/sso/last_login_screen', () => mockComponent('last_login_screen'));
14+
15+
describe('Passwordless Engine', () => {
16+
describe('didReceiveClientSettings calls setPrefill', () => {
17+
beforeEach(() => {
18+
jest.resetModules();
19+
jest.mock('core/index', () => ({
20+
hasSomeConnections: () => true,
21+
prefill: () => ({
22+
toJS() {
23+
return {
24+
email: 'prefill@example.com',
25+
phoneNumber: '12354'
26+
};
27+
}
28+
})
29+
}));
30+
jest.mock('field/email', () => ({
31+
setEmail: jest.fn(m => m)
32+
}));
33+
jest.mock('field/phone_number', () => ({
34+
setPhoneNumber: jest.fn(m => m)
35+
}));
36+
});
37+
it('when prefill options has `email` value', () => {
38+
const engine = getEngine();
39+
engine.didReceiveClientSettings('model');
40+
const setEmailMockCalls = require('field/email').setEmail.mock.calls;
41+
expect(setEmailMockCalls.length).toBe(1);
42+
expect(setEmailMockCalls[0][0]).toBe('model');
43+
expect(setEmailMockCalls[0][1]).toBe('prefill@example.com');
44+
});
45+
it('when prefill options has `phoneNumber` value', () => {
46+
const engine = getEngine();
47+
engine.didReceiveClientSettings('model');
48+
const setPhoneNumberMockCalls = require('field/phone_number').setPhoneNumber.mock.calls;
49+
expect(setPhoneNumberMockCalls.length).toBe(1);
50+
expect(setPhoneNumberMockCalls[0][0]).toBe('model');
51+
expect(setPhoneNumberMockCalls[0][1]).toBe('12354');
52+
});
53+
});
54+
});

src/engine/passwordless.js

+14-9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ import { isDone, isSuccess } from '../sync';
1616
import * as l from '../core/index';
1717
import { hasSkippedQuickAuth } from '../quick_auth';
1818
import * as sso from '../core/sso/index';
19+
import { setEmail } from '../field/email';
20+
import { setPhoneNumber } from '../field/phone_number';
21+
22+
const setPrefill = m => {
23+
const { email, phoneNumber } = l.prefill(m).toJS();
24+
if (typeof email === 'string') {
25+
m = setEmail(m, email);
26+
}
27+
if (typeof phoneNumber === 'string') {
28+
m = setPhoneNumber(m, phoneNumber);
29+
}
30+
return m;
31+
};
1932

2033
class Passwordless {
2134
didInitialize(m, opts) {
@@ -36,6 +49,7 @@ class Passwordless {
3649
error.code = 'no_connection';
3750
m = l.stop(m, error);
3851
}
52+
m = setPrefill(m);
3953

4054
return m;
4155
}
@@ -80,15 +94,6 @@ class Passwordless {
8094
} else {
8195
return passwordlessStarted(m) ? new VcodeScreen() : new SocialOrPhoneNumberLoginScreen();
8296
}
83-
84-
setTimeout(() => {
85-
const stopError = new Error('Internal error');
86-
stopError.code = 'internal_error';
87-
stopError.description = "Couldn't find a screen to render";
88-
swap(updateEntity, 'lock', l.id(m), l.stop, stopError);
89-
}, 0);
90-
91-
return new ErrorScreen();
9297
}
9398
}
9499

support/index.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ <h1 class="navbar-brand">
117117
usernameStyle: 'email',
118118
defaultDatabaseConnection: 'acme',
119119
prefill: {
120-
email: 'johnfoo@gmail.com'
120+
email: 'johnfoo@gmail.com',
121+
phoneNumber: '48999999999'
121122
},
122123
passwordlessMethod: 'code',
123124
allowedConnections: ['email', 'acme', 'twitter']

0 commit comments

Comments
 (0)