fixes and updates for authentication flow #2
8 changed files with 10882 additions and 168 deletions
1037
dist/bundle.js
vendored
1037
dist/bundle.js
vendored
File diff suppressed because it is too large
Load diff
9886
package-lock.json
generated
Normal file
9886
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
14
src/index.js
14
src/index.js
|
@ -15,7 +15,17 @@ export {
|
||||||
doClaimEligiblePurchaseRewards,
|
doClaimEligiblePurchaseRewards,
|
||||||
doClaimRewardClearError,
|
doClaimRewardClearError,
|
||||||
} from 'redux/actions/rewards';
|
} from 'redux/actions/rewards';
|
||||||
export { doFetchInviteStatus, doInstallNew, doAuthenticate, doUserFetch } from 'redux/actions/user';
|
export {
|
||||||
|
doFetchInviteStatus,
|
||||||
|
doInstallNew,
|
||||||
|
doAuthenticate,
|
||||||
|
doUserFetch,
|
||||||
|
doUserEmailNew,
|
||||||
|
doUserEmailToVerify,
|
||||||
|
doUserEmailVerifyFailure,
|
||||||
|
doUserEmailVerify,
|
||||||
|
doFetchAccessToken,
|
||||||
|
} from 'redux/actions/user';
|
||||||
|
|
||||||
// reducers
|
// reducers
|
||||||
export { authReducer } from 'redux/reducers/auth';
|
export { authReducer } from 'redux/reducers/auth';
|
||||||
|
@ -23,7 +33,7 @@ export { rewardsReducer } from 'redux/reducers/rewards';
|
||||||
export { userReducer } from 'redux/reducers/user';
|
export { userReducer } from 'redux/reducers/user';
|
||||||
|
|
||||||
// selectors
|
// selectors
|
||||||
export { selectAuthToken } from 'redux/selectors/auth';
|
export { selectAuthToken, selectIsAuthenticating } from 'redux/selectors/auth';
|
||||||
export {
|
export {
|
||||||
makeSelectClaimRewardError,
|
makeSelectClaimRewardError,
|
||||||
makeSelectIsRewardClaimPending,
|
makeSelectIsRewardClaimPending,
|
||||||
|
|
|
@ -127,6 +127,7 @@ Lbryio.authenticate = () => {
|
||||||
return reject();
|
return reject();
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
.then(Lbryio.getCurrentUser)
|
||||||
.then(resolve, reject);
|
.then(resolve, reject);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { ACTIONS, MODALS, Lbry, doNotify } from 'lbry-redux';
|
import { ACTIONS, MODALS, Lbry, doNotify } from 'lbry-redux';
|
||||||
|
import { selectEmailToVerify } from 'redux/selectors/user';
|
||||||
import { doRewardList } from 'redux/actions/rewards';
|
import { doRewardList } from 'redux/actions/rewards';
|
||||||
import Lbryio from 'lbryio';
|
import Lbryio from 'lbryio';
|
||||||
|
|
||||||
|
@ -91,3 +92,103 @@ export function doUserFetch() {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function doUserEmailToVerify(email) {
|
||||||
|
return dispatch => {
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_VERIFY_SET,
|
||||||
|
data: { email },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doUserEmailNew(email) {
|
||||||
|
return dispatch => {
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_NEW_STARTED,
|
||||||
|
email,
|
||||||
|
});
|
||||||
|
|
||||||
|
const success = () => {
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_NEW_SUCCESS,
|
||||||
|
data: { email },
|
||||||
|
});
|
||||||
|
dispatch(doUserFetch());
|
||||||
|
};
|
||||||
|
|
||||||
|
const failure = error => {
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_NEW_FAILURE,
|
||||||
|
data: { error },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Lbryio.call('user_email', 'new', { email, send_verification_email: true }, 'post')
|
||||||
|
.catch(error => {
|
||||||
|
if (error.response && error.response.status === 409) {
|
||||||
|
return Lbryio.call(
|
||||||
|
'user_email',
|
||||||
|
'resend_token',
|
||||||
|
{ email, only_if_expired: true },
|
||||||
|
'post'
|
||||||
|
).then(success, failure);
|
||||||
|
}
|
||||||
|
throw error;
|
||||||
|
})
|
||||||
|
.then(success, failure);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doUserEmailVerifyFailure(error) {
|
||||||
|
return {
|
||||||
|
type: ACTIONS.USER_EMAIL_VERIFY_FAILURE,
|
||||||
|
data: { error },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doUserEmailVerify(verificationToken, recaptcha) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
const email = selectEmailToVerify(getState());
|
||||||
|
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_VERIFY_STARTED,
|
||||||
|
code: verificationToken,
|
||||||
|
recaptcha,
|
||||||
|
});
|
||||||
|
|
||||||
|
Lbryio.call(
|
||||||
|
'user_email',
|
||||||
|
'confirm',
|
||||||
|
{
|
||||||
|
verification_token: verificationToken,
|
||||||
|
email,
|
||||||
|
recaptcha,
|
||||||
|
},
|
||||||
|
'post'
|
||||||
|
)
|
||||||
|
.then(userEmail => {
|
||||||
|
if (userEmail.is_verified) {
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.USER_EMAIL_VERIFY_SUCCESS,
|
||||||
|
data: { email },
|
||||||
|
});
|
||||||
|
dispatch(doUserFetch());
|
||||||
|
} else {
|
||||||
|
throw new Error('Your email is still not verified.'); // shouldn't happen
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => dispatch(doUserEmailVerifyFailure(error)));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doFetchAccessToken() {
|
||||||
|
return dispatch => {
|
||||||
|
const success = token =>
|
||||||
|
dispatch({
|
||||||
|
type: ACTIONS.FETCH_ACCESS_TOKEN_SUCCESS,
|
||||||
|
data: { token },
|
||||||
|
});
|
||||||
|
Lbryio.getAuthToken().then(success);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ reducers[ACTIONS.GENERATE_AUTH_TOKEN_STARTED] = state =>
|
||||||
|
|
||||||
reducers[ACTIONS.GENERATE_AUTH_TOKEN_SUCCESS] = (state, action) =>
|
reducers[ACTIONS.GENERATE_AUTH_TOKEN_SUCCESS] = (state, action) =>
|
||||||
Object.assign({}, state, {
|
Object.assign({}, state, {
|
||||||
authToken: action.authToken,
|
authToken: action.data.authToken,
|
||||||
authenticating: false,
|
authenticating: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -151,6 +151,11 @@ reducers[ACTIONS.USER_EMAIL_VERIFY_FAILURE] = (state, action) =>
|
||||||
emailVerifyErrorMessage: action.data.error,
|
emailVerifyErrorMessage: action.data.error,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
reducers[ACTIONS.USER_EMAIL_VERIFY_SET] = (state, action) =>
|
||||||
|
Object.assign({}, state, {
|
||||||
|
emailToVerify: action.data.email,
|
||||||
|
});
|
||||||
|
|
||||||
reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = state =>
|
reducers[ACTIONS.USER_IDENTITY_VERIFY_STARTED] = state =>
|
||||||
Object.assign({}, state, {
|
Object.assign({}, state, {
|
||||||
identityVerifyIsPending: true,
|
identityVerifyIsPending: true,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import { createSelector } from 'reselect';
|
import { createSelector } from 'reselect';
|
||||||
|
|
||||||
const selectState = state => state.authToken || {};
|
const selectState = state => state.auth || {};
|
||||||
|
|
||||||
export const selectAuthToken = createSelector(selectState, state => state.authToken);
|
export const selectAuthToken = createSelector(selectState, state => state.authToken);
|
||||||
|
|
||||||
|
export const selectIsAuthenticating = createSelector(selectState, state => state.authenticating);
|
||||||
|
|
Loading…
Reference in a new issue