/**
* Module for handling the authentication process
*
* @since 1.7.0
*/
;(function ($, localize) {
/**
* Configure REST nonce
*
* @param {*} options
*
* @since 1.7.0
* @return {*}
*/
function ajax(options) {
return $.ajax(Object.assign({}, {
beforeSend: function (xhr) { xhr.setRequestHeader('X-WP-Nonce', localize.rest_nonce); }
}, options));
}
$(function () {
var $emailStep = $('[data-step="email"]'),
$termsStep = $('[data-step="tos"]'),
$passStep = $('[data-step="password"]'),
$regStep = $('[data-step="register"]');
/**
* Switch to the next step
*
* @param {string} step
*
* @since 1.7.0
* @return {*|$.Deferred.promise}
*/
function switchToStep(step) {
return $.Deferred(function ($deferred) {
var $current = $('.ucare-login-screen:visible'),
$nextStep = $('.ucare-login-screen[data-step="' + step + '"]');
$current.fadeOut(function () {
$nextStep.fadeIn(function () { $deferred.resolve(); });
});
});
}
/**
* Accept the terms of service
*
* @param email
* @return {*}
*/
function acceptTOS(email) {
return ajax({
url: localize.rest_url + 'ucare/v1/user/accept-tos?email=' + email,
method: 'post'
});
}
/**
* Display login notice
*
* @param {string} message
*
* @since 1.7.0
* @return {void}
*/
function showLoginNotice(message) {
$('#ucare-login-notice').fadeIn().find('.inner').html(message);
}
/**
* Handle notice dismissal
*/
$('#ucare-login-notice .dismiss').click(function (e) {
e.preventDefault();
$(this).parents('#ucare-login-notice').fadeOut(function () {
$(this).find('.inner').html('');
});
});
/**
* Verify if the user exists or not
*
* @param {*} data
*
* @since 1.7.0
* @return {void}
*/
function verify(data) {
ajax({
url: localize.rest_url + 'ucare/v1/user/verify',
method: 'post',
data: data
})
.fail(function () {
if (!localize.enforce_tos) {
switchToStep('register').then(function () {
var $email = $('', {
name: 'email',
type: 'hidden',
value: data.email
});
$regStep.append($email);
});
} else {
switchToStep('tos').then(function () {
$('#terms-accept').click(function () {
switchToStep('register').then(function () {
var $tos = $('', {
name: 'tos_accepted',
type: 'hidden',
value: true
});
var $email = $('', {
name: 'email',
type: 'hidden',
value: data.email
});
$regStep.append($tos).append($email);
});
});
$('#terms-decline').click(function () {
switchToStep('email'); // Go back to the email step
});
});
}
})
.then(function (user) {
var switchToPassword = function () {
switchToStep('password').then(function () {
var $input = $('', {
name: 'log',
type: 'hidden',
value: data.email
});
$passStep.append($input);
});
};
if (localize.enforce_tos && !user.tos_accepted) {
switchToStep('tos').then(function () {
$('#terms-accept').click(function (){
acceptTOS(data.email).then(switchToPassword);
});
$('#terms-decline').click(function () {
switchToStep('email');
});
});
} else {
switchToPassword();
}
});
}
/**
* Handle authentication form submission
*
* @param {*} data
*
* @since 1.7.0
* @return {void}
*/
function authenticate(data) {
ajax({
url: localize.rest_url + 'ucare/v1/user/authenticate',
method: 'post',
data: data
})
.fail(function (err) {
showLoginNotice(err.responseJSON.message);
})
.then(function (response, status, xhr) {
window.location.href = xhr.getResponseHeader('Location');
});
}
/**
* Handle registration form submission
*
* @param {*} data
*
* @since 1.7.0
* @return {void}
*/
function register(data) {
ajax({
url: localize.rest_url + 'ucare/v1/user/register',
method: 'post',
data: data
})
.fail(function (err) {
showLoginNotice(err.responseJSON.message);
})
.then(function (response, status, xhr) {
window.location.href = xhr.getResponseHeader('Location');
});
}
/**
* Handle login form submission
*/
$('#ucare-login form').submit(function (e) {
e.preventDefault();
var data = $(this).serializeJSON(),
step = $(this).data('step') || 'email';
switch (step) {
/**
* Handle flow from the email screen
*/
case 'email':
verify(data);
break;
/**
* Handle password screen
*/
case 'password':
authenticate(data);
break;
/**
* Handle registration screen
*/
case 'register':
register(data);
break;
}
});
});
})(jQuery, _ucare_login_l10n);