tweaks to the user email verification process #236
3 changed files with 68 additions and 38 deletions
|
@ -216,6 +216,10 @@ class AppWithNavigationState extends React.Component {
|
||||||
this.setState({ emailVerifyDone: true });
|
this.setState({ emailVerifyDone: true });
|
||||||
const message = emailVerifyErrorMessage ?
|
const message = emailVerifyErrorMessage ?
|
||||||
String(emailVerifyErrorMessage) : 'Your email address was successfully verified.';
|
String(emailVerifyErrorMessage) : 'Your email address was successfully verified.';
|
||||||
|
if (!emailVerifyErrorMessage) {
|
||||||
|
AsyncStorage.removeItem(Constants.KEY_FIRST_RUN_EMAIL);
|
||||||
|
}
|
||||||
|
AsyncStorage.removeItem(Constants.KEY_SHOULD_VERIFY_EMAIL);
|
||||||
dispatch(doNotify({ message, displayType: ['toast'] }));
|
dispatch(doNotify({ message, displayType: ['toast'] }));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,16 +1,25 @@
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { doBalanceSubscribe, doNotify } from 'lbry-redux';
|
import { doBalanceSubscribe, doNotify } from 'lbry-redux';
|
||||||
import { doAuthenticate, doUserEmailVerify, doUserEmailVerifyFailure, selectUser } from 'lbryinc';
|
import {
|
||||||
|
doAuthenticate,
|
||||||
|
doUserEmailToVerify,
|
||||||
|
doUserEmailVerify,
|
||||||
|
doUserEmailVerifyFailure,
|
||||||
|
selectUser,
|
||||||
|
selectEmailToVerify
|
||||||
|
} from 'lbryinc';
|
||||||
import SplashScreen from './view';
|
import SplashScreen from './view';
|
||||||
|
|
||||||
const select = state => ({
|
const select = state => ({
|
||||||
user: selectUser(state),
|
user: selectUser(state),
|
||||||
|
emailToVerify: selectEmailToVerify(state)
|
||||||
});
|
});
|
||||||
|
|
||||||
const perform = dispatch => ({
|
const perform = dispatch => ({
|
||||||
authenticate: (appVersion, deviceId) => dispatch(doAuthenticate(appVersion, deviceId)),
|
authenticate: (appVersion, deviceId) => dispatch(doAuthenticate(appVersion, deviceId)),
|
||||||
balanceSubscribe: () => dispatch(doBalanceSubscribe()),
|
balanceSubscribe: () => dispatch(doBalanceSubscribe()),
|
||||||
notify: data => dispatch(doNotify(data)),
|
notify: data => dispatch(doNotify(data)),
|
||||||
|
setEmailToVerify: email => dispatch(doUserEmailToVerify(email)),
|
||||||
verifyUserEmail: (token, recaptcha) => dispatch(doUserEmailVerify(token, recaptcha)),
|
verifyUserEmail: (token, recaptcha) => dispatch(doUserEmailVerify(token, recaptcha)),
|
||||||
verifyUserEmailFailure: error => dispatch(doUserEmailVerifyFailure(error)),
|
verifyUserEmailFailure: error => dispatch(doUserEmailVerifyFailure(error)),
|
||||||
});
|
});
|
||||||
|
|
|
@ -57,47 +57,62 @@ class SplashScreen extends React.PureComponent {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUpdate(nextProps) {
|
componentWillReceiveProps(nextProps) {
|
||||||
const { navigation, verifyUserEmail, verifyUserEmailFailure } = this.props;
|
const {
|
||||||
|
emailToVerify,
|
||||||
|
navigation,
|
||||||
|
setEmailToVerify,
|
||||||
|
verifyUserEmail,
|
||||||
|
verifyUserEmailFailure
|
||||||
|
} = this.props;
|
||||||
const { user } = nextProps;
|
const { user } = nextProps;
|
||||||
if (this.state.daemonReady && this.state.shouldAuthenticate && user && user.id) {
|
|
||||||
// user is authenticated, navigate to the main view
|
|
||||||
const resetAction = NavigationActions.reset({
|
|
||||||
index: 0,
|
|
||||||
actions: [
|
|
||||||
NavigationActions.navigate({ routeName: 'Main'})
|
|
||||||
]
|
|
||||||
});
|
|
||||||
navigation.dispatch(resetAction);
|
|
||||||
|
|
||||||
const launchUrl = navigation.state.params.launchUrl || this.state.launchUrl;
|
if (this.state.daemonReady && this.state.shouldAuthenticate && user && user.id) {
|
||||||
if (launchUrl) {
|
this.setState({ shouldAuthenticate: false }, () => {
|
||||||
if (launchUrl.startsWith('lbry://?verify=')) {
|
AsyncStorage.getItem(Constants.KEY_FIRST_RUN_EMAIL).then(email => {
|
||||||
let verification = {};
|
if (email) {
|
||||||
try {
|
setEmailToVerify(email);
|
||||||
verification = JSON.parse(atob(launchUrl.substring(15)));
|
|
||||||
} catch (error) {
|
|
||||||
console.log(error);
|
|
||||||
}
|
}
|
||||||
if (verification.token && verification.recaptcha) {
|
|
||||||
AsyncStorage.setItem(Constants.KEY_SHOULD_VERIFY_EMAIL, 'true');
|
// user is authenticated, navigate to the main view
|
||||||
try {
|
const resetAction = NavigationActions.reset({
|
||||||
verifyUserEmail(verification.token, verification.recaptcha);
|
index: 0,
|
||||||
} catch (error) {
|
actions: [
|
||||||
const message = 'Invalid Verification Token';
|
NavigationActions.navigate({ routeName: 'Main'})
|
||||||
verifyUserEmailFailure(message);
|
]
|
||||||
notify({ message, displayType: ['toast'] });
|
});
|
||||||
|
navigation.dispatch(resetAction);
|
||||||
|
|
||||||
|
const launchUrl = navigation.state.params.launchUrl || this.state.launchUrl;
|
||||||
|
if (launchUrl) {
|
||||||
|
if (launchUrl.startsWith('lbry://?verify=')) {
|
||||||
|
let verification = {};
|
||||||
|
try {
|
||||||
|
verification = JSON.parse(atob(launchUrl.substring(15)));
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
if (verification.token && verification.recaptcha) {
|
||||||
|
AsyncStorage.setItem(Constants.KEY_SHOULD_VERIFY_EMAIL, 'true');
|
||||||
|
try {
|
||||||
|
verifyUserEmail(verification.token, verification.recaptcha);
|
||||||
|
} catch (error) {
|
||||||
|
const message = 'Invalid Verification Token';
|
||||||
|
verifyUserEmailFailure(message);
|
||||||
|
notify({ message, displayType: ['toast'] });
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notify({
|
||||||
|
message: 'Invalid Verification URI',
|
||||||
|
displayType: ['toast'],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
navigation.navigate({ routeName: 'File', key: launchUrl, params: { uri: launchUrl } });
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
notify({
|
|
||||||
message: 'Invalid Verification URI',
|
|
||||||
displayType: ['toast'],
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
navigation.navigate({ routeName: 'File', key: launchUrl, params: { uri: launchUrl } });
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +144,7 @@ class SplashScreen extends React.PureComponent {
|
||||||
|
|
||||||
balanceSubscribe();
|
balanceSubscribe();
|
||||||
NativeModules.VersionInfo.getAppVersion().then(appVersion => {
|
NativeModules.VersionInfo.getAppVersion().then(appVersion => {
|
||||||
|
this.setState({ shouldAuthenticate: true });
|
||||||
if (NativeModules.UtilityModule) {
|
if (NativeModules.UtilityModule) {
|
||||||
// authenticate with the device ID if the method is available
|
// authenticate with the device ID if the method is available
|
||||||
NativeModules.UtilityModule.getDeviceId().then(deviceId => {
|
NativeModules.UtilityModule.getDeviceId().then(deviceId => {
|
||||||
|
@ -137,9 +153,9 @@ class SplashScreen extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
authenticate(appVersion);
|
authenticate(appVersion);
|
||||||
}
|
}
|
||||||
this.setState({ shouldAuthenticate: true });
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,6 +193,7 @@ class SplashScreen extends React.PureComponent {
|
||||||
details: 'Initializing LBRY service...'
|
details: 'Initializing LBRY service...'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.updateStatus();
|
this.updateStatus();
|
||||||
}, 500);
|
}, 500);
|
||||||
|
|
Loading…
Reference in a new issue