import { Controller } from 'stimulus'; import Inputmask from "inputmask"; const loader = require("./../components/loader.js"); const validator = require("./../components/validator.js"); const helper = require("./../components/helper.js"); /* * This is an example Stimulus controller! * * Any element with a data-controller="resetPassword" attribute will cause * this controller to be executed. The name "resetPassword" comes from the filename: * resetPassword_controller.js -> "resetPassword" * * Delete this file or adapt it for your use! */ export default class extends Controller { connect() { loader.loadSDK('resetPassword') let resetPasswordSmsCode = true; var popup = document.getElementById('popup'); if (location.hash == '#recovery' && popup.dataset.recovery == 'true') { popup.dataset.recovery = false; renderForm(window.webSDK); } else { var element = this.element element.addEventListener('click', function() { renderForm(window.webSDK); }); } function renderForm(webSDK) { var popup = document.getElementById('popup'); popup.querySelector('.modal-title').innerHTML = "Восстановление пароля"; var popupBody = popup.querySelector('#popup-body'); popupBody.innerHTML = ""; if (typeof $(popup).modal !== 'undefined') { $(popup).modal('show'); } var div = document.createElement('div'); div.classList = 'form-group'; if (resetPasswordSmsCode) { var label = document.createElement('label'); label.setAttribute('for' , 'login-forget'); label.innerHTML = 'Телефон пользователя:'; div.append(label); var input = document.createElement('input'); input.classList = "form-control"; input.id = "login-forget"; input.type = "phone"; input.autocomplete = "phone"; div.append(input); var im = new Inputmask({mask: "7(899)999-99-99",definitions: {'8': {validator: "[9]"}}}); im.mask(input); } else { var label = document.createElement('label'); label.setAttribute('for' , 'login-forget'); label.innerHTML = 'E-mail пользователя:'; div.append(label); var input = document.createElement('input'); input.classList = "form-control"; input.id = "login-forget"; input.autocomplete = "email"; input.type = "email"; div.append(input); } var validUsername = document.createElement('div'); validUsername.classList = "msg-valid valid-login-forget"; div.append(validUsername); if (resetPasswordSmsCode) { var p = document.createElement('p'); p.innerHTML = "На Ваш номер телефона будет отправлен код для восстановления пароля." popupBody.append(p); } else { var p = document.createElement('p'); p.innerHTML = "На Вашу электронную почту будет отправлен код для восстановления пароля." popupBody.append(p); } var msg = document.createElement('div'); msg.classList = 'd-none msg'; msg.innerHTML = ''; popupBody.append(div); popupBody.append(msg); var div = document.createElement('div'); div.classList = 'form-group'; var recaptcha = document.createElement('div'); recaptcha.id = "smart-captcha"; recaptcha.dataset.controller = "smartCaptcha"; div.append(recaptcha); var validRecaptcha = document.createElement('div'); validRecaptcha.classList = "msg-valid valid-captcha"; div.append(validRecaptcha); popupBody.append(div); var button = document.createElement('button'); button.classList = "btn btn-primary"; button.innerHTML = "Восстановить" button.addEventListener('click', function () { loader.btnLoader(button, true); resetPassword(webSDK, popup) }); var footer = document.createElement('div'); footer.classList = 'modal-footer px-0'; footer.append(button); popupBody.append(footer); }; function resetPassword(webSDK, popup) { var popupBody = popup.querySelector('#popup-body'); var valid, invalid = false; if (resetPasswordSmsCode) { valid = validator.checkPhone( document.getElementById('login-forget'), document.querySelector(`.valid-login-forget`) ); var login = document.getElementById('login-forget').value.replace(/[^\w\s!?]/g,''); } else { valid = validator.checkEmail( document.getElementById('login-forget'), document.querySelector(`.valid-login-forget`) ); var login = document.getElementById('login-forget').value; } if (valid) { invalid = valid } valid = validator.checkSmartCaptcha( window.smartCaptcha.getResponse(), document.querySelector('.valid-captcha') ); if (valid) { invalid = valid } if (invalid) { loader.btnLoader(popupBody.querySelector('button'), false); return false; } $.ajax({ async : false, method: "POST", crossDomain: true, url: helper.getHostname() + "/forget", contentType: "application/x-www-form-urlencoded", dataType: "json", data: { token: popupBody.dataset.csrf, login: login }, success(response) { window.webSDK.recoveryInit({ 'login': login, 'captcha': window.smartCaptcha.getResponse() }).then(function (resolve) { renderFormConfirm(webSDK, popup, resolve, response); }).catch(function (e) { helper.sendRequest({ data: {'error': e, method: 'recoveryInit'} }, helper.getHostname() + '/api/log', "POST"); window.smartCaptcha.reset(); if (e.data?.errors?.captcha) { document.querySelector('.valid-captcha').innerText = e.data?.errors?.captcha?.[0]; } loader.btnLoader(popupBody.querySelector('button'), false); if (e.data?.message) { var msg = popupBody.querySelector('.msg'); msg.classList = 'alert alert-danger'; msg.innerHTML = e.data.message; } }); } }); }; function renderFormConfirm(webSDK, popup, resolve, forget) { var popupBody = popup.querySelector('#popup-body'); popupBody.innerHTML = ""; var message = document.createElement('p'); message.innerHTML = resolve.data.message; popupBody.append(message); var div = document.createElement('div'); div.classList = 'form-group'; var label = document.createElement('label'); label.setAttribute('for' , 'forget-code'); label.innerHTML = 'Код подтверждения:'; div.append(label); var input = document.createElement('input'); input.classList = "form-control"; input.id = "forget-code"; input.autocomplete = "one-time-code"; input.autocorrect = "off"; input.spellcheck = "off"; input.type = "text"; div.append(input); var divValidCode = document.createElement('div'); divValidCode.classList = "msg-valid valid-code"; div.append(divValidCode); popupBody.append(div); var div = document.createElement('div'); div.classList = 'form-group'; var label = document.createElement('label'); label.setAttribute('for' , 'forget-passwd'); label.innerHTML = 'Новый пароль:'; div.append(label); var input = document.createElement('input'); input.classList = "form-control"; input.id = "forget-passwd"; input.autocomplete = "new-password"; input.type = "password"; div.append(input); var divValidPass = document.createElement('div'); divValidPass.classList = "msg-valid valid-password"; divValidPass.innerHTML = "не менее 7 символов"; div.append(divValidPass); popupBody.append(div); var msg = document.createElement('div'); msg.classList = 'd-none alert alert-danger'; msg.innerHTML = ''; popupBody.append(msg); var button = document.createElement('button'); button.classList = "btn btn-primary"; button.innerHTML = " Сохранить изменения"; button.addEventListener('click', function () { popupBody.querySelectorAll('.msg-valid').forEach(function(el) { el.innerHTML = ''; }); var invalid = false; var forgetCode = document.getElementById('forget-code').value; if (forgetCode === '') { popupBody.querySelector('.valid-code') .innerHTML = 'поле не может быть пустым'; popupBody.querySelector('#forget-code').classList.add('is-invalid'); popupBody.querySelector('#forget-code').classList.remove('is-valid'); invalid = true; } else { popupBody.querySelector('#forget-code').classList.add('is-valid'); popupBody.querySelector('#forget-code').classList.remove('is-invalid'); } var forgetPasswd = document.getElementById('forget-passwd').value; if (forgetPasswd.length < 6 || /^[\u0400-\u04FF]+$/.test(forgetPasswd)) { invalid = true; if (/^[\u0400-\u04FF]+$/.test(forgetPasswd)) { popupBody.querySelector('.valid-password') .innerHTML = 'поле не должно содержать кириллицы'; popupBody.querySelector('#forget-passwd').classList.add('is-invalid'); popupBody.querySelector('#forget-passwd').classList.remove('is-valid'); } else { popupBody.querySelector('.valid-password') .innerHTML = 'не менее 7 символов'; popupBody.querySelector('#forget-passwd').classList.add('is-invalid'); popupBody.querySelector('#forget-passwd').classList.remove('is-valid'); } } else { popupBody.querySelector('#forget-passwd').classList.add('is-valid'); popupBody.querySelector('#forget-passwd').classList.remove('is-invalid'); } if (invalid) { return false; } window.webSDK.recoveryComplete({ 'pwdToken': resolve.data.pwdToken, 'password': forgetPasswd, 'code': document.getElementById('forget-code').value }).then(function (result) { if (result.data.errors) { if (result.data.errors.code) { popupBody.querySelector('.valid-code').innerHTML = ` ${result.data.errors.code}`; } return false; } popupBody.innerHTML = ''; var msg = document.createElement('div'); msg.classList = 'alert alert-success'; msg.innerHTML = result.data.message; popupBody.append(msg); $.ajax({ method: "POST", crossDomain: true, url: helper.getHostname() + "/forget", contentType: "application/x-www-form-urlencoded", dataType: "json", data: { token: popupBody.dataset.csrf, uid: forget.data.uid, password: forgetPasswd }, success(response) { if (response.data.success == true) { var parser = document.createElement('a'); parser.href = response.data.redirect; window.location.replace(document.location.origin + parser.pathname + parser.search); } } }); }).catch(function (e) { helper.sendRequest({ data: {'error': e, method: 'recoveryComplete'} }, helper.getHostname() + '/api/log', "POST"); if (e.data && e.data.error) { msg.innerHTML = e.data.error msg.classList.remove('d-none'); } }); }); var footer = document.createElement('div'); footer.classList = 'modal-footer'; footer.append(button); popupBody.append(footer); }; } }