Files
cabinet/assets/controllers/registration_controller.js
2026-05-28 12:09:28 +03:00

438 lines
17 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Controller } from 'stimulus';
import Cookies from 'js-cookie';
const loader = require("./../components/loader.js");
const validator = require("./../components/validator.js");
const helper = require("./../components/helper.js");
export default class extends Controller {
connect() {
loader.loadSDK('registration')
var registerWrap = this.element;
var licenseLink = helper.getLicenseLink(Cookies.get('region'));
helper.renderCapcha(registerWrap.querySelector('.d-capcha-start'));
registerWrap.querySelectorAll('.license').forEach(function(el) {
/* политика */
var div = document.createElement('div');
div.classList = 'form-group';
var formCheck = document.createElement('div');
formCheck.classList = 'form-check';
div.append(formCheck);
var accept = document.createElement('input');
accept.classList = "form-check-input";
accept.id = "accept";
accept.checked = false;
accept.type = "checkbox";
formCheck.append(accept);
var license = helper.getLicenseLink(Cookies.get('region'));
var label = document.createElement('label');
label.setAttribute('for' , 'accept');
label.innerHTML = `ознакомлен(а) <a class="underline" href="${licenseLink}" target="_blank">с условиями политики в отношении обработки персональных данных</a>`;
formCheck.append(label);
var validAccept = document.createElement('div');
validAccept.classList = 'msg-valid valid-accept';
div.append(validAccept);
el.append(div)
/* согласие */
var formCheck = document.createElement('div');
formCheck.classList = 'form-check';
div.append(formCheck);
var acceptPerson = document.createElement('input');
acceptPerson.classList = "form-check-input";
acceptPerson.id = "acceptPerson";
acceptPerson.checked = false;
acceptPerson.type = "checkbox";
formCheck.append(acceptPerson);
var licensePerson = helper.getLicensePersonLink();
var labelPerson = document.createElement('label');
labelPerson.setAttribute('for' , 'acceptPerson');
labelPerson.innerHTML = `даю согласие <a class="underline" href="${licensePerson}" target="_blank">на обработку персональных данных</a>`;
formCheck.append(labelPerson);
var validAcceptPerson = document.createElement('div');
validAcceptPerson.classList = 'msg-valid valid-acceptPerson';
div.append(validAcceptPerson);
el.append(div)
});
}
btnBack() {
var registerWrap = this.element;
registerWrap.querySelector('.register-start').classList.remove('d-none');
registerWrap.querySelector('.register-init').classList.add('d-none');
registerWrap.querySelector('.register-complete').classList.add('d-none');
registerWrap.querySelector('.register-complete').dataset.rToken = null;
registerWrap.querySelector('.register-complete').dataset.pwdToken = null;
registerWrap.querySelector('.alert.msg').classList.add('d-none');
registerWrap.querySelector('.alert.msg').innerHTML = 'Поля, обозначенные звездочкой (<span class="text-danger">*</span>), обязательны для заполнения';
var capchaStart = helper.renderCapcha(registerWrap.querySelector('.d-capcha-start'));
setTimeout(() => {
window.smartCaptcha.reset(capchaStart.dataset.id)
}, 100);
}
btnStart() {
var captchaId = this.element.querySelector('#smart-captcha')?.dataset?.id;
var valid, invalid = false;
var registerWrap = this.element;
valid = validator.checkPhone(
registerWrap.querySelector('#phone'),
registerWrap.querySelector(`.valid-phone`)
);
if (valid) {
invalid = valid
}
valid = validator.checkSmartCaptcha(
window.smartCaptcha.getResponse(captchaId),
registerWrap.querySelector('.valid-captcha')
);
if (valid) {
invalid = valid
}
if (validator.checkAccept(registerWrap.querySelector('#accept'),registerWrap.querySelector('.valid-accept'))) {
invalid = true;
}
if (validator.checkAccept(registerWrap.querySelector('#acceptPerson'),registerWrap.querySelector('.valid-acceptPerson'))) {
invalid = true;
}
if (invalid) {
return false;
}
window.webSDK.recoveryInit({
'login': registerWrap.querySelector('#phone').value.replace(/[^\w\s!?]/g,''),
'captcha': window.smartCaptcha.getResponse(captchaId)
}).then(function (resolve) {
registerWrap.querySelector('.register-start').classList.add('d-none');
registerWrap.querySelector('.register-complete').classList.remove('d-none');
registerWrap.querySelector('.register-complete').dataset.pwdToken = resolve.data.pwdToken;
if (resolve.data.message.indexOf('почтовый ящик') != '-1') {
registerWrap.querySelector('.emailCode').classList.remove('d-none');
registerWrap.querySelector('.alertEmailView').innerHTML = resolve.data.message;
registerWrap.querySelector('.register-complete').dataset.type = 'email';
} else {
registerWrap.querySelector('.smsCode').classList.remove('d-none');
registerWrap.querySelector('.alertSmsCode').innerHTML = resolve.data.message;
registerWrap.querySelector('.register-complete').dataset.type = 'sms';
}
}).catch(function (e) {
if (e.data?.errors?.captcha) {
registerWrap.querySelector('.valid-captcha').innerText = e.data?.errors?.captcha?.[0];
window.smartCaptcha.reset(captchaId);
}
if (e.data?.message?.includes("не найден в базе данных")) {
registerWrap.querySelector('.register-start').classList.add('d-none');
registerWrap.querySelector('.register-init').classList.remove('d-none');
helper.renderCapcha(registerWrap.querySelector('.d-capcha-init'));
}
});
}
btnReg() {
var captchaId = this.element.querySelector('#smart-captcha')?.dataset?.id;
var valid, invalid = false;
var registerWrap = this.element;
registerWrap.querySelectorAll('.alert.alert-danger.alert-dismissible').forEach(function(e) {
e.remove();
});
var options = {
firstName: registerWrap.querySelector('#firstName').value,
lastName: registerWrap.querySelector('#lastName').value,
middleName: registerWrap.querySelector('#middleName').value
};
for (var key of Object.keys(options)) {
valid = validator.checkTextRu(
registerWrap.querySelector(`#${key}`),
registerWrap.querySelector(`.valid-${key}`)
);
if (valid) {
invalid = valid
}
}
options.email = registerWrap.querySelector('#email').value;
valid = validator.checkEmail(
registerWrap.querySelector('#email'),
registerWrap.querySelector(`.valid-email`)
);
if (valid) {
invalid = valid
}
options.phone = registerWrap.querySelector('#phone').value;
valid = validator.checkPhone(
registerWrap.querySelector('#phone'),
registerWrap.querySelector(`.valid-phone`)
);
if (valid) {
invalid = valid
}
valid = validator.checkSmartCaptcha(
window.smartCaptcha.getResponse(captchaId),
registerWrap.querySelector('.valid-captcha')
);
if (valid) {
invalid = valid
}
var validGender = false;
registerWrap.querySelectorAll('.gender').forEach(function (el) {
if (el.checked) {
registerWrap.querySelector('.valid-gender').innerHTML = '';
validGender = true;
options.gender = el.value;
}
});
if (!validGender) {
registerWrap.querySelector('.valid-gender').innerHTML = '<span class="text-danger">укажите Ваш пол</span>';
invalid = true;
}
registerWrap.querySelectorAll('.msg-valid').forEach(function (el) {
el.innerHTML = '';
});
window.webSDK.registerInit({
firstName: options.firstName,
lastName: options.lastName,
middleName: options.middleName,
birthDate: registerWrap.querySelector('#birthDate').value,
email: options.email,
phone: options.phone,
gender: options.gender,
captcha: window.smartCaptcha.getResponse(captchaId)
}).then(function(resolve) {
registerWrap.querySelector('.register-init').classList.add('d-none');
registerWrap.querySelector('.register-complete').classList.remove('d-none');
registerWrap.querySelector('.register-complete').dataset.rToken = resolve.data.rToken;
if (resolve.data && resolve.data.email == 'true') {
registerWrap.querySelector('.emailCode').classList.remove('d-none');
registerWrap.querySelector('.emailView').innerHTML = options.email;
} else {
registerWrap.querySelector('.smsCode').classList.remove('d-none');
registerWrap.querySelector('.smsView').innerHTML = options.phone;
}
}).catch(function(error) {
window.smartCaptcha.reset(captchaId);
helper.sendRequest({
data: {'error': error, method: 'registerInit'}
}, helper.getHostname() + '/api/log', "POST", "json", true, "application/json");
var registerAlert = document.getElementById('register-alert');
if (! registerAlert) {
var registerAlert = document.createElement('div');
registerAlert.classList = 'alert alert-danger alert-dismissible fade';
registerAlert.setAttribute('role', 'alert');
var divMsg = document.createElement('div');
divMsg.classList = 'alert-msg';
registerAlert.append(divMsg);
var buttonClose = document.createElement('button');
buttonClose.classList = 'close';
buttonClose.dataset.dismiss ='alert';
buttonClose.setAttribute('aria-label', 'Close');
buttonClose.innerHTML = '<span aria-hidden="true">&times;</span>';
registerAlert.append(buttonClose);
registerWrap.prepend(registerAlert);
}
if (error.data.message) {
registerAlert.classList = 'alert alert-danger alert-dismissible fade show';
registerAlert.querySelector('.alert-msg').innerHTML = error.data.message;
} else {
for (var prop in error.data) {
if (error.data[prop]) {
var el = registerWrap.querySelector('.valid-' + prop)
el.innerHTML = error.data[prop];
}
}
}
});
}
btnComplite() {
var registerWrap = this.element;
if (registerWrap.querySelector('.register-complete').dataset.pwdToken !== "null") {
var type = registerWrap.querySelector('.register-complete').dataset.type;
var code = registerWrap.querySelector('#emailCode');
if (type == 'sms') {
var code = registerWrap.querySelector('#smsCode');
}
this.recoveryComplite(code, type);
} else {
this.registerComplete();
}
}
registerComplete() {
var registerWrap = this.element;
window.webSDK.registerComplete({
rToken: registerWrap.querySelector('.register-complete').dataset.rToken,
emailCode: registerWrap.querySelector('#emailCode').value,
smsCode: registerWrap.querySelector('#smsCode').value,
password: registerWrap.querySelector('#password').value
}).then(function(response) {
registerWrap.querySelector('.alert.filter').classList.add('d-none');
var successAlert = document.createElement('div');
successAlert.classList = 'alert alert-success alert-dismissible fade show';
successAlert.setAttribute('role', 'alert');
var divMsg = document.createElement('div');
divMsg.classList = 'alert-msg';
divMsg.innerHTML = '<p>Регистрация завершена.</p>'
+ '<p>' + response.data.text + '</p>';
successAlert.append(divMsg);
var buttonClose = document.createElement('button');
buttonClose.classList = 'close';
buttonClose.dataset.dismiss ='alert';
buttonClose.setAttribute('aria-label', 'Close');
buttonClose.innerHTML = '<span aria-hidden="true">&times;</span>';
successAlert.append(buttonClose);
document.getElementById('alert-system').prepend(successAlert);
registerWrap.querySelector('.register-complete').classList.add('d-none');
}).catch(function(error) {
helper.sendRequest({
data: {'error': error, method: 'registerComplete'}
}, helper.getHostname() + '/api/log', "POST", "json", true, "application/json");
for (var prop in error.data) {
if (error.data[prop]) {
var classValid = prop.split('.')[1];
if (classValid) {
var el = registerWrap.querySelector('.valid-' + prop.split('.')[1]);
} else {
var el = registerWrap.querySelector('.valid-' + prop);
}
el.innerHTML = error.data[prop];
}
}
$('html, body').animate({scrollTop:0}, '300');
});
}
recoveryComplite(inputCode, type) {
var registerWrap = this.element;
var valid, invalid = false;
valid = validator.checkNotEmpty(
inputCode,
registerWrap.querySelector('.valid-' + type + 'Code')
);
if (valid) {
invalid = valid
}
valid = validator.checkNotEmpty(
registerWrap.querySelector('#password'),
registerWrap.querySelector('.valid-password')
);
if (valid) {
invalid = valid
}
if (invalid) {
return false;
}
window.webSDK.recoveryComplete({
'pwdToken': registerWrap.querySelector('.register-complete').dataset.pwdToken,
'password': registerWrap.querySelector('#password').value,
'code': inputCode.value
}).then(function (result) {
registerWrap.querySelector('.alert.msg').classList.add('d-none');
var successAlert = document.createElement('div');
successAlert.classList = 'alert alert-success alert-dismissible fade show';
successAlert.setAttribute('role', 'alert');
var divMsg = document.createElement('div');
divMsg.classList = 'alert-msg';
divMsg.innerHTML = result.data.message;
successAlert.append(divMsg);
var buttonClose = document.createElement('button');
buttonClose.classList = 'close';
buttonClose.dataset.dismiss ='alert';
buttonClose.setAttribute('aria-label', 'Close');
buttonClose.innerHTML = '<span aria-hidden="true">&times;</span>';
successAlert.append(buttonClose);
document.getElementById('alert-system').prepend(successAlert);
registerWrap.querySelector('.register-complete').classList.add('d-none');
$.ajax({
method: "POST",
crossDomain: false,
url: "/forget",
contentType: "application/x-www-form-urlencoded",
dataType: "json",
data: {
token: popupBody.dataset.csrf,
uid: forget.data.uid,
password: forgetPasswd
}
});
}).catch(function (e) {
helper.sendRequest({
data: {'error': e, method: 'recoveryComplete'}
}, helper.getHostname() + '/api/log', "POST", "json", true, "application/json");
var msg = registerWrap.querySelector('.msg');
msg.classList.add('alert-danger');
msg.classList.remove('filter');
if (e.data && e.data.error) {
msg.innerHTML = e.data.error
}
});
}
}