1jQuery(document).ready(function ($) { 2 3 let currentPackage = null; 4 5// ÐÑкÑÑÑие модалÑного окна пÑи клике на ÐºÐ½Ð¾Ð¿ÐºÑ ÑдалиÑÑ Ð°ÐºÐº 6$('.del_acc').on('click', function() { 7 // СбÑÐ¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð°Ð»Ñного окна пеÑед оÑкÑÑÑием 8 $('#delModal .modal-title').show(); 9 $('#delModal .action_bt').show(); 10 $('#delModal .modal-success-message').remove(); // УдалÑем ÑообÑение ÑÑÐ¿ÐµÑ Ð°, еÑли оÑÑалоÑÑ Ñ Ð¿ÑоÑлого Ñаза 11 $('#delModal .modal-error-message').remove(); // УдалÑем ÑообÑение оÑибки, еÑли оÑÑалоÑÑ 12 $('#delModal').fadeIn(); 13}); 14 15 16$('#sendYesBtn').on('click', function(e) { 17 e.preventDefault(); // ÐÑедоÑвÑаÑиÑÑ ÑÑандаÑÑное поведение кнопки (еÑли она submit) 18 19 var $btn = $(this); 20 var $modal = $('#delModal'); 21 var $header = $modal.find('.modal-title'); 22 var $actions = $modal.find('.action_bt'); 23 24 // ÐÑклÑÑиÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¸ показаÑÑ Ð¸Ð½Ð´Ð¸ÐºÐ°ÑÐ¾Ñ Ð·Ð°Ð³ÑÑзки 25 $btn.prop('disabled', true).text('Удаление...'); 26 27 // --- AJAX-запÑÐ¾Ñ Ð½Ð° Ñдаление --- 28 $.ajax({ 29 url: mains_ajax_object.ajax_url, 30 type: 'POST', 31 dataType: 'json', 32 data: { 33 action: 'delete_user_account', 34 // nonce: your_nonce_value // ÐÑли иÑполÑзÑеÑе nonce 35 }, 36 success: function(response) { 37 console.log('AJAX Success Response:', response); // ÐÐ»Ñ Ð¾Ñладки 38 if (response.success) { 39 // УÑÐ¿ÐµÑ : ÑкÑÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº и кнопки, показаÑÑ ÑообÑение 40 $header.hide(); 41 $actions.hide(); 42 // СоздаÑÑ Ð¸ вÑÑавиÑÑ ÑообÑение об ÑÑÐ¿ÐµÑ Ðµ 43 var $successMessage = $('<p class="modal-success-message" style="text-align:center; color: green; font-weight: bold;">' + response.data.message + '</p>'); 44 $modal.find('.modal-content').append($successMessage); 45 46 // ÐпÑионалÑно: пеÑенапÑавиÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÑеÑез некоÑоÑое вÑÐµÐ¼Ñ 47 setTimeout(function() { 48 window.location.href = '/'; // Ðли на ÑÑÑаниÑÑ Ð²ÑÑ Ð¾Ð´Ð° wp_logout_url() 49 }, 2000); // ЧеÑез 2 ÑекÑÐ½Ð´Ñ 50 51 } else { 52 // ÐÑибка Ð¾Ñ ÑеÑвеÑа 53 showError(response.data.message || 'ÐÑоизоÑла неизвеÑÑÐ½Ð°Ñ Ð¾Ñибка пÑи Ñдалении аккаÑнÑа.'); 54 } 55 }, 56 error: function(xhr, status, error) { 57 console.error('AJAX Error Details:', xhr, status, error); // ÐÐ»Ñ Ð¾Ñладки 58 showError('ÐÑоизоÑла оÑибка пÑи оÑпÑавке запÑоÑа на Ñдаление аккаÑнÑа.'); 59 }, 60 complete: function() { 61 // ÐклÑÑиÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Ð¾Ð±ÑаÑно (Ñ Ð¾ÑÑ Ð¼Ð¾Ð´Ð°Ð»Ñное окно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñже ÑкÑÑÑо) 62 // $btn.prop('disabled', false).text('Ðа'); 63 } 64 }); 65}); 66 67// --- ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñибок внÑÑÑи модалÑного окна --- 68function showError(message) { 69 // УдалиÑÑ Ð¿ÑедÑдÑÑие ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑÐ¸Ð±ÐºÐ°Ñ 70 $('#delModal .modal-error-message').remove(); 71 // СоздаÑÑ Ð¸ вÑÑавиÑÑ Ð½Ð¾Ð²Ð¾Ðµ ÑообÑение об оÑибке 72 var $errorMessage = $('<p class="modal-error-message" style="text-align:center; color: red; font-weight: bold;">' + message + '</p>'); 73 // ÐÑÑавлÑем пеÑед кнопками дейÑÑвий или в ÐºÐ¾Ð½ÐµÑ ÐºÐ¾Ð½ÑенÑа 74 $('#delModal .modal-content').append($errorMessage); 75 // ÐклÑÑиÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ "Ðа" обÑаÑно, еÑли бÑла оÑклÑÑена 76 $('#sendYesBtn').prop('disabled', false).text('Ðа'); 77} 78 79 80 let $phoneModal; 81 let $userPhone; 82 let $sendPhoneBtn; 83 let $phoneError; 84 //let $phoneClose; 85 86 //const $phoneModal = $('#paymentModal'); 87 //const $phoneModal_auth = $('#loginModal'); 88 //const $userPhone = $('#userPhone'); 89 //const $userPhoneAuth = $('#userPhoneAuth'); 90 //const $sendPhoneBtn = $('#sendPhoneBtn');
91 // const $phoneError = $('#phoneError'); 92 //const $phoneErrorAuth = $('#phoneErrorAuth'); 93 const $phoneClose = $('.close'); 94 95 96// --- ÐбÑединеннÑй обÑабоÑÑик клика Ð´Ð»Ñ .pricing-btn и .login-btn --- 97$(document).on('click', '.pricing-btn, .login-btn', function (e) { 98 e.preventDefault(); 99 100 const $btn = $(this); 101 // ÐпÑеделÑем Ñип кнопки 102 const isPricingBtn = $btn.hasClass('pricing-btn'); 103 const isLoginBtn = $btn.hasClass('login-btn'); 104 105 // Ðзвлекаем даннÑе пакеÑа в завиÑимоÑÑи Ð¾Ñ Ñипа кнопки 106 let packageId, price, amount; 107 108 if (isPricingBtn) { 109 // ÐÐ»Ñ .pricing-btn даннÑе беÑÑÑÑÑ Ð¸Ð· ÑодиÑелÑÑкого .pricing-card 110 const $card = $btn.closest('.pricing-card'); 111 packageId = $card.data('package-id'); 112 price = $card.data('price') || 0; 113 amount = $card.data('amount'); 114 115 /*$phoneModal = $('#paymentModal'); // Ðодал Ð´Ð»Ñ ÑаÑиÑов 116 $userPhone = $('#userPhone'); // Ðоле ввода в модале ÑаÑиÑов 117 $sendPhoneBtn = $('#sendPhoneBtn'); // Ðнопка в модале ÑаÑиÑов 118 $phoneError = $('#phoneError'); 119 */ 120 $phoneModal = $('#loginModal'); 121 $userPhone = $('#userPhoneAuth'); // Ðоле ввода в модале Ð²Ñ Ð¾Ð´Ð° 122 $sendPhoneBtn = $('#sendPhoneBtnAuth'); // Ðнопка в модале Ð²Ñ Ð¾Ð´Ð° 123 $phoneError = $('#phoneErrorAuth'); 124 125 126 } else if (isLoginBtn) { 127 // ÐÐ»Ñ .login-btn даннÑе беÑÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ 128 packageId = $btn.data('package-id'); 129 price = $btn.data('price') || 0; 130 amount = $btn.data('amount'); 131 132 $phoneModal = $('#loginModal'); // Ðодал Ð´Ð»Ñ Ð²Ñ Ð¾Ð´Ð° (пÑедполагаем, ÑÑо ÑÑо #loginModal, а не $phoneModal_auth) 133 $userPhone = $('#userPhoneAuth'); // Ðоле ввода в модале Ð²Ñ Ð¾Ð´Ð° 134 $sendPhoneBtn = $('#sendPhoneBtnAuth'); // Ðнопка в модале Ð²Ñ Ð¾Ð´Ð° 135 $phoneError = $('#phoneErrorAuth'); 136 137 } else { 138 // Ðа вÑÑкий ÑлÑÑай, еÑли кнопка не ÑооÑвеÑÑÑвÑÐµÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñм клаÑÑам 139 console.error('ÐбÑабоÑÑик: ÐеизвеÑÑÐ½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° вÑзвала ÑобÑÑие:', $btn.attr('class')); 140 return; 141 } 142 143 // --- ÐниÑиализаÑÐ¸Ñ Ð¼Ð°Ñки Ð´Ð»Ñ ÑÑÑеÑÑвÑÑÑего Ð¿Ð¾Ð»Ñ #userPhone --- 144 initializePhoneMask($userPhone); 145 146 // Ð¡Ð¾Ñ ÑанÑем вÑбÑаннÑй Ð¿Ð°ÐºÐµÑ Ð² глобалÑной пеÑеменной 147 window.currentPackageSelected = { 148 id: packageId, 149 price: price, 150 amount: amount 151 }; 152 153 console.log('ÐÑбÑан пакеÑ:', window.currentPackageSelected); 154 155 // --- ÐÐÐÐÐÐ ÐÐЯ ÐÐÐÐРС ÐÐ ÐÐÐЫÐÐ ÐÐ ÐСТÐÐÐÐÐÐ (ÑолÑко Ð´Ð»Ñ ÐÐавÑоÑизованнÑÑ ) --- 156 if (window.currentPackageSelected.price === 0 && window.currentPackageSelected.amount === 25) { 157 // УбедимÑÑ, ÑÑо полÑзоваÑÐµÐ»Ñ Ð½Ðµ авÑоÑизован (на вÑÑкий ÑлÑÑай, Ñ Ð¾ÑÑ Ð±Ð»Ð¾Ðº виден ÑолÑко неавÑоÑизованнÑм) 158 if (typeof mains_ajax_object === 'undefined' || mains_ajax_object.is_user_logged_in != 1) { 159 console.log("ÐбнаÑÑжен блок пÑобнÑÑ ÐºÑиÑÑаллов Ð´Ð»Ñ ÐÐавÑоÑизованного полÑзоваÑелÑ. ÐÑкÑÑваем модалÑное окно."); 160 161 // ÐпÑеделÑем, какой модал иÑполÑзоваÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ 162 let modalToUse = $phoneModal; 163 /*if (isPricingBtn) { 164 modalToUse = $phoneModal; // ÐÑполÑзÑем модал, ÑвÑзаннÑй Ñ ÑаÑиÑами 165 } else if (isLoginBtn) { 166 modalToUse = $phoneModal_auth; // ÐÑполÑзÑем модал, ÑвÑзаннÑй Ñ Ð°Ð²ÑоÑизаÑией 167 } 168 */ 169 // ÐÑкÑÑваем модалÑное окно Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑелеÑона 170 if (modalToUse && typeof modalToUse !== 'undefined') { 171 // resetPhoneModalState(); // СбÑÐ¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð°Ð»ÐºÐ¸ (еÑли пÑименимо) 172 modalToUse.show(); 173 modalToUse.data('isTrialAward', true); // УÑÑанавливаем Ñлаг пÑобнÑÑ ÐºÑиÑÑаллов 174 // Ð¡Ð¾Ñ ÑанÑем даннÑе пакеÑа 175 modalToUse.data('selectedPackage', window.currentPackageSelected); 176 } else { 177 console.error(`ÐодалÑное окно Ð´Ð»Ñ ${isPricingBtn ? 'ÑаÑиÑа' : 'Ð²Ñ Ð¾Ð´Ð°'} не найдено.`); 178 alert('ÐÑибка: модалÑное окно Ð
178½Ðµ найдено.'); 179 } 180 } else { 181 console.warn("Ðнопка пÑобнÑÑ ÐºÑиÑÑаллов нажаÑа авÑоÑизованнÑм полÑзоваÑелем. ÐÑо не должно пÑоиÑÑ Ð¾Ð´Ð¸ÑÑ."); 182 // Ðожно ниÑего не делаÑÑ Ð¸Ð»Ð¸ показаÑÑ ÑообÑение 183 } 184 return; // ÐÑекÑаÑаем обÑабоÑÐºÑ 185 } 186 187 // --- ÐÐÐÐÐÐ ÐÐЯ ÐÐÐÐÐРС ЦÐÐÐÐ --- 188 // ÐÑовеÑÑем авÑоÑизаÑÐ¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ 189 if (typeof mains_ajax_object !== 'undefined' && mains_ajax_object.is_user_logged_in == 1) { 190 console.log("ÐолÑзоваÑÐµÐ»Ñ Ð°Ð²ÑоÑизован. ÐеÑÐµÑ Ð¾Ð´ к оплаÑе."); 191 // ÐÑли полÑзоваÑÐµÐ»Ñ Ð°Ð²ÑоÑизован, ÑÑÐ°Ð·Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¸Ð¼ к оплаÑе 192 if (typeof showPaymentForm !== 'undefined') { 193 showPaymentForm( 194 mains_ajax_object.current_user_id, // 1-й аÑгÑменÑ: ID полÑзоваÑÐµÐ»Ñ 195 price, // 2-й аÑгÑменÑ: Цена 196 amount, // 3-й аÑгÑменÑ: ÐолиÑеÑÑво 197 packageId // 4-й аÑгÑменÑ: ID пакеÑа 198 ); 199 } else { 200 console.error('ФÑнкÑÐ¸Ñ showPaymentForm не опÑеделена.'); 201 alert('ÐÑибка: ÑоÑма оплаÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпна.'); 202 } 203 } else { 204 console.log("ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ авÑоÑизован. ÐÑкÑÑваем модалÑное окно Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑелеÑона."); 205 206 // ÐпÑеделÑем, какой модал иÑполÑзоваÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ 207 /*let modalToUse; 208 if (isPricingBtn) { 209 modalToUse = $phoneModal; // ÐÑполÑзÑем модал, ÑвÑзаннÑй Ñ ÑаÑиÑами 210 } else if (isLoginBtn) { 211 modalToUse = $phoneModal_auth; // ÐÑполÑзÑем модал, ÑвÑзаннÑй Ñ Ð°Ð²ÑоÑизаÑией 212 }*/ 213 let modalToUse = $phoneModal; 214 215 // ÐÑли полÑзоваÑÐµÐ»Ñ Ð½Ðµ авÑоÑизован, оÑкÑÑваем Ð¼Ð¾Ð´Ð°Ð»ÐºÑ 216 if (modalToUse && typeof modalToUse !== 'undefined') { 217 // resetPhoneModalState(); // СбÑÐ¾Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¼Ð¾Ð´Ð°Ð»ÐºÐ¸ (еÑли пÑименимо) 218 modalToUse.show(); 219 modalToUse.data('isTrialAward', false); // СбÑаÑÑваем Ñлаг (или не ÑÑÑанавливаем) 220 // Ð¡Ð¾Ñ ÑанÑем даннÑе пакеÑа Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей оплаÑÑ 221 modalToUse.data('selectedPackage', window.currentPackageSelected); 222 } else { 223 console.error(`ÐодалÑное окно Ð´Ð»Ñ ${isPricingBtn ? 'ÑаÑиÑа' : 'Ð²Ñ Ð¾Ð´Ð°'} не найдено.`); 224 alert('ÐÑибка: модалÑное окно не найдено.'); 225 } 226 } 227}); 228// --- ÐÐ¾Ð½ÐµÑ Ð¾Ð±Ñединенного обÑабоÑÑика --- 229 230 231 232 // --- ÐÐÐÐЯ ÐÐÐÐÐÐ: ÐодалÑное окно Ñ ÑелеÑоном --- 233 // --- ÐаÑка ввода ÑелеÑона (Vanilla JS) --- 234// --- УнивеÑÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¸Ð½Ð¸ÑиализаÑии маÑки ÑелеÑона --- 235function initializePhoneMask($phoneInput) { 236 if ($phoneInput.length) { 237 // УÑÑанавливаем placeholder Ñ Ð¼Ð°Ñкой 238 $phoneInput.attr('placeholder', '+7 (___) ___-__-__'); 239 // УÑÑанавливаем maxlength 240 $phoneInput.attr('maxlength', '18'); // +7 (999) 999-99-99 241 242 // ÐбÑабоÑÑик ввода 243 $phoneInput[0].addEventListener('input', function (e) { 244 // Ð¡Ð¾Ñ ÑанÑем позиÑÐ¸Ñ ÐºÑÑÑоÑа 245 let start = this.selectionStart; 246 let end = this.selectionEnd; 247 // ÐолÑÑаем введÑнное знаÑение и оÑÑавлÑем ÑолÑко ÑиÑÑÑ 248 let value = this.value.replace(/\D/g, ''); 249 // ÐÑли пеÑÐ²Ð°Ñ ÑиÑÑа 8, заменÑем на 7 250 if (value.startsWith('8')) {
251 value = '7' + value.substring(1); 252 } 253 // ÐÑли пеÑÐ²Ð°Ñ ÑиÑÑа не 7, добавлÑем 7 254 else if (value.length > 0 && !value.startsWith('7')) { 255 value = '7' + value; 256 } 257 // ÐгÑаниÑиваем Ð´Ð»Ð¸Ð½Ñ Ð´Ð¾ 11 ÑиÑÑ (7XXXXXXXXXX) 258 if (value.length > 11) { 259 value = value.substring(0, 11); 260 } 261 // ФоÑмаÑиÑÑем Ð½Ð¾Ð¼ÐµÑ 262 let formattedValue = ''; 263 if (value.length > 0) { 264 formattedValue = '+7 (' + value.substring(1, 4); 265 } 266 if (value.length >= 5) { 267 formattedValue += ') ' + value.substring(4, 7); 268 } 269 if (value.length >= 8) { 270 formattedValue += '-' + value.substring(7, 9); 271 } 272 if (value.length >= 10) { 273 formattedValue += '-' + value.substring(9, 11); 274 } 275 // УÑÑанавливаем оÑÑоÑмаÑиÑованное знаÑение 276 this.value = formattedValue; 277 // ÐоÑÑÑанавливаем позиÑÐ¸Ñ ÐºÑÑÑоÑа (пÑоÑÑÐ°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ°) 278 this.setSelectionRange(this.value.length, this.value.length); 279 }); 280 281 // ÐÑедоÑвÑаÑаем ввод неÑиÑÑовÑÑ Ñимволов (дополниÑелÑÐ½Ð°Ñ Ð¼ÐµÑа) 282 $phoneInput[0].addEventListener('keypress', function (e) { 283 // РазÑеÑаем ÑолÑко ÑиÑÑÑ, Backspace, Delete, Tab, Escape, Enter 284 if ([46, 8, 9, 27, 13].indexOf(e.keyCode) !== -1 || 285 // РазÑеÑаем Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X 286 (e.keyCode === 65 && e.ctrlKey === true) || 287 (e.keyCode === 67 && e.ctrlKey === true) || 288 (e.keyCode === 86 && e.ctrlKey === true) || 289 (e.keyCode === 88 && e.ctrlKey === true)) { 290 return; // ÐозволиÑÑ 291 } 292 // УбедиÑÑÑÑ, ÑÑо ÑÑо ÑиÑÑа, и оÑÑановиÑÑ Ð²Ð²Ð¾Ð´, еÑли Ñже 18 Ñимволов 293 if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) { 294 e.preventDefault(); 295 } 296 // ÐгÑаниÑиваем Ð´Ð»Ð¸Ð½Ñ Ð²Ð²Ð¾Ð´Ð° 297 if (this.value.replace(/\D/g, '').length >= 11 && e.keyCode !== 8 && e.keyCode !== 46) { 298 e.preventDefault(); 299 } 300 }); 301 302 // ÐбÑабоÑка вÑÑавки (Paste) 303 $phoneInput[0].addEventListener('paste', function (e) { 304 e.preventDefault(); 305 // ÐолÑÑаем вÑÑавленнÑй ÑекÑÑ 306 let paste = (e.clipboardData || window.clipboardData).getData('text'); 307 // ÐÑÑавлÑем ÑолÑко ÑиÑÑÑ 308 let pastedDigits = paste.replace(/\D/g, ''); 309 // ÐÑли наÑинаеÑÑÑ Ñ 8, менÑем на 7 310 if (pastedDigits.startsWith('8')) { 311 pastedDigits = '7' + pastedDigits.substring(1); 312 } else if (!pastedDigits.startsWith('7') && pastedDigits.length > 0) { 313 pastedDigits = '7' + pastedDigits; 314 } 315 // ÐгÑаниÑиваем 11 ÑиÑÑами 316 pastedDigits = pastedDigits.substring(0, 11); 317 // ФоÑмаÑиÑÑем и ÑÑÑанавливаем 318 let formattedValue = ''; 319 if (pastedDigits.length > 0) { 320 formattedValue = '+7 (' + pastedDigits.substring(1, 4); 321 } 322 if (pastedDigits.length >= 5) { 323 formattedValue += ') ' + pastedDigits.substring(4, 7); 324 } 325 if (pastedDigits.length >= 8) { 326 formattedValue += '-' + pastedDigits.substring(7, 9); 327 } 328 if (pastedDigits.length >= 10) { 329 formattedValue += '-' + pastedDigits.substring(9, 11); 330 } 331 this.value = formattedValue; 332 }); 333 } 334} 335 336 337 338// --- ÐниÑиализаÑÐ¸Ñ Ð¼Ð°Ñки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ #userPhoneAuth --- 339//initializePhoneMask($userPhoneAuth); 340 341// --- ÐниÑиализаÑÐ¸Ñ Ð¼Ð°Ñки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ñ #cont_phone --- 342// --- ÐдÑм поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑлеменÑа --- 343 const phoneInputId = 'cont_phone'; 344 const intervalId = setInterval(function() { 345 const $phoneInput = $('#' + phoneInputId); 346 if ($phoneInput.length && !$phoneInput.data('mask-initialized')) { 347 console.log("ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½, иниÑиализаÑÐ¸Ñ Ð¼Ð°Ñки длÑ:", phoneInputId); 348 initializePhoneMask($phoneInput); 349 clearInterval(intervalId); // ÐÑÑанавливаем пÑовеÑкÑ, еÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½ 350 } 351 }, 500); // ÐÑовеÑÑем каждÑе 500 Ð¼Ñ 352 353 // Ðожно добавиÑÑ Ð¾Ð³ÑаниÑение по вÑемени, ÑÑÐ¾Ð±Ñ Ð½Ðµ пÑовеÑÑÑÑ Ð±ÐµÑконеÑно 354 setTimeout(function() { 355 clearInterval(intervalId); 356 console.log("ТаймаÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ ÑлеменÑа " + phoneInputId + " пÑевÑÑен."); 357 }, 3000); // ÐÑекÑаÑиÑÑ Ð¿ÑовеÑÐºÑ ÑеÑез 3 ÑекÑÐ½Ð´Ñ 358 359 360 // ÐÑкÑÑÑие модалÑного окна (пÑимеÑ: пÑи клике на ÐºÐ½Ð¾Ð¿ÐºÑ Ð¸Ð»Ð¸ по ÑÑловиÑ) 361 // ÐÑ Ð¼Ð¾Ð¶ÐµÑе вÑзÑваÑÑ showPhoneModal() в нÑжнÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ 362 function showPhoneModal() { 363 $phoneModal.show(); 364 // СбÑÐ¾Ñ ÑоÑÐ¼Ñ Ð¿Ñи оÑкÑÑÑии 365 $userPhone.val(''); 366 // УÑÑанавливаем placeholder заново, еÑли поле пÑÑÑое 367 if ($userPhone.val() === '') { 368 $userPhone.attr('placeholder', '+7 (___) ___-__-__'); 369 } 370 hidePhoneError(); 371 } 372 373 // ÐакÑÑÑие модалÑного окна 374 $phoneClose.add($phoneModal).on('click', function (e) { 375 if (e.target === $phoneModal[0] || $(e.target).hasClass('close') || $(e.target).closest('.close').length) { 376 $phoneModal.hide(); 377 } 378 }); 379 380 // ÐоказаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ 381 function showPhoneError(message) { 382 $phoneError.text(message).show(); 383 } 384 385 // СкÑÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ 386 function hidePhoneError() { 387 $phoneError.hide(); 388 //$phoneErrorAuth.hide(); 389 } 390 391 // ÐалидаÑÐ¸Ñ ÑелеÑона 392 function validatePhone(phone) { 393 // ÐÑовеÑка на полноÑÑ: +7 (999) 999-99-99 - ÑÑо 18 Ñимволов 394 // и должно ÑодеÑжаÑÑ Ñовно 11 ÑиÑÑ, наÑинаÑÑÐ¸Ñ ÑÑ Ñ 7 395 const cleanPhone = phone.replace(/\D/g, ''); 396 return phone.length === 18 && cleanPhone.length === 11 && cleanPhone.startsWith('7'); 397 } 398 399// --- ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки ÑекбокÑа ÑоглаÑÐ¸Ñ --- 400function validateAgreementCheckbox(checkboxSelector, errorContainerSelector) { 401 402 const $checkbox = $(checkboxSelector); 403 const $errorContainer = $(errorContainerSelector); 404 const errorMessage = 'ÐожалÑйÑÑа, ÑоглаÑиÑеÑÑ Ñ ÑÑловиÑми иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ полиÑикой конÑиденÑиалÑноÑÑи.'; 405 406 if (!$checkbox.is(':checked')) { 407 // ÐÑли ÑÐµÐºÐ±Ð¾ÐºÑ Ð½Ðµ оÑмеÑен 408 if ($errorContainer.length) { 409 $errorContainer.text(errorMessage).show(); 410 } else { 411 alert(errorMessage); // ÐапаÑной ваÑÐ¸Ð°Ð½Ñ 412 } 413 return false; // ÐалидаÑÐ¸Ñ Ð½Ðµ пÑойдена 414 } else { 415 // ÐÑли ÑÐµÐºÐ±Ð¾ÐºÑ Ð¾ÑмеÑен, ÑкÑÑваем оÑÐ¸Ð±ÐºÑ 416 if ($errorContainer.length) { 417 $errorContainer.hide(); 418 } 419 return true; // ÐалидаÑÐ¸Ñ Ð¿Ñойдена 420 } 421}
422// --- ÐÐ¾Ð½ÐµÑ ÑÑнкÑии --- 423 424 425 // --- ÐÐÐÐЯ ÐÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ: Удаление Ñлага авÑоÑизаÑии/ÑегиÑÑÑаÑии на ÑеÑвеÑе --- 426// ÐÑо пÑедоÑвÑаÑÐ°ÐµÑ Ð¿ÑеждевÑеменнÑй ÑÑÐ¿ÐµÑ check_phone_registration_status 427function deleteRedirectFlag(phone, successCallback, errorCallback) { 428 console.log("deleteRedirectFlag: ÐапÑÐ¾Ñ Ð½Ð° Ñдаление Ñлага Ð´Ð»Ñ ÑелеÑона:", phone); 429 // ÐолÑÑаем nonce Ð´Ð»Ñ ÑÑой опеÑаÑии 430 $.ajax({ 431 url: mains_ajax_object.ajax_url, 432 type: 'POST', 433 data: { 434 action: 'get_phone_registration_nonce' // ÐÑполÑзÑем ÑÑÑеÑÑвÑÑÑий ÑкÑн 435 }, 436 success: function(nonceResponse) { 437 console.log('deleteRedirectFlag: Nonce полÑÑен:', nonceResponse); 438 if (nonceResponse.success && nonceResponse.data.nonce) { 439 // ÐÑпÑавлÑем запÑÐ¾Ñ Ð½Ð° Ñдаление Ñлага 440 $.ajax({ 441 url: mains_ajax_object.ajax_url, 442 type: 'POST', 443 data: { 444 action: 'delete_user_redirect_flag', // ÐовÑй ÑкÑн, коÑоÑÑй нÑжно добавиÑÑ Ð² functions.php 445 phone: phone, 446 nonce: nonceResponse.data.nonce 447 }, 448 success: function(deleteResponse) { 449 console.log('deleteRedirectFlag: ÐÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа:', deleteResponse); 450 if (deleteResponse.success) { 451 console.log("deleteRedirectFlag: Флаг ÑÑпеÑно Ñдален (или не ÑÑÑеÑÑвовал)."); 452 if (typeof successCallback === 'function') { 453 successCallback(); 454 } 455 } else { 456 console.warn("deleteRedirectFlag: ÐÑибка пÑи Ñдалении Ñлага:", deleteResponse.data?.message || 'ÐеизвеÑÑÐ½Ð°Ñ Ð¾Ñибка'); 457 // Ðе кÑиÑиÑно, пÑодолжаем пÑоÑеÑÑ 458 if (typeof successCallback === 'function') { 459 successCallback(); 460 } 461 } 462 }, 463 error: function(xhr, status, error) { 464 console.error('deleteRedirectFlag: ÐÑибка AJAX пÑи Ñдалении Ñлага:', status, error); 465 // Ðе кÑиÑиÑно, пÑодолжаем пÑоÑеÑÑ 466 if (typeof successCallback === 'function') { 467 successCallback(); 468 } 469 } 470 }); 471 } else { 472 console.error('deleteRedirectFlag: Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce:', nonceResponse.data?.message || 'ÐеизвеÑÑÐ½Ð°Ñ Ð¾Ñибка'); 473 // Ðе кÑиÑиÑно, пÑодолжаем пÑоÑеÑÑ 474 if (typeof successCallback === 'function') { 475 successCallback(); 476 } 477 } 478 }, 479 error: function(xhr, status, error) { 480 console.error('deleteRedirectFlag: ÐÑибка полÑÑÐµÐ½Ð¸Ñ nonce:', status, error); 481 // Ðе кÑиÑиÑно, пÑодолжаем пÑоÑеÑÑ 482 if (typeof successCallback === 'function') { 483 successCallback(); 484 } 485 } 486 }); 487} 488// --- ÐÐÐÐЦ ÐÐÐÐÐ ÐÑпомогаÑелÑной ÑÑнкÑии --- 489 490// --- ÐбÑабоÑÑик клика по кнопке оÑпÑавки ÑелеÑона (Ð´Ð»Ñ Ð¾Ð¿Ð»Ð°ÑÑ Ð¸ пÑобнÑÑ ÐºÑиÑÑаллов) --- 491// --- ÐÑполÑзÑÐµÑ sendZvonokCall и pollPhoneAuthStatus --- 492// --- ÐбÑий обÑабоÑÑик Ð´Ð»Ñ #sendPhoneBtn и #sendPhoneBtnAuth --- 493$(document).on('click', '#sendPhoneBtn, #sendPhoneBtnAuth', function (e) { 494 e.preventDefault(); 495 496 const $btn = $(this); 497 const originalBtnText = $btn.text(); 498 499 // ÐпÑеделÑем конÑекÑÑ Ð½Ð° оÑнове ID кнопки 500 let phoneInputSelector, modalSelector, checkboxSelector, errorContainerSelector; 501 502 if ($btn.is('#sendPhoneBtn')) { 503 phoneInputSelector = '#userPhone'; 504 modalSelector = '#paymentModal'; 505 checkboxSelector = '#custom-checkbox-reg'; 506 errorContainerSelector = '#phoneError'; 507 } else if ($btn.is('#sendPhoneBtnAuth')) { 508 phoneInputSelector = '#userPhoneAuth'; 509 modalSelector = '#f_phone'; // УбедиÑеÑÑ, ÑÑо #f_phone дейÑÑвиÑелÑно ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÑейнеÑом Ð´Ð»Ñ #sendPhoneBtnAuth 510 checkboxSelector = '#custom-checkbox'; // ÐÑполÑзÑем ÑÐµÐºÐ±Ð¾ÐºÑ Ð´Ð»Ñ Ð°Ð²ÑоÑизаÑии 511 errorContainerSelector = '#phoneErrorAuth'; // ÐÑполÑзÑем конÑÐµÐ¹Ð½ÐµÑ Ð¾Ñибки Ð´Ð»Ñ Ð°Ð²ÑоÑизаÑии 512 } else { 513 console.error('ÐбÑабоÑÑик: ÐеизвеÑÑÐ½Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° вÑзвала ÑобÑÑие:', $btn.attr('id')); 514 return; // ÐÑекÑаÑаем вÑполнение, еÑли кнопка неизвеÑÑна 515 } 516 517 const phone = $(phoneInputSelector).val().trim(); 518 const $modal = $(modalSelector); // ÐонÑÐµÐ¹Ð½ÐµÑ Ð¼Ð¾Ð´Ð°Ð»Ñного окна, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ 519 const $errorContainer = $(errorContainerSelector); // ÐонÑÐµÐ¹Ð½ÐµÑ Ð¾Ñибки, завиÑÐ¸Ñ Ð¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ 520 521 const isAgreed = validateAgreementCheckbox(checkboxSelector, errorContainerSelector); 522 if (!isAgreed) { 523 // ÐÑли пÑовеÑка не пÑойдена, оÑÑанавливаем вÑполнение 524 return; 525 } 526 console.log(phoneInputSelector); 527 // --- ÐалидаÑÐ¸Ñ Ð¸ ÑоÑмаÑиÑование --- 528 hidePhoneError(); // СкÑÑÑÑ Ð¿ÑедÑдÑÑие оÑибки 529 530 if (typeof validatePhone !== 'function' || !validatePhone(phone)) { 531 const errorMsg = 'ÐожалÑйÑÑа, введиÑе полнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона.'; 532 if ($errorContainer.length) { 533 $errorContainer.text(errorMsg).show(); 534 } else { 535 alert(errorMsg); 536 } 537 // Ðнопка бÑÐ´ÐµÑ ÑазблокиÑована в onErrorCallback, еÑли она Ñам вÑзÑваеÑÑÑ, или здеÑÑ: 538 $btn.prop('disabled', false).text(originalBtnText); 539 return; // ÐÑÑанавливаем вÑполнение пÑи оÑибке валидаÑии 540 } 541 542 const formattedPhone = '+7' + phone.replace(/\D/g, '').substring(1); 543 // --- ÐÐ¾Ð½ÐµÑ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии --- 544 545 $btn.prop('disabled', true).text('ÐÑовеÑка...'); 546 547 console.log("ÐаÑинаем пÑовеÑÐºÑ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ ÑелеÑона:", formattedPhone); 548 549 // --- Шаг 1: ÐолÑÑаем nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑÐµÐ»Ñ --- 550 $.ajax({ 551 url: mains_ajax_object.ajax_url, 552 type: 'POST', 553 data: { 554 action: 'get_phone_registration_nonce' // ÐÑполÑзÑем ÑÑÑеÑÑвÑÑÑий nonce action 555 }, 556 success: function (nonceResponse) { 557 console.log('Nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑен:', nonceResponse); 558 if (nonceResponse.success && nonceResponse.data.nonce) { 559 560 // --- Шаг 2: ÐÑовеÑÑем, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ полÑзоваÑÐµÐ»Ñ --- 561 $.ajax({ 562 url: mains_ajax_object.ajax_url, 563 type: 'POST', 564 data: { 565 action: 'check_user_exists_by_phone', 566 phone: formattedPhone, 567 nonce: nonceResponse.data.nonce, 568 // ÐеÑедаем даннÑе пакеÑа 569 package_id: window.currentPackageSelected ? window.currentPackageSelected.id : null, 570 price: window.currentPackageSelected ? window.currentPackageSelected.price : null, 571 amount: window.currentPackageSelected ? window.currentPackageSelected.amount : null 572 }, 573 success: function (checkResponse) { 574 console.log('ÐÑÐ²ÐµÑ Ð¿ÑовеÑки полÑзоваÑелÑ:', checkResponse); 575 // РазблокиÑÑем кнопкÑ, Ñак как оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ° пÑовеÑки завеÑÑена 576 $btn.prop('disabled', false).text(originalBtnText); 577 578 if (checkResponse.success) { 579 if (checkResponse.data.user_exists) { 580 // - ÐÐÐЬÐÐÐÐТÐÐЬ ÐÐÐÐÐÐ - 581 console.log('ÐолÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¹Ð´ÐµÐ½.'); 582
583 // ÐпÑеделÑем, ÑвлÑеÑÑÑ Ð»Ð¸ ÑÑо пÑобнÑми кÑиÑÑаллами 584 const isTrial = window.currentPackageSelected && 585 window.currentPackageSelected.price === 0 && 586 window.currentPackageSelected.amount === 25; 587 588 if (isTrial) { 589 // --- ÐÐÐÐÐÐ ÐÐЯ ÐÐ ÐÐÐЫХ ÐÐ ÐСТÐÐÐÐÐ --- 590 console.log('ÐÑо пÑобнÑе кÑиÑÑаллÑ. ÐаÑинаем авÑоÑизаÑÐ¸Ñ (оÑпÑÐ°Ð²ÐºÑ Ð·Ð²Ð¾Ð½ÐºÐ° Ð´Ð»Ñ Ð¿Ð¾Ð´ÑвеÑждениÑ).'); 591 $btn.prop('disabled', true).text('ÐÑпÑавка звонка...'); 592 593 594 // --- ÐÐÐÐÐ: Шаг 1a: УдалÑем ÑÑаÑÑй Ñлаг авÑоÑизаÑии пеÑед оÑпÑавкой нового звонка --- 595 deleteRedirectFlag(formattedPhone, function() { 596 console.log("СÑаÑÑй Ñлаг авÑоÑизаÑии Ñдален (или оÑÑÑÑÑÑвовал). ÐÑодолжаем оÑпÑÐ°Ð²ÐºÑ Ð·Ð²Ð¾Ð½ÐºÐ°."); 597 598 599 // --- ÐÑполÑзÑем внеÑнÑÑ ÑнивеÑÑалÑнÑÑ ÑÑнкÑÐ¸Ñ Ð¾ÑпÑавки звонка --- 600 const selectedPackage = window.currentPackageSelected || null; 601 sendZvonokCall( 602 formattedPhone, 603 selectedPackage, // ÐеÑедаем даннÑе пакеÑа 604 // --- onSuccessCallback Ð´Ð»Ñ sendZvonokCall --- 605 function(callResponse, nonceFromSendZvonok) { // nonceFromSendZvonok пеÑедаеÑÑÑ sendZvonokCall 606 console.log("Ðвонок Ð´Ð»Ñ Ð°Ð²ÑоÑизаÑии (пÑобнÑе кÑиÑÑаллÑ) оÑпÑавлен ÑÑпеÑно."); 607 608 // ÐбновлÑем UI модалÑного окна Ð´Ð»Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð¿ÑоÑа 609 $modal.find('.modal-title').html(`<h2 class="modal-title">Ðвонок оÑпÑавлен</h2>`); 610 $modal.find('.modal-description').text('Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон'); 611 // $modal.find('#userPhone').closest('.input-group').hide(); // ÐÐÐÐÐÐÐÐ 612 $(phoneInputSelector).closest('.input-group').hide(); 613 // $modal.find('.checkbox-container').hide(); // ÐÐÐÐÐÐÐÐ 614 $(checkboxSelector).closest('.checkbox-container').hide(); 615 616 $btn.hide(); // СкÑÑваем ÐºÐ½Ð¾Ð¿ÐºÑ 617 // $('#phonePollingStatus').show().text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba'); // ÐÐÐÐÐÐÐÐ 618 $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first().show().text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba'); 619 620 // --- ÐÑполÑзÑем внеÑнÑÑ ÑнивеÑÑалÑнÑÑ ÑÑнкÑÐ¸Ñ Ð¾Ð¿ÑоÑа авÑоÑизаÑии --- 621 console.log("Ðвонок Ð´Ð»Ñ Ð°Ð²ÑоÑизаÑии (пÑобнÑе кÑиÑÑаллÑ) оÑпÑавлен ÑÑпеÑно. ÐапÑÑк ÑнивеÑÑалÑного опÑоÑа."); 622 623 // ÐодгоÑавливаем ÑпеÑиÑиÑнÑе Ð´Ð»Ñ #sendPhoneBtn паÑамеÑÑÑ Ð´Ð»Ñ pollPhoneAuthStatus 624 // const authPollingOptions = { // ÐÐÐÐÐÐÐÐ 625 const authPollingOptions = { 626 // statusElementSelector: '#phonePollingStatus', // УбедиÑеÑÑ, ÑÑо ID пÑавилÑнÑй в #paymentModal // ÐÐÐÐÐÐÐÐ 627 statusElementSelector: '#phonePollingStatusAuth', // ÐÑполÑзÑем пÑавилÑнÑй ÑелекÑÐ¾Ñ Ð´Ð»Ñ ÑÑаÑÑÑа в модалке авÑоÑизаÑии 628 // modalContentSelector: '#paymentModal', // ÐÐÐÐÐÐÐÐ 629 modalContentSelector: modalSelector, 630 // phoneInputSelector: '#userPhone', // ÐÐÐÐÐÐÐÐ 631 phoneInputSelector: phoneInputSelector, 632 // buttonSelector: '#sendPhoneBtn', // ÐÐÐÐÐÐÐÐ 633 buttonSelector: '#' + $btn.attr('id'), 634 // Ðожно иÑполÑзоваÑÑ Ð¿Ð°ÑамеÑÑÑ Ð¸Ð· ÑÑаÑого #sendPhoneBtnAuth, еÑли нÑжно болÑÑе вÑемени: 635 // maxPolls: 60, 636 // pollIntervalTime: 5000, 637 onMaxAttempts: function () { 638 // --- СпеÑиÑиÑÐ½Ð°Ñ Ð»Ð¾Ð³Ð¸ÐºÐ° возвÑаÑа UI Ð´Ð»Ñ #sendPhoneBtn --- 639 console.log('ÐÑевÑÑено макÑималÑное колиÑеÑÑво попÑÑок опÑоÑа авÑоÑизаÑии (пÑобнÑе кÑиÑÑаллÑ).'); 640 // const $modal = $('#paymentModal'); // ÐÐÐÐÐÐÐÐ - $modal Ñже опÑеделен вÑÑе 641 // ÐозвÑаÑаем ÑоÑÐ¼Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние 642 setTimeout(() => { 643 if ($modal.length) { 644 $modal.find('.modal
644-title').html(`<h2 class="modal-title">УкажиÑе Ð½Ð¾Ð¼ÐµÑ ÑелеÑона</h2> 645 <p class="modal-description">Ðа ÑказаннÑй Ð½Ð¾Ð¼ÐµÑ Ð¼Ð¾Ð¼ÐµÐ½ÑалÑно поÑÑÑÐ¿Ð¸Ñ Ð·Ð²Ð¾Ð½Ð¾Ðº. Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон</p>`); 646 // $modal.find('#userPhone').closest('.input-group').show(); // ÐÐÐÐÐÐÐÐ 647 $(phoneInputSelector).closest('.input-group').show(); 648 // $modal.find('.checkbox-container').show(); // ÐÐÐÐÐÐÐÐ 649 $(checkboxSelector).closest('.checkbox-container').show(); 650 $btn.show().prop('disabled', false).text('ÐолÑÑиÑÑ ÐºÐ¾Ð´ подÑвеÑждениÑ'); 651 // $('#userPhone').val(''); // ÐÐÐÐÐÐÐÐ 652 $(phoneInputSelector).val(''); 653 // $('#phonePollingStatus').hide().text('').removeAttr('style'); // ÐÐÐÐÐÐÐÐ 654 $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first().hide().text('').removeAttr('style'); 655 } 656 }, 2000); 657 }, 658 onError: function (xhr, status, error) { 659 // Ðогика пÑи оÑибке AJAX 660 console.warn('ÐÑибка AJAX в опÑоÑе авÑоÑизаÑии #sendPhoneBtn (пÑобнÑе кÑиÑÑаллÑ):', status, error); 661 } 662 }; 663 664 // ÐапÑÑкаем ÑнивеÑÑалÑнÑй опÑоÑ, пеÑÐµÐ´Ð°Ð²Ð°Ñ nonce, полÑÑеннÑй в sendZvonokCall 665 // ÐÑедполагаеÑÑÑ, ÑÑо nonceFromSendZvonok - ÑÑо пÑавилÑнÑй nonce Ð´Ð»Ñ check_phone_registration_status 666 pollPhoneAuthStatus(formattedPhone, nonceFromSendZvonok, authPollingOptions); 667 // --- ÐÐ¾Ð½ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑнивеÑÑалÑной ÑÑнкÑии опÑоÑа --- 668 669 }, 670 // --- onErrorCallback Ð´Ð»Ñ sendZvonokCall --- 671 function (errorMsg) { 672 console.error("ÐÑибка оÑпÑавки звонка Ð´Ð»Ñ Ð°Ð²ÑоÑизаÑии (пÑобнÑе кÑиÑÑаллÑ):", errorMsg); 673 // showPhoneError(errorMsg); // ÐÐÐÐÐÐÐÐ 674 if ($errorContainer.length) { 675 $errorContainer.text(errorMsg).show(); 676 } else { 677 alert(errorMsg); 678 } 679 $btn.prop('disabled', false).text(originalBtnText); 680 // ÐозвÑаÑаем ÑоÑÐ¼Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние 681 $modal.find('.modal-title').html(`<h2 class="modal-title">УкажиÑе Ð½Ð¾Ð¼ÐµÑ ÑелеÑона</h2> 682 <p class="modal-description">Ðа ÑказаннÑй Ð½Ð¾Ð¼ÐµÑ Ð¼Ð¾Ð¼ÐµÐ½ÑалÑно поÑÑÑÐ¿Ð¸Ñ Ð·Ð²Ð¾Ð½Ð¾Ðº. Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон. ÐоÑле подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ закÑÑвайÑе ÑÑо окно! ÐÑÐ¾Ð¸Ð·Ð¾Ð¹Ð´ÐµÑ Ð°Ð²ÑомаÑиÑеÑÐºÐ°Ñ Ð°Ð²ÑоÑизаÑиÑ!</p>`); 683 // $modal.find('#userPhone').closest('.input-group').show(); // ÐÐÐÐÐÐÐÐ 684 $(phoneInputSelector).closest('.input-group').show(); 685 // $modal.find('.checkbox-container').show(); // ÐÐÐÐÐÐÐÐ 686 $(checkboxSelector).closest('.checkbox-container').show(); 687 $btn.show().prop('disabled', false).text(originalBtnText); 688 } 689 ); 690 // --- ÐÐ¾Ð½ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ sendZvonokCall --- 691 }, function(deleteError) { 692 // ÐÑибка пÑи Ñдалении Ñлага (Ñедко бÑÐ²Ð°ÐµÑ ÐºÑиÑиÑной) 693 console.warn("ÐÑедÑпÑеждение: ÐÑибка пÑи Ñдалении ÑÑаÑого Ñлага авÑоÑизаÑии:", deleteError); 694 // ÐÑе Ñавно пÑодолжаем пÑоÑеÑÑ, надеÑÑÑ, ÑÑо ÑÑаÑÑй Ñлаг не помеÑÐ°ÐµÑ 695 // --- Шаг 2: ÐÑпÑавлÑем звонок Ð´Ð»Ñ Ð¿Ð¾Ð´ÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ --- 696 sendZvonokCall( 697 formattedPhone, 698 null, 699 function(callResponse, nonceForPolling) { /* ... логика onSuccess ... */ }, 700 function(errorMsg) { /* ... логика onError ... */ } 701 ); 702 // --- ÐÐ¾Ð½ÐµÑ sendZvonokCall --- 703 }); 704 // --- ÐÐÐÐЦ ÐÐÐÐÐÐ --- 705 706 } else { 707 // --- ÐÐÐÐÐÐ ÐÐЯ ÐÐЫЧÐЫХ ÐÐÐÐТÐÐ (ÐÐÐЬÐÐÐÐТÐÐЬ ÐÐÐÐÐÐ) --- 708 console.log('ÐÑо обÑÑнÑй пакеÑ. ÐолÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¹Ð´ÐµÐ½. ÐеÑÐµÑ Ð¾Ð´ к оплаÑе.'); 709 // СкÑÑваем модалÑное окно 710 $modal.hide(); 711 // ÐеÑÐµÑ Ð¾Ð´ к оплаÑе 712 if (typeof showPaymentForm !== 'undefined') { 713 // ÐÑполÑзÑем даннÑе из checkResponse.data, Ñак как они бÑли полÑÑÐµÐ½Ñ Ð½Ð° ÑеÑвеÑе 714 715 const finalUserId = checkResponse.data.user_id; 716 const finalPrice = checkResponse.data.price !== undefined ? checkResponse.data.price : (window.currentPackageSelected ? window.currentPackageSelected.price : 0); 717 const finalAmount = checkResponse.data.amount !== undefined ? checkResponse.data.amount : (window.currentPackageSelected ? window.currentPackageSelected.amount : 0); 718 const finalPackageId = checkResponse.data.package_id !== undefined ? checkResponse.data.package_id : (window.currentPackageSelected ? window.currentPackageSelected.id : ''); 719 720 showPaymentForm(finalUserId, finalPrice, finalAmount, finalPackageId); 721 722 723 } else { 724 console.error('ФÑнкÑÐ¸Ñ showPaymentForm не найдена.'); 725 alert('ÐÑибка иниÑиализаÑии ÑоÑÐ¼Ñ Ð¾Ð¿Ð»Ð°ÑÑ.'); 726 // ÐоÑÑÑанавливаем ÐºÐ½Ð¾Ð¿ÐºÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние 727 $btn.prop('disabled', false).text(originalBtnText); 728 showPhoneModal(); // ÐоказÑваем Ð¼Ð¾Ð´Ð°Ð»ÐºÑ Ñнова, еÑли нÑжно 729 } 730 } 731 } else { 732 // - ÐÐÐЬÐÐÐÐТÐÐЬ ÐÐ ÐÐÐÐÐÐ, ÐУÐÐÐ Ð ÐÐÐСТРÐЦÐЯ - 733 console.log('ÐолÑзоваÑÐµÐ»Ñ Ð½Ðµ найден. ÐеÑÐµÑ Ð¾Ð´ к ÑегиÑÑÑаÑии (оÑпÑавке звонка).'); 734 $btn.text('ÐÑпÑавка звонка...'); 735 736 // --- ÐÑполÑзÑем внеÑнÑÑ ÑнивеÑÑалÑнÑÑ ÑÑнкÑÐ¸Ñ Ð¾ÑпÑавки звонка --- 737 const selectedPackage = window.currentPackageSelected || null; 738 sendZvonokCall( 739 formattedPhone, 740 selectedPackage, // ÐеÑедаем даннÑе пакеÑа 741 // --- onSuccessCallback Ð´Ð»Ñ sendZvonokCall --- 742 function (callResponse, nonceFromSendZvonokReg) { // nonceFromSendZvonokReg пеÑедаеÑÑÑ sendZvonokCall 743 console.log("Ðвонок Ð´Ð»Ñ ÑегиÑÑÑаÑии оÑпÑавлен ÑÑпеÑно."); 744 745 // ÐбновлÑем UI модалÑного окна Ð´Ð»Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð¿ÑоÑа
746 $modal.find('.modal-title').html(`<h2 class="modal-title">Ðвонок оÑпÑавлен</h2>`); 747 $modal.find('.modal-description').text('Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон.ÐоÑле подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ðµ закÑÑвайÑе ÑÑо окно! ÐÑÐ¾Ð¸Ð·Ð¾Ð¹Ð´ÐµÑ Ð°Ð²ÑомаÑиÑеÑÐºÐ°Ñ Ð°Ð²ÑоÑизаÑиÑ!'); 748 // $modal.find('#userPhone').closest('.input-group').hide(); // ÐÐÐÐÐÐÐÐ 749 $(phoneInputSelector).closest('.input-group').hide(); 750 // $modal.find('.checkbox-container').hide(); // ÐÐÐÐÐÐÐÐ 751 $(checkboxSelector).closest('.checkbox-container').hide(); 752 $btn.hide(); // СкÑÑваем ÐºÐ½Ð¾Ð¿ÐºÑ 753 // $('#phonePollingStatus').show().text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba'); // ÐÐÐÐÐÐÐÐ 754 $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first().show().text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba'); 755 756 // --- ÐÑполÑзÑем ÑÑÑеÑÑвÑÑÑÑÑ ÑÑнкÑÐ¸Ñ Ð¾Ð¿ÑоÑа ÑегиÑÑÑаÑии --- 757 // ÐÑедполагаеÑÑÑ, ÑÑо startRegistrationPolling ÑÑÑеÑÑвÑÐµÑ Ð¸ ÑеализÑÐµÑ Ð»Ð¾Ð³Ð¸ÐºÑ 758 // Ñ Ð²Ñзовом check_phone_registration_status и поÑледÑÑÑим наÑиÑлением кÑиÑÑаллов/пеÑÐµÑ Ð¾Ð´Ð¾Ð¼ к оплаÑе 759 760 const isTrial = (window.currentPackageSelected && window.currentPackageSelected.price === 0 && window.currentPackageSelected.amount === 25); 761 console.log("startRegistrationPolling: isTrial опÑеделен как:", isTrial, "Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑа:", window.currentPackageSelected, "в модалÑном окне:", $modal.selector); 762 763 startRegistrationPolling(formattedPhone, nonceFromSendZvonokReg, $modal, isTrial); 764 765 766 }, 767 // --- onErrorCallback Ð´Ð»Ñ sendZvonokCall --- 768 function (errorMsg) { 769 console.error("ÐÑибка оÑпÑавки звонка Ð´Ð»Ñ ÑегиÑÑÑаÑии:", errorMsg); 770 // showPhoneError(errorMsg); // ÐÐÐÐÐÐÐÐ 771 if ($errorContainer.length) { 772 $errorContainer.text(errorMsg).show(); 773 } else { 774 alert(errorMsg); 775 } 776 $btn.prop('disabled', false).text(originalBtnText); 777 // ÐозвÑаÑаем ÑоÑÐ¼Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние 778 $modal.find('.modal-title').html(`<h2 class="modal-title">УкажиÑе Ð½Ð¾Ð¼ÐµÑ ÑелеÑона</h2> 779 <p class="modal-description">Ðа ÑказаннÑй Ð½Ð¾Ð¼ÐµÑ Ð¼Ð¾Ð¼ÐµÐ½ÑалÑно поÑÑÑÐ¿Ð¸Ñ Ð·Ð²Ð¾Ð½Ð¾Ðº. Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон</p>`); 780 // $modal.find('#userPhone').closest('.input-group').show(); // ÐÐÐÐÐÐÐÐ 781 $(phoneInputSelector).closest('.input-group').show(); 782 // $modal.find('.checkbox-container').show(); // ÐÐÐÐÐÐÐÐ 783 $(checkboxSelector).closest('.checkbox-container').show(); 784 $btn.show().prop('disabled', false).text(originalBtnText); 785 } 786 ); 787 // --- ÐÐ¾Ð½ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ sendZvonokCall --- 788 } 789 } else { 790 // --- ÐÑибка Ð¾Ñ ÑеÑвеÑа пÑи пÑовеÑке полÑзоваÑÐµÐ»Ñ --- 791 console.error('ÐÑибка пÑовеÑки полÑзоваÑелÑ:', checkResponse.data.message); 792 // showPhoneError(checkResponse.data.message || 'ÐÑибка пÑовеÑки полÑзоваÑелÑ.'); // ÐÐÐÐÐÐÐÐ 793 if ($errorContainer.length) { 794 $errorContainer.text(checkResponse.data.message || 'ÐÑибка пÑовеÑки полÑзоваÑелÑ.').show(); 795 } else { 796 alert(checkResponse.data.message || 'ÐÑибка пÑовеÑки полÑзоваÑелÑ.'); 797 } 798 $btn.prop('disabled', false).text(originalBtnText); 799 } 800 }, 801 error: function (xhr, status, error) { 802 console.error('AJAX оÑибка (check_user_exists_by_phone):', status, error); 803 // showPhoneError('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи пÑовеÑке полÑзоваÑелÑ.'); // ÐÐÐÐÐÐÐÐ 804 if ($errorContainer.length) { 805 $errorContainer.text('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи пÑовеÑке полÑзоваÑелÑ.').show(); 806 } else { 807 alert('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи пÑовеÑке полÑзоваÑелÑ.'); 808 } 809 $btn.prop('disabled', false).text(originalBtnText); 810 } 811 }); 812 // --- ÐÐ¾Ð½ÐµÑ Ñага 2 --- 813 814 } else { 815 console.error('Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑелÑ:', nonceResponse); 816 // showPhoneError('ÐÑибка безопаÑноÑÑи пÑи пÑовеÑке полÑзоваÑелÑ.'); // ÐÐÐÐÐÐÐÐ 817 if ($errorContainer.length) { 818 $errorContainer.text('ÐÑибка безопаÑноÑÑи пÑи пÑовеÑке полÑзоваÑелÑ.').show(); 819 } else { 820 alert('ÐÑибка безопаÑноÑÑи пÑи пÑовеÑке полÑзоваÑелÑ.'); 821 } 822 $btn.prop('disabled', false).text(originalBtnText); 823 } 824 }, 825 error: function (xhr, status, error) { 826 console.error('ÐÑибка полÑÑÐµÐ½Ð¸Ñ nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑелÑ:', xhr, status, error); 827 // showPhoneError('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce Ð´Ð»Ñ Ð¿ÑовеÑки).'); // ÐÐÐÐÐÐÐÐ 828 if ($errorContainer.length) { 829 $errorContainer.text('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce Ð´Ð»Ñ Ð¿ÑовеÑки).').show(); 830 } else { 831 alert('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce Ð´Ð»Ñ Ð¿ÑовеÑки).'); 832 } 833 $btn.prop('disabled', false).text(originalBtnText); 834 } 835 }); 836 // --- ÐÐ¾Ð½ÐµÑ Ñага 1 --- 837}); 838// --- ÐÐ¾Ð½ÐµÑ Ð¾Ð±ÑабоÑÑика #sendPhoneBtn --- 839 840
841// --- ÐлобалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð° к оплаÑе (вÑзÑваеÑÑÑ Ð¸Ð· PHP/поÑÑбÑка) --- 842 843window.redirectToPayment = function(userId, packageId, price, amount) { 844 // ÐÑа ÑÑнкÑÐ¸Ñ Ð²ÑзÑваеÑÑÑ Ð¸Ð· обÑабоÑÑика поÑÑбÑка поÑле ÑÑпеÑной ÑегиÑÑÑаÑии 845 console.log('ÐеÑÐµÑ Ð¾Ð´ к оплаÑе Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ (без email):', userId, {packageId, price, amount}); 846 847 // --- ÐÐÐÐÐ: ÐÑполÑзÑем даннÑе пакеÑа из window.currentPackageSelected, игноÑиÑÑÑ Ð°ÑгÑменÑÑ --- 848 let finalPrice, finalAmount; 849 if (typeof window.currentPackageSelected !== 'undefined' && window.currentPackageSelected) { 850 finalPrice = window.currentPackageSelected.price; 851 finalAmount = window.currentPackageSelected.amount; 852 console.log('ÐÑполÑзÑем даннÑе пакеÑа из window.currentPackageSelected (игноÑиÑÑем аÑгÑменÑÑ):', {finalPrice, finalAmount}); 853 } else { 854 // ÐÑли по какой-Ñо пÑиÑине пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð½Ðµ найдена, пÑÑаемÑÑ Ð¸ÑполÑзоваÑÑ Ð¿ÐµÑеданнÑе знаÑÐµÐ½Ð¸Ñ 855 // (на ÑлÑÑай, еÑли логика измениÑÑÑ Ð² бÑдÑÑем) 856 console.warn('window.currentPackageSelected не найден. ÐÑÑаемÑÑ Ð¸ÑполÑзоваÑÑ Ð¿ÐµÑеданнÑе знаÑениÑ:', {price, amount}); 857 finalPrice = (price !== undefined && price > 0) ? price : 0; 858 finalAmount = (amount !== undefined && amount > 0) ? amount : 0; 859 if (finalPrice === 0 || finalAmount === 0) { 860 console.error('Ðе ÑдалоÑÑ Ð¾Ð¿ÑеделиÑÑ ÐºÐ¾ÑÑекÑнÑе price или amount ни из window.currentPackageSelected, ни из аÑгÑменÑов!'); 861 } 862 } 863 // --- ÐÐÐÐЦ ÐÐÐÐÐÐ --- 864 865 // ÐÑовеÑÑем, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑÑнкÑÐ¸Ñ showPaymentForm 866 if (typeof showPaymentForm !== 'undefined') { 867 console.log('ÐÑзÑваем showPaymentForm напÑÑмÑÑ (без email).'); 868 // СкÑÑваем модалÑное окно Ñ ÑелеÑоном, еÑли оно еÑе оÑкÑÑÑо 869 if (typeof $phoneModal !== 'undefined') { 870 $phoneModal.hide(); 871 } 872 873 // --- ÐÐÐÐÐÐÐÐ: ÐеÑедаем userId и даннÑе пакеÑа, полÑÑеннÑе вÑÑе --- 874 showPaymentForm(userId, finalPrice, finalAmount); 875 // --- ÐÐÐÐЦ ÐÐÐÐÐÐÐÐÐ --- 876 } else { 877 console.error('ФÑнкÑÐ¸Ñ showPaymentForm не найдена.'); 878 alert('ÐÑибка: ÑоÑма оплаÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпна. ÐожалÑйÑÑа, пеÑезагÑÑзиÑе ÑÑÑаниÑÑ.'); 879 } 880}; 881// --- ÐÐÐÐЦ ÐлобалÑной ÑÑнкÑии --- 882 883 884// --- УнивеÑÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¿Ð¾ ÑелеÑÐ¾Ð½Ñ --- 885// ÐаÑамеÑÑÑ: 886// - phone: ÐоÑмализованнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона (+7XXXXXXXXXX) 887// - successCallback: ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи ÑÑпеÑном оÑвеÑе Ð¾Ñ ÑеÑвеÑа. 888// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¾ÑвеÑа, напÑимеÑ: {success: true, data: {user_exists: true, user_id: 123}} 889// - errorCallback: ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи оÑибке AJAX или дÑÑгой кÑиÑиÑеÑкой оÑибке. 890// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¾Ñибки или ÑÑÑÐ¾ÐºÑ ÑообÑениÑ. 891function checkUserExists(phone, successCallback, errorCallback) { 892 if (!phone || typeof phone !== 'string') { 893 console.error('checkUserExists: ÐевеÑнÑй ÑоÑÐ¼Ð°Ñ Ð½Ð¾Ð¼ÐµÑа ÑелеÑона.'); 894 if (typeof errorCallback === 'function') { 895 errorCallback('ÐевеÑнÑй ÑоÑÐ¼Ð°Ñ Ð½Ð¾Ð¼ÐµÑа ÑелеÑона.'); 896 } 897 return; 898 } 899 900 console.log("ÐаÑинаем пÑовеÑÐºÑ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð»Ñ ÑелеÑона:", phone); 901 902 // --- Шаг 1: ÐолÑÑиÑÑ nonce --- 903 $.ajax({ 904 url: mains_ajax_object.ajax_url, 905 type: 'POST', 906 data: { 907 action: 'get_phone_registration_nonce' 908 }, 909 success: function(nonceResponse) { 910 console.log('Nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð»ÑÑен:', nonceResponse); 911 if (nonceResponse.success && nonceResponse.data.nonce) { 912 913 // --- Шаг 2: ÐÑовеÑиÑÑ ÑÑÑеÑÑвование полÑзоваÑÐµÐ»Ñ --- 914 $.ajax({ 915 url: mains_ajax_object.ajax_url, 916 type: 'POST', 917 data: { 918 action: 'check_user_exists_by_phone', 919 phone: phone, 920 nonce: nonceResponse.data.nonce 921 // ÐÑимеÑание: package_id, price, amount Ð
921½Ðµ пеÑедаÑÑÑÑ, Ñак как не нÑÐ¶Ð½Ñ Ð´Ð»Ñ ÑÑой пÑовеÑки 922 }, 923 success: function(checkResponse) { 924 console.log('ÐÑÐ²ÐµÑ Ð¿ÑовеÑки полÑзоваÑелÑ:', checkResponse); 925 // ÐеÑедаем оÑÐ²ÐµÑ Ð² successCallback, незавиÑимо Ð¾Ñ checkResponse.success 926 // Ðогика обÑабоÑки checkResponse.success бÑÐ´ÐµÑ Ð²Ð½ÑÑÑи successCallback 927 if (typeof successCallback === 'function') { 928 successCallback(checkResponse); 929 } 930 }, 931 error: function(xhr, status, error) { 932 console.error('AJAX оÑибка (check_user_exists_by_phone):', status, error); 933 if (typeof errorCallback === 'function') { 934 errorCallback('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи пÑовеÑке полÑзоваÑелÑ.'); 935 } 936 } 937 }); 938 // --- ÐÐÐÐЦ ШÐÐÐ 2 --- 939 940 } else { 941 const errorMsg = nonceResponse.data?.message || 'ÐÑибка безопаÑноÑÑи пÑи пÑовеÑке полÑзоваÑÐµÐ»Ñ (не ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce).'; 942 console.error('Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑелÑ:', errorMsg); 943 if (typeof errorCallback === 'function') { 944 errorCallback(errorMsg); 945 } 946 } 947 }, 948 error: function(xhr, status, error) { 949 console.error('ÐÑибка полÑÑÐµÐ½Ð¸Ñ nonce Ð´Ð»Ñ Ð¿ÑовеÑки полÑзоваÑелÑ:', xhr, status, error); 950 if (typeof errorCallback === 'function') { 951 errorCallback('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce Ð´Ð»Ñ Ð¿ÑовеÑки).'); 952 } 953 } 954 }); 955 // --- ÐÐÐÐЦ Шага 1 --- 956} 957 958// --- УнивеÑÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑпÑавки звонка ÑеÑез Zvonok --- 959// ÐаÑамеÑÑÑ: 960// - phone: ÐоÑмализованнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона (+7XXXXXXXXXX) 961// - packageData: (ÐпÑионалÑно) ÐбÑÐµÐºÑ Ñ Ð´Ð°Ð½Ð½Ñми пакеÑа {id, price, amount} Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² transient 962// - successCallback: ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи ÑÑпеÑной оÑпÑавке звонка. 963// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¾ÑвеÑа, напÑимеÑ: {success: true, data: {call_id: "..."}} 964// - errorCallback: ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи оÑибке AJAX или дÑÑгой кÑиÑиÑеÑкой оÑибке. 965// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¾Ñибки или ÑÑÑÐ¾ÐºÑ ÑообÑениÑ. 966function sendZvonokCall(phone, packageData, successCallback, errorCallback) { 967 if (!phone || typeof phone !== 'string') { 968 console.error('sendZvonokCall: ÐевеÑнÑй ÑоÑÐ¼Ð°Ñ Ð½Ð¾Ð¼ÐµÑа ÑелеÑона.'); 969 if (typeof errorCallback === 'function') { 970 errorCallback('ÐевеÑнÑй ÑоÑÐ¼Ð°Ñ Ð½Ð¾Ð¼ÐµÑа ÑелеÑона.'); 971 } 972 return; 973 } 974 975 // ÐолÑÑаем nonce Ð´Ð»Ñ Ð¾ÑпÑавки звонка 976 $.ajax({ 977 url: mains_ajax_object.ajax_url, 978 type: 'POST', 979 data: { 980 action: 'get_phone_registration_nonce' // ÐÑполÑзÑем ÑÐ¾Ñ Ð¶Ðµ ÑкÑн Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ nonce 981 }, 982 success: function(nonceResponse) { 983 console.log('Nonce Ð´Ð»Ñ Ð¾ÑпÑавки звонка полÑÑен:', nonceResponse); 984 if (nonceResponse.success && nonceResponse.data.nonce) { 985 986 // ÐодгоÑавливаем даннÑе Ð´Ð»Ñ Ð¾ÑпÑавки звонка 987 var requestData = { 988 action: 'send_zvonok_call', 989 phone: phone, 990 nonce: nonceResponse.data.nonce 991 }; 992 993 // ÐобавлÑем даннÑе пакеÑа, еÑли они пеÑÐµÐ´Ð°Ð½Ñ 994 if (packageData && typeof packageData === 'object') { 995 requestData.package_id = packageData.id || null; 996 requestData.price = packageData.price || null; 997 requestData.amount = packageData.amount || null; 998 } 999 1000 // ÐÑпÑавлÑем звонок 1001 $.ajax({ 1002 url: mains_ajax_object.ajax_url, 1003 type: 'POST', 1004 data: requestData, 1005 success: function(callResponse) { 1006 console.log('ÐÑÐ²ÐµÑ Ð¾Ñ send_zvonok_call:', callResponse); 1007 if (callResponse.success && callResponse.data.call_id) { 1008 // УÑпеÑно оÑпÑавлено 1009 if (typeof successCallback === 'function') { 1010 successCallback(callResponse, nonceResponse.data.nonce); 1011 } 1012 } else { 1013 // ÐÑибка Ð¾Ñ ÑеÑвеÑа пÑи оÑпÑавке звонка 1014 const errorMsg = callResponse.data?.message || 'ÐÑоизоÑла оÑибка пÑи оÑпÑавке звонка.'; 1015 console.error('ÐÑибка Ð¾Ñ send_zvonok_call:', errorMsg); 1016 if (typeof errorCallback === 'function') { 1017 errorCallback(errorMsg); 1018 } 1019 } 1020 }, 1021 error: function(xhr, status, error) { 1022 console.error('AJAX оÑибка (send_zvonok_call):', status, error); 1023 if (typeof errorCallback === 'function') { 1024 errorCallback('ÐÑоизоÑла оÑибка ÑоединениÑ. ÐожалÑйÑÑа, попÑобÑйÑе позже.'); 1025 } 1026 } 1027 }); 1028 1029 } else { 1030 const errorMsg = nonceResponse.data?.message || 'ÐÑибка безопаÑноÑÑи пÑи оÑпÑавке звонка (не ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce).'; 1031 console.error('Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce Ð´Ð»Ñ Ð¾ÑпÑавки звонка:', errorMsg); 1032 if (typeof errorCallback === 'function') { 1033 errorCallback(errorMsg); 1034 } 1035 } 1036 }, 1037 error: function(xhr, status, error) { 1038 console.error('ÐÑибка полÑÑÐµÐ½Ð¸Ñ nonce Ð´Ð»Ñ Ð¾ÑпÑавки звонка:', xhr, status, error); 1039 if (typeof errorCallback === 'function') { 1040 errorCallback('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce Ð´Ð»Ñ Ð¾ÑпÑавки звонка).'); 1041 } 1042 } 1043 }); 1044} 1045 1046 1047// --- ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка опÑоÑа ÑÑаÑÑÑа ÑегиÑÑÑаÑии и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледÑÑÑÐ¸Ñ Ð´ÐµÐ¹ÑÑвий --- 1048// ÐÑа ÑÑнкÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ, когда новÑй полÑзоваÑÐµÐ»Ñ Ð¿Ð¾Ð´ÑвеÑÐ¶Ð´Ð°ÐµÑ Ð·Ð²Ð¾Ð½Ð¾Ðº Ð´Ð»Ñ ÑегиÑÑÑаÑии. 1049// ÐоÑле подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð½Ñжно либо наÑиÑлиÑÑ Ð¿ÑобнÑе кÑиÑÑаллÑ, либо пеÑейÑи Ð
1049º ÑоÑме оплаÑÑ. 1050// --- ÐÐÐÐÐÐÐÐЯ ФУÐÐЦÐЯ: startRegistrationPolling пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ $modal и isTrial --- 1051// phone: ÐоÑмализованнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона 1052// nonce: Nonce Ð´Ð»Ñ Ð¿ÑовеÑки ÑÑаÑÑÑа 1053// $modalOverride: jQuery обÑÐµÐºÑ Ð¼Ð¾Ð´Ð°Ð»Ñного окна (опÑионалÑно, еÑли не пеÑедан, иÑполÑзÑÐµÑ $('#paymentModal')) 1054// isTrialOverride: ÐÑлевое знаÑение, ÑказÑваÑÑее, ÑвлÑеÑÑÑ Ð»Ð¸ Ð¿Ð°ÐºÐµÑ Ð¿ÑобнÑми кÑиÑÑаллами (опÑионалÑно, еÑли не пеÑедан, пÑÑаеÑÑÑ Ð¾Ð¿ÑеделиÑÑ Ð¸Ð· $modal.data('isTrialAward')) 1055function startRegistrationPolling(phone, nonce, $modalOverride, isTrialOverride) { 1056 console.log(`startRegistrationPolling: ÐаÑало опÑоÑа ÑÑаÑÑÑа ÑегиÑÑÑаÑии Ð´Ð»Ñ ${phone}.`); 1057 console.log("startRegistrationPolling: DEBUG POINT 1: ÐоÑле наÑалÑного лога"); 1058 1059 // ÐÑполÑзÑем пеÑеданнÑй модал или деÑолÑнÑй 1060 const $modal = $modalOverride || $('#paymentModal'); 1061 console.log("startRegistrationPolling: DEBUG POINT 2: $modal найден?", $modal.length > 0); 1062 console.log("startRegistrationPolling: ÐÑполÑзÑем модалÑное окно:", $modal.selector); 1063 1064 // ÐÑполÑзÑем пеÑеданнÑй isTrial или пÑÑаемÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð· даннÑÑ Ð¼Ð¾Ð´Ð°Ð»Ñного окна (Ð´Ð»Ñ ÑовмеÑÑимоÑÑи) 1065 // ÐÐÐÐÐ: isTrialOverride должен бÑÑÑ Ð²ÑÑиÑлен до вÑзова startRegistrationPolling, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð³Ð¾Ð½ÐºÐ¸ Ñ showPaymentForm 1066 const isTrial = (isTrialOverride !== undefined) ? isTrialOverride : ($modal.data('isTrialAward') || false); 1067 console.log("startRegistrationPolling: DEBUG POINT 3: isTrial =", isTrial); 1068 console.log("startRegistrationPolling: ÐÑполÑзÑем isTrial (аÑгÑÐ¼ÐµÐ½Ñ Ð¸Ð»Ð¸ из модала):", isTrial); 1069 1070 // ÐолÑÑаем даннÑе пакеÑа из даннÑÑ Ð¼Ð¾Ð´Ð°Ð»Ñного окна (еÑли бÑли ÑÑÑановленÑ) или из глобалÑной пеÑеменной 1071 // ÐÑÑаемÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¸Ð· модалÑного окна, еÑли оно бÑло пеÑедано и ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñе 1072 const selectedPackageFromModal = $modalOverride ? $modalOverride.data('selectedPackage') : null; 1073 // ÐÑполÑзÑем глобалÑнÑÑ Ð¿ÐµÑеменнÑÑ ÐºÐ°Ðº ÑезеÑвнÑй ваÑÐ¸Ð°Ð½Ñ 1074 const selectedPackage = selectedPackageFromModal || window.currentPackageSelected || null; 1075 console.log("startRegistrationPolling: DEBUG POINT 4: selectedPackage =", selectedPackage); 1076 1077 // ÐбновлÑем UI модалÑного окна Ð´Ð»Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð¿ÑоÑа (на вÑÑкий ÑлÑÑай) 1078 console.log("startRegistrationPolling: DEBUG POINT 5: ÐаÑало Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ UI"); 1079 try { 1080 $modal.find('.modal-title').html(`<h2 class="modal-title">Ðвонок оÑпÑавлен</h2>`); 1081 $modal.find('.modal-description').text('Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон.'); 1082 // $modal.find('#userPhone').closest('.input-group').hide(); // УÐÐÐÐÐÐ 1083 // $modal.find('.checkbox-container').hide(); // УÐÐÐÐÐÐ 1084 // $('#sendPhoneBtn').hide(); // УÐÐÐÐÐÐ - иÑполÑзÑем пеÑеменнÑÑ $btn из вÑзÑваÑÑего кода 1085 // const $statusElement = $('#phonePollingStatus'); // УÐÐÐÐÐÐ 1086 const $statusElement = $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first(); // ÐСÐÐÐЬÐУÐÐ ÐÐÐ ÐÐÐÐÐЫР$MODAL 1087 if ($statusElement.length) { 1088 // $statusElement.show().text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba'); 1089 } 1090 console.log("startRegistrationPolling: DEBUG POINT 6: UI обновлен ÑÑпеÑно"); 1091 } catch (uiError) { 1092 console.error("startRegistrationPolling: ÐÑибка пÑи обновлении UI:", uiError); 1093 } 1094 1095 // --- Ðогика опÑоÑа --- 1096 console.log("startRegistrationPolling: DEBUG POINT 7: ÐниÑиализаÑÐ¸Ñ Ð¿ÐµÑеменнÑÑ Ð¾Ð¿ÑоÑа"); 1097 let pollInterval; 1098 let pollCount = 0; 1099 const maxPolls = 120; // Ðли возÑмиÑе из наÑÑÑоек 1100 const pollIntervalTime = 2000; // Ðли возÑмиÑе из наÑÑÑоек (5 ÑекÑнд) 1101 1102 console.log("startRegistrationPolling: DEBUG POINT 8: ÐпÑеделение ÑÑнкÑии internalCheckReg
1102istrationStatus"); 1103 function internalCheckRegistrationStatus() { 1104 console.log(`startRegistrationPolling: internalCheckRegistrationStatus: ÐÑзов ÑÑнкÑии опÑоÑа â${pollCount + 1}/${maxPolls}...`); 1105 1106 if (pollCount >= maxPolls) { 1107 console.log("startRegistrationPolling: internalCheckRegistrationStatus: ÐоÑÑигнÑÑ Ð»Ð¸Ð¼Ð¸Ñ Ð¿Ð¾Ð¿ÑÑок"); 1108 clearInterval(pollInterval); 1109 // const $statusElement = $('#phonePollingStatus'); // УÐÐÐÐÐÐ 1110 const $statusElement = $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first(); // ÐСÐÐÐЬÐУÐÐ ÐÐÐ ÐÐÐÐÐЫР$MODAL 1111 if ($statusElement.length) { 1112 $statusElement.text('ÐÑевÑÑено вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ ÑегиÑÑÑаÑии. ÐожалÑйÑÑа, попÑобÑйÑе еÑе Ñаз.').css('color', 'red'); 1113 } 1114 // ÐозвÑаÑаем ÑоÑÐ¼Ñ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние 1115 // setTimeout(() => { // УÐÐÐÐÐÐ - воÑÑÑановление UI лÑÑÑе в вÑзÑваÑÑем коде 1116 // $modal.find('.modal-title').html(`<h2 class="modal-title">УкажиÑе Ð½Ð¾Ð¼ÐµÑ ÑелеÑона</h2> 1117 // <p class="modal-description">Ðа ÑказаннÑй Ð½Ð¾Ð¼ÐµÑ Ð¼Ð¾Ð¼ÐµÐ½ÑалÑно поÑÑÑÐ¿Ð¸Ñ Ð·Ð²Ð¾Ð½Ð¾Ðº. Ð Ð¾Ð±Ð¾Ñ Ð¿Ð¾Ð¿ÑоÑÐ¸Ñ Ð½Ð°Ð¶Ð°ÑÑ ÑиÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´ÑвеÑдиÑÑ Ð²Ð°Ñ ÑелеÑон</p>`); 1118 // $modal.find('#userPhone').closest('.input-group').show(); 1119 // $modal.find('.checkbox-container').show(); 1120 // $('#sendPhoneBtn').show().prop('disabled', false).text('ÐолÑÑиÑÑ ÐºÐ¾Ð´ подÑвеÑждениÑ'); 1121 // $('#userPhone').val(''); 1122 // if($('#phonePollingStatus').length) $('#phonePollingStatus').hide().text('').removeAttr('style'); 1123 // }, 2000); 1124 return; 1125 } 1126 1127 pollCount++; 1128 console.log("startRegistrationPolling: internalCheckRegistrationStatus: pollCount ÑвелиÑен до", pollCount); 1129 1130 $.ajax({ 1131 url: mains_ajax_object.ajax_url, 1132 type: 'POST', 1133 data: { 1134 action: 'check_phone_registration_status', // ÐÑполÑзÑем ÑÐ¾Ñ Ð¶Ðµ ÑкÑн 1135 phone: phone, 1136 nonce: nonce 1137 }, 1138 success: function(statusResponse) { 1139 console.log('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑÐ²ÐµÑ Ð¾Ñ check_phone_registration_status:', statusResponse); 1140 try { 1141 // const $statusElement = $('#phonePollingStatus'); // УÐÐÐÐÐÐ 1142 const $statusElement = $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first(); // ÐСÐÐÐЬÐУÐÐ ÐÐÐ ÐÐÐÐÐЫР$MODAL 1143 1144 if (statusResponse.success && statusResponse.data && statusResponse.data.user_id) { 1145 // --- Ð ÐÐÐСТРÐЦÐЯ ÐÐÐТÐÐÐ ÐÐÐÐÐ --- 1146 console.log('startRegistrationPolling: internalCheckRegistrationStatus: РегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ÑвеÑждена! ÐÑполнÑем поÑледÑÑÑие дейÑÑвиÑ...'); 1147 clearInterval(pollInterval); 1148 ym(104015232,'reachGoal','rega'); 1149 1150 if (isTrial) { 1151 // --- ÐÐ»Ñ Ð¿ÑобнÑÑ ÐºÑиÑÑаллов: ÐаÑиÑлÑем кÑиÑÑÐ°Ð»Ð»Ñ --- 1152 console.log("startRegistrationPolling: internalCheckRegistrationStatus: ÐÑо пÑобнÑе кÑиÑÑаллÑ. ÐаÑиÑлÑем 25 кÑиÑÑаллов."); 1153 if ($statusElement.length) { 1154 $statusElement.text('РегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ÑвеÑждена! ÐаÑиÑление кÑиÑÑаллов...').css('color', 'green'); 1155 } 1156 1157 //console.log("startRegistrationPolling: internalCheckReg
1157istrationStatus: ÐодгоÑовка AJAX-запÑоÑа к award_trial_crystals."); 1158 //console.log("startRegistrationPolling: internalCheckRegistrationStatus: mains_ajax_object.award_trial_crystals_nonce пеÑед оÑпÑавкой:", mains_ajax_object.award_trial_crystals_nonce); 1159 1160// --- ÐСÐÐ ÐÐÐÐÐÐ: ÐÑполÑзÑем ÑекÑÐµÑ Ð¸Ð· mains_ajax_object --- 1161let secretPart = 'fallback_secret'; // ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð° ÑлÑÑай оÑибки 1162if (mains_ajax_object && mains_ajax_object.simple_secret) { 1163 secretPart = mains_ajax_object.simple_secret; 1164 console.log("startRegistrationPolling: internalCheckRegistrationStatus: ÐÑполÑзÑем 'ÑекÑеÑ' из mains_ajax_object:", secretPart); 1165} else { 1166 console.warn("startRegistrationPolling: internalCheckRegistrationStatus: 'simple_secret' не найден в mains_ajax_object. ÐÑполÑзÑеÑÑÑ Ð·Ð½Ð°Ñение по ÑмолÑаниÑ."); 1167} 1168// --- ÐÐÐÐЦ ÐСÐÐ ÐÐÐÐÐÐЯ --- 1169 1170// 2. ÐолÑÑаем timestamp 1171const currentTimestamp = Math.floor(Date.now() / 1000); // Ð ÑекÑÐ½Ð´Ð°Ñ 1172console.log("startRegistrationPolling: internalCheckRegistrationStatus: ТекÑÑий timestamp:", currentTimestamp); 1173 1174// 3. ÐолÑÑаем user_id (пÑедполагаеÑÑÑ, ÑÑо он еÑÑÑ Ð² statusResponse) 1175const userIdForToken = statusResponse.data.user_id || 0; 1176console.log("startRegistrationPolling: internalCheckRegistrationStatus: user_id Ð´Ð»Ñ Ñокена:", userIdForToken); 1177 1178// 4. ÐенеÑиÑÑем "Ñокен" по Ñой же логике, ÑÑо и в PHP 1179// data_to_hash = secret_part . 'award_trial_crystals' . user_id . timestamp 1180const dataToHash = secretPart + 'award_trial_crystals' + userIdForToken + currentTimestamp; 1181console.log("startRegistrationPolling: internalCheckRegistrationStatus: ÐаннÑе Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии Ñокена:", dataToHash); 1182 1183 1184// 5. ÐÑоÑÑÐ°Ñ "Ñ ÑÑ-ÑÑнкÑиÑ" (имиÑаÑÐ¸Ñ md5) 1185// ÐÑполÑзÑем вÑÑÑоеннÑÑ ÑÑнкÑÐ¸Ñ Web Crypto API Ð´Ð»Ñ SHA
1185-256 1186// ÐÑо ÑовÑеменнÑй и безопаÑнÑй ÑпоÑоб, не ÑÑебÑÑÑий внеÑÐ½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек. 1187 1188async function generateSimpleToken(data) { 1189 const msgUint8 = new TextEncoder().encode(data); 1190 const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8); 1191 const hashArray = Array.from(new Uint8Array(hashBuffer)); 1192 // ÐÑеобÑазÑем в ÑеÑÑнадÑаÑеÑиÑнÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ беÑем пеÑвÑе 12 Ñимволов (как в PHP) 1193 const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); 1194 return hashHex.substring(0, 12); 1195} 1196 1197// --- ÐÐÐÐЦ ÐÐÐÐÐ ÐЦÐÐ ÐÐÐЬÐÐÐÐТÐÐЬСÐÐÐРТÐÐÐÐÐ --- 1198 1199// --- ÐТÐÐ ÐÐÐÐ AJAX С ТÐÐÐÐÐÐ --- 1200generateSimpleToken(dataToHash).then(tokenToUse => { 1201 console.log("startRegistrationPolling: internalCheckRegistrationStatus: СгенеÑиÑованнÑй Ñокен:", tokenToUse); 1202 1203 // ÐÑзÑваем AJAX Ð´Ð»Ñ Ð½Ð°ÑиÑÐ»ÐµÐ½Ð¸Ñ ÐºÑиÑÑаллов 1204 $.ajax({ 1205 url: mains_ajax_object.ajax_url, 1206 type: 'POST', 1207 dataType: 'json', 1208 data: { 1209 action: 'award_trial_crystals', 1210 //nonce: mains_ajax_object.award_trial_crystals_nonce, 1211 token: tokenToUse, 1212 timestamp: currentTimestamp, 1213 // user_id: statusResponse.data.user_id 1214 user_id: userIdForToken 1215 }, 1216 success: function(crystalResponse) { 1217 console.log('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑиÑÑÐ°Ð»Ð»Ñ Ð½Ð°ÑиÑленÑ:', crystalResponse); 1218 if(crystalResponse.success) { 1219 if ($statusElement.length) { 1220 $statusElement.text('ÐÑиÑÑÐ°Ð»Ð»Ñ Ð½Ð°ÑиÑленÑ! ÐеÑезагÑÑзка...').css('color', 'green'); 1221 } 1222 // ÐбновлÑем Ð±Ð°Ð»Ð°Ð½Ñ Ð½Ð° ÑÑÑаниÑе пеÑед пеÑезагÑÑзкой 1223 if($('.balance .kol_kristall').length > 0 && crystalResponse.data.new_balance !== undefined) { 1224 $('.balance .kol_kristall').text(crystalResponse.data.new_balance); 1225 } 1226 // ÐеÑенапÑавлÑем на главнÑÑ 1227 /* setTimeout(function() { 1228 window.location.href = '/'; 1229 }, 1500);*/ 1230 1231 $modal.find('.modal-title').html(`<h2 class="modal-title">ÐвÑоÑизÑемÑÑ</h2>`); 1232 $modal.find('.modal-description').text('Ðжидаем авÑоÑизаÑиÑ...'); 1233 $modal.find('.close').hide(); 1234 $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first().hide().text('').removeAttr('style'); 1235 1236 // ÐбновлÑем ÑÑÑаниÑÑ 1237 setTimeout(function() { 1238 window.location.reload(); 1239 }, 3000); 1240 1241 } else { 1242 console.error('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑибка пÑи наÑиÑлении кÑиÑÑаллов поÑле ÑегиÑÑÑаÑии:', crystalResponse.data.message); 1243 if ($statusElement.length) { 1244 $statusElement.text(crystalResponse.data.message || 'ÐÑибка пÑи наÑиÑлении кÑиÑÑаллов поÑле ÑегиÑÑÑаÑии.').css('color', 'red'); 1245 } 1246 $modal.hide(); 1247 } 1248 }, 1249 error: function(xhr, status, error) { 1250 console.error('startRegistrationPolling: internalCheckReg
1250istrationStatus: AJAX оÑибка пÑи наÑиÑлении кÑиÑÑаллов поÑле ÑегиÑÑÑаÑии:', status, error); 1251 if ($statusElement.length) { 1252 $statusElement.text('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи наÑиÑлении кÑиÑÑаллов.').css('color', 'red'); 1253 } 1254 $modal.hide(); 1255 } 1256 }); 1257 }).catch(err => { 1258 console.error('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑибка генеÑаÑии Ñокена:', err); 1259 const $statusElement = $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first(); // ÐСÐÐÐЬÐУÐÐ ÐÐÐ ÐÐÐÐÐЫР$MODAL 1260 if ($statusElement.length) { 1261 $statusElement.text('ÐÑибка безопаÑноÑÑи (Ðе ÑдалоÑÑ ÑгенеÑиÑоваÑÑ Ñокен).').css('color', 'red'); 1262 } 1263 }); 1264 1265 } else { 1266 // --- ÐÐ»Ñ Ð¾Ð±ÑÑнÑÑ Ð¿Ð°ÐºÐµÑов: ÐеÑÐµÑ Ð¾Ð´ к оплаÑе --- 1267 console.log("startRegistrationPolling: internalCheckRegistrationStatus: ÐÑо обÑÑÐ½Ð°Ñ Ð¾Ð¿Ð»Ð°Ñа. ÐеÑÐµÑ Ð¾Ð´ к ÑоÑме оплаÑÑ."); 1268 if ($statusElement.length) { 1269 $statusElement.text('РегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ÑвеÑждена! ÐеÑÐµÑ Ð¾Ð´ к оплаÑе...').css('color', 'green'); 1270 } 1271 1272 // ÐакÑÑваем Ð¼Ð¾Ð´Ð°Ð»ÐºÑ 1273 $modal.hide(); 1274 1275 // ÐеÑÐµÑ Ð¾Ð´ к оплаÑе 1276 const finalUserId = statusResponse.data.user_id; 1277 const finalPackageId = statusResponse.data.package_id || selectedPackage?.id || ''; 1278 const finalPrice = statusResponse.data.price || selectedPackage?.price || 0; 1279 const finalAmount = statusResponse.data.amount || selectedPackage?.amount || 0; 1280 1281 if (typeof showPaymentForm !== 'undefined') { 1282 showPaymentForm( 1283 finalUserId, // 1-й аÑгÑменÑ: ID полÑзоваÑÐµÐ»Ñ (ÑиÑло) 1284 finalPrice, // 2-й аÑгÑменÑ: Цена (ÑиÑло) 1285 finalAmount, // 3-й аÑгÑменÑ: ÐолиÑеÑÑво (ÑиÑло) 1286 finalPackageId // 4-й аÑгÑменÑ: ID пакеÑа (ÑÑÑока или ÑиÑло) 1287 ); 1288 } else { 1289 console.error('startRegistrationPolling: internalCheckRegistrationStatus: ФÑнкÑÐ¸Ñ showPaymentForm не опÑеделена.'); 1290 alert('ÐÑибка: ÑоÑма оплаÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпна.'); 1291 } 1292 } 1293 } else if (statusResponse.success) { 1294 // success: true, но user_id Ð½ÐµÑ 1295 console.log('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑомежÑÑоÑнÑй ÑÑаÑÑÑ (success=true, no user_id):', statusResponse.data?.message || 'Ðжидание...'); 1296 if ($statusElement.length) { 1297 $statusElement.text(statusResponse.data?.message || 'Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', 'orange'); 1298 } 1299 } else if (statusResponse.data && statusResponse.data.message) { 1300 // success: false, но еÑÑÑ ÑообÑение об оÑибке 1301 console.warn('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑибка Ð¾Ñ ÑеÑвеÑа (success=false):', statusResponse.data.message); 1302 if ($statusElement.length) { 1303 $statusElement.text(statusResponse.data.message).css('color', 'red'); 1304 } 1305 } else { 1306 // ÐеожиданнÑй ÑоÑÐ¼Ð°Ñ Ð¾ÑвеÑа 1307 console.warn('startRegistrationPolling: internalCheckReg
1307istrationStatus: ÐеожиданнÑй ÑоÑÐ¼Ð°Ñ Ð¾ÑвеÑа:', statusResponse); 1308 if ($statusElement.length) { 1309 //$statusElement.text('ÐеожиданнÑй оÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа. ÐовÑоÑ...').css('color', 'orange'); 1310 } 1311 } 1312 } catch (processingError) { 1313 console.error('startRegistrationPolling: internalCheckRegistrationStatus: ÐÑибка обÑабоÑки оÑвеÑа опÑоÑа ÑегиÑÑÑаÑии:', processingError); 1314 } 1315 }, 1316 error: function(xhr, status, error) { 1317 console.error('startRegistrationPolling: internalCheckRegistrationStatus: AJAX оÑибка пÑи опÑоÑе ÑÑаÑÑÑа ÑегиÑÑÑаÑии:', status, error); 1318 // Ðе оÑÑанавливаем опÑÐ¾Ñ Ð¿Ñи оÑибке ÑоединениÑ, пÑодолжаем 1319 // const $statusElement = $('#phonePollingStatus'); // УÐÐÐÐÐÐ 1320 const $statusElement = $modal.find('#phonePollingStatus, #phonePollingStatusAuth').first(); // ÐСÐÐÐЬÐУÐÐ ÐÐÐ ÐÐÐÐÐЫР$MODAL 1321 if ($statusElement.length) { 1322 var originalText = $statusElement.text(); 1323 var originalColor = $statusElement.css('color'); 1324 $statusElement.text('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи опÑоÑе ÑÑаÑÑÑа. ÐовÑоÑ...').css('color', 'red'); 1325 setTimeout(() => { 1326 if($statusElement.length && $statusElement.text().includes('ÐÑибка ÑоединениÑ')) { 1327 $statusElement.text(originalText).css('color', originalColor); 1328 } 1329 }, 1500); 1330 } 1331 } 1332 }); 1333 } 1334 console.log("startRegistrationPolling: DEBUG POINT 9: ФÑнкÑÐ¸Ñ internalCheckRegistrationStatus опÑеделена"); 1335 1336 // ÐапÑÑк опÑоÑа 1337 console.log('startRegistrationPolling: DEBUG POINT 10: ÐапÑÑк опÑоÑа...'); 1338 pollInterval = setInterval(internalCheckRegistrationStatus, pollIntervalTime); 1339 // ÐеÑÐ²Ð°Ñ Ð¿ÑовеÑка ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ 1340 setTimeout(() => { 1341 console.log('startRegistrationPolling: DEBUG POINT 11: ÐапÑÑк пеÑвой пÑовеÑки ÑеÑез setTimeout'); 1342 internalCheckRegistrationStatus(); 1343 }, 1000); 1344 console.log('startRegistrationPolling: DEBUG POINT 12: setInterval и setTimeout ÑÑÑановленÑ'); 1345} 1346 1347// --- ÐÐ¾Ð½ÐµÑ ÑÑнкÑии startRegistrationPolling --- 1348 1349 1350// --- УнивеÑÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð¿ÑоÑа ÑÑаÑÑÑа авÑоÑизаÑии поÑле звонка --- 1351// ÐаÑамеÑÑÑ: 1352// - phone: ÐоÑмализованнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона (+7XXXXXXXXXX) 1353// - nonce: Nonce, полÑÑеннÑй Ñанее 1354// - options: ÐбÑÐµÐºÑ Ñ Ð½Ð°ÑÑÑойками 1355// - statusElementSelector: СелекÑÐ¾Ñ ÑлеменÑа Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑомежÑÑоÑнÑÑ ÑообÑений (напÑимеÑ, '#phonePollingStatus' или '#phonePollingStatusAuth') 1356// - modalContentSelector: СелекÑÐ¾Ñ ÐºÐ¾Ð½ÑейнеÑа модалÑного окна Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°/опиÑаниÑ/ÑкÑÑÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ (напÑимеÑ, '#paymentModal' или '.auth-container') 1357// - phoneInputSelector: СелекÑÐ¾Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑелеÑона Ð´Ð»Ñ ÑкÑÑÑиÑ/оÑиÑÑки (напÑимеÑ, '#userPhone' или '#userPhoneAuth') 1358// - buttonSelector: СелекÑÐ¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ Ð´Ð»Ñ ÑкÑÑÑиÑ/ÑазблокиÑовки (напÑимеÑ, '#sendPhoneBtn' или '#sendPhoneBtnAuth') 1359// - maxPolls: (ÐпÑионалÑно) ÐакÑималÑное колиÑеÑÑво попÑÑок (по ÑмолÑÐ°Ð½Ð¸Ñ 20) 1360// - pollIntervalTime: (ÐпÑионалÑно) ÐнÑеÑвал Ð¼ÐµÐ¶Ð´Ñ Ð¿Ð¾Ð¿ÑÑками в Ð¼Ñ (по ÑмолÑÐ°Ð½Ð¸Ñ 3000) 1361// - onMaxAttempts: (ÐпÑионалÑно) ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи пÑевÑÑении попÑÑок 1362// - onError: (ÐпÑионалÑно) ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи оÑибке AJAX 1363function pollPhoneAuthStatus(phone, nonce, options) { 1364 // ÐнаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ 1365 const defaults = { 1366 statusElementSelector: '#phonePollingStatus', 1367 modalContentSelector: '#paymentModal', 1368 phoneInputSelector: '#userPhone', 1369 buttonSelector: '#sendPhoneBtn', 1370 maxPolls: 120, // Ðожно ÑделаÑÑ 60, еÑли Ñ Ð¾ÑиÑе болÑÑе вÑемени, как в #sendPhoneBtnAuth 1371 pollIntervalTime: 2000, // Ðожно ÑделаÑÑ 5000, как в #sendPhoneBtnAuth 1372 onMaxAttempts: function () { 1373 console.log('УнивеÑÑалÑнÑй опÑоÑ: ÐÑевÑÑено макÑималÑное колиÑеÑÑво попÑÑок.'); 1374 }, 1375 onError: function (xhr, status, error) { 1376 console.error('УнивеÑÑалÑнÑй опÑоÑ: ÐÑибка AJAX:', status, error); 1377 } 1378 }; 1379 const settings = Object.assign({}, defaults, options); 1380 1381 let pollCount = 0; 1382 let pollInterval; 1383 const $statusElement = $(settings.statusElementSelector); 1384 const $modalContent = $(settings.modalContentSelector); 1385 const $phoneInput = $(settings.phoneInputSelector); 1386 const $btn = $(settings.buttonSelector); 1387 1388 console.log(`ÐапÑÑк ÑнивеÑÑалÑного опÑоÑа ÑÑаÑÑÑа авÑоÑизаÑии Ð´Ð»Ñ ${phone}...`); 1389 1390 function internalCheckStatus() { 1391 if (pollCount >= settings.maxPolls) { 1392 clearInterval(pollInterval); 1393 console.log(`УнивеÑÑалÑнÑй опÑоÑ: ÐÑевÑÑено макÑималÑное колиÑеÑÑво попÑÑок (${settings.maxPolls}).`); 1394 if ($statusElement.length) { 1395 $statusElement.text('ÐÑевÑÑено вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´ÑвеÑждениÑ. ÐожалÑйÑÑа, попÑобÑйÑе еÑе Ñаз.').css('color', 'red'); 1396 } 1397 // ÐÑзÑваем полÑзоваÑелÑÑкий колбÑк пÑи пÑевÑÑении попÑÑок 1398 settings.onMaxAttempts(); 1399 return; 1400 } 1401 1402 console.log(`УнивеÑÑалÑнÑй опÑоÑ: ÐопÑÑка ${pollCount + 1}/${settings.maxPolls}...`); 1403 pollCount++; 1404 1405 $.ajax({ 1406 url: mains_ajax_object.ajax_url, 1407 type: 'POST', 1408 data: { 1409 action: 'check_phone_registration_status', 1410 phone: phone, 1411 nonce: nonce 1412 }, 1413 success: function (statusResponse) { 1414 console.log('УнивеÑÑалÑнÑй опÑоÑ: ÐÑÐ²ÐµÑ Ð¾Ñ check_phone_registration_status:', statusResponse); 1415 try { 1416 // --- УÐÐÐÐРСÐÐЬÐÐЯ ÐÐ ÐÐÐÐ ÐРУСÐÐХР--- 1417 // УÑÐ¿ÐµÑ Ð¾Ð¿ÑеделÑеÑÑÑ Ð¿Ð¾ statusResponse.success === true РналиÑÐ¸Ñ user_id в data 1418 if (statusResponse.success && statusResponse.data && statusResponse.data.user_id
1418) { 1419 console.log('УнивеÑÑалÑнÑй опÑоÑ: ÐвÑоÑизаÑиÑ/ÑегиÑÑÑаÑÐ¸Ñ Ð¿Ð¾Ð´ÑвеÑждена! ÐодгоÑовка к пеÑезагÑÑзке...'); 1420 clearInterval(pollInterval); 1421 if ($statusElement.length) { 1422 $statusElement.text('ÐвÑоÑизаÑÐ¸Ñ Ð¿Ð¾Ð´ÑвеÑждена! ÐеÑезагÑÑзка...').css('color', 'green'); 1423 } 1424 // --- ÐÐÐÐÐÐ ÐÐÐСТÐÐÐ ÐРРУСÐÐХР--- 1425 // 1. УÑÑановка Ñлага в sessionStorage 1426 sessionStorage.setItem('phoneAuthJustCompleted', '1'); 1427 // 2. УÑÑановка ID полÑзоваÑÐµÐ»Ñ 1428 sessionStorage.setItem('phoneAuthUserId', statusResponse.data.user_id); 1429 // 3. ÐеÑезагÑÑзка ÑÑÑаниÑÑ 1430 1431 $modalContent.find('.modal-title').html(`<h2 class="modal-title">ÐвÑоÑизÑемÑÑ</h2>`); 1432 $modalContent.find('.modal-description').text('Ðжидаем авÑоÑизаÑиÑ...'); 1433 $modalContent.find('.close').hide(); 1434 $modalContent.find('#phonePollingStatus, #phonePollingStatusAuth').first().hide().text('').removeAttr('style'); 1435 1436 setTimeout(function () { 1437 window.location.reload(); 1438 }, 5000); 1439 // --- ÐÐÐÐЦ ÐÐÐÐÐÐÐ ÐÐÐСТÐÐЯ --- 1440 } else if (statusResponse.success) { 1441 // success: true, но user_id оÑÑÑÑÑÑвÑÐµÑ (напÑимеÑ, "Ðжидание подÑвеÑждениÑ...") 1442 // ÐÑо пÑомежÑÑоÑнÑй ÑÑаÑÑÑ, пÑодолжаем опÑÐ¾Ñ 1443 console.log('УнивеÑÑалÑнÑй опÑоÑ: ÐÑомежÑÑоÑнÑй ÑÑаÑÑÑ (success=true, no user_id):', statusResponse.data?.message || 'Ðжидание...'); 1444 if ($statusElement.length) { 1445 $statusElement.text(statusResponse.data?.message || 'Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', 'orange'); 1446 } 1447 } else if (statusResponse.data && statusResponse.data.message) { 1448 // success: false, но еÑÑÑ ÑообÑение об оÑибке (напÑимеÑ, "ÐолÑзоваÑÐµÐ»Ñ Ð½Ð°Ð¹Ð´ÐµÐ½, но не авÑоÑизован") 1449 console.warn('УнивеÑÑалÑнÑй опÑоÑ: ÐÑибка Ð¾Ñ ÑеÑвеÑа (success=false):', statusResponse.data.message); 1450 if ($statusElement.length) { 1451 $statusElement.text(statusResponse.data.message).css('color', 'red'); 1452 } 1453 } else { 1454 // ÐеожиданнÑй ÑоÑÐ¼Ð°Ñ Ð¾ÑвеÑа 1455 console.warn('УнивеÑÑалÑнÑй опÑоÑ: ÐеожиданнÑй ÑоÑÐ¼Ð°Ñ Ð¾ÑвеÑа:', statusResponse); 1456 if ($statusElement.length) { 1457 // $statusElement.text('ÐеожиданнÑй оÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа. ÐовÑоÑ...').css('color', 'orange'); 1458 } 1459 } 1460 // --- ÐÐÐÐЦ УÐÐÐÐРСÐÐЬÐÐÐ ÐÐ ÐÐÐÐ ÐРУСÐÐХР--- 1461 } catch (e) { 1462 console.error('УнивеÑÑалÑнÑй опÑоÑ: ÐÑибка обÑабоÑки оÑвеÑа:', e); 1463 } 1464 }, 1465 error: function (xhr, status, error) { 1466 console.error('УнивеÑÑалÑнÑй опÑоÑ: AJAX оÑибка пÑи опÑоÑе ÑÑаÑÑÑа:', status, error); 1467 // ÐÑзÑваем полÑзоваÑелÑÑкий колбÑк оÑибки 1468 settings.onError(xhr, status, error); 1469 // Ðе оÑÑанавливаем опÑоÑ, пÑодолжаем 1470 if ($statusElement.length) { 1471 var originalText = $statusElement.text(); 1472 var originalColor = $statusElement.css('color'); 1473 $statusElement.text('ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñи опÑоÑе ÑÑаÑÑÑа. ÐовÑоÑ...').css('color', 'red'); 1474 setTimeout(() => { 1475 if ($statusElement.length && $statusElement.text().includes('ÐÑибка ÑоединениÑ')) { 1476 $statusElement.text(originalText).css('color', originalColor); 1477 } 1478 }, 1500); 1479 } 1480 } 1481 }); 1482 } 1483 1484 // ÐаÑинаем опÑÐ¾Ñ 1485 if ($statusElement.length) { 1486 //$statusElement.text('Ðжидание подÑвеÑÐ¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð²Ð¾Ð½ÐºÐ°...').css('color', '#007cba').show(); 1487 } 1488 pollInterval = setInterval(internalCheckStatus, settings.pollIntervalTime); 1489 setTimeout(internalCheckStatus, 500); // ÐеÑÐ²Ð°Ñ Ð¿ÑовеÑка ÑÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ 1490 1491 // ÐозвÑаÑаем ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑÑановки опÑоÑа вÑÑÑнÑÑ, еÑли нÑжно 1492 return function stopPolling() { 1493 if (pollInterval) { 1494 clearInterval(pollInterval); 1495 console.log('УнивеÑÑалÑнÑй опÑоÑ: ÐÑÑановлен вÑÑÑнÑÑ.'); 1496 } 1497 }; 1498} 1499// --- ÐÐ¾Ð½ÐµÑ ÑнивеÑÑалÑной ÑÑнкÑии --- 1500 1501 1502// --- УнивеÑÑалÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð½Ð°ÑалÑной подгоÑовки (валидаÑиÑ, полÑÑение nonce) --- 1503// ÐаÑамеÑÑÑ: 1504// - phoneInputSelector: ÑелекÑÐ¾Ñ Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ÑелеÑона (напÑимеÑ, '#userPhone' или '#userPhoneAuth') 1505// - errorContainerSelector: ÑелекÑÐ¾Ñ ÐºÐ¾Ð½ÑейнеÑа Ð´Ð»Ñ Ð¾Ñибок (напÑимеÑ, '#phoneError' или '#ph
1505oneErrorAuth') 1506// - buttonSelector: ÑелекÑÐ¾Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ (напÑимеÑ, '#sendPhoneBtn' или '#sendPhoneBtnAuth') 1507// - modalContentSelector: ÑелекÑÐ¾Ñ ÐºÐ¾Ð½ÑейнеÑа модалÑного окна или его ÑаÑÑи Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ UI (напÑимеÑ, '#paymentModal' или '.auth-container') 1508// - onSuccessCallback: ÑÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи ÑÑпеÑной подгоÑовке (полÑÑении nonce). 1509// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ (formattedPhone, nonce, $modalContent) 1510// - onErrorCallback: ÑÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи лÑбой оÑибке (валидаÑиÑ, nonce). 1511// ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ (errorMessage) 1512function initiateZvonokCall(phoneInputSelector, errorContainerSelector, buttonSelector, modalContentSelector, onSuccessCallback, onErrorCallback) { 1513 const $phoneInput = $(phoneInputSelector); 1514 const $errorContainer = $(errorContainerSelector); 1515 const $btn = $(buttonSelector); 1516 const $modalContent = $(modalContentSelector); 1517 1518 if (!$phoneInput.length || !$btn.length) { 1519 console.error('initiateZvonokCall: Ðе Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð¾Ð±ÑзаÑелÑнÑе ÑлеменÑÑ DOM.'); 1520 if (typeof onErrorCallback === 'function') { 1521 onErrorCallback('ÐÑибка инÑеÑÑейÑа: ÑлеменÑÑ Ð½Ðµ найденÑ.'); 1522 } 1523 return; 1524 } 1525 1526 let phone = $phoneInput.val().trim(); 1527 const originalBtnText = $btn.text(); 1528 1529 // --- СкÑÑÑÑ Ð¿ÑедÑдÑÑие оÑибки --- 1530 if ($errorContainer.length) $errorContainer.hide(); 1531 1532 // --- ÐалидаÑÐ¸Ñ --- 1533 if (typeof validatePhone !== 'function' || !validatePhone(phone)) { 1534 const errorMsg = 'ÐожалÑйÑÑа, введиÑе полнÑй Ð½Ð¾Ð¼ÐµÑ ÑелеÑона.'; 1535 if ($errorContainer.length) { 1536 $errorContainer.text(errorMsg).show(); 1537 } else { 1538 alert(errorMsg); 1539 } 1540 if (typeof onErrorCallback === 'function') { 1541 onErrorCallback(errorMsg); 1542 } 1543 return; 1544 } 1545 1546 // --- ФоÑмаÑиÑование --- 1547 const formattedPhone = '+7' + phone.replace(/\D/g, '').substring(1); 1548 1549 // --- ÐлокиÑовка кнопки --- 1550 $btn.prop('disabled', true).text('ÐÑовеÑка...'); 1551 1552 console.log("ÐаÑинаем пÑоÑеÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñовки Ð´Ð»Ñ Ð·Ð²Ð¾Ð½ÐºÐ° Ð´Ð»Ñ ÑелеÑона:", formattedPhone); 1553 1554 // --- Шаг 1: ÐолÑÑиÑÑ nonce --- 1555 $.ajax({ 1556 url: mains_ajax_object.ajax_url, 1557 type: 'POST', 1558 data: { 1559 action: 'get_phone_registration_nonce' // ÐÑполÑзÑем ÑÑÑеÑÑвÑÑÑий action 1560 }, 1561 success: function(nonceResponse) { 1562 if (nonceResponse.success && nonceResponse.data.nonce) { 1563 console.log("Nonce Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑии полÑÑен."); 1564 // --- УСÐÐÐ¥: ÐеÑедаем ÑпÑавление колбÑÐºÑ --- 1565 // ÐРоÑпÑавлÑем звонок здеÑÑ! 1566 $btn.prop('disabled', false).text(originalBtnText); // РазблокиÑÑем кнопкÑ, Ñак как оÑÐ½Ð¾Ð²Ð½Ð°Ñ ÑабоÑа пеÑеÑла вÑзÑваÑÑей ÑÑоÑоне 1567 if (typeof onSuccessCallback === 'function') { 1568 onSuccessCallback(formattedPhone, nonceResponse.data.nonce, $modalContent); 1569 } 1570 } else { 1571 // --- ÐÑибка Ð¾Ñ ÑеÑвеÑа пÑи полÑÑении nonce --- 1572 const errorMsg = nonceResponse.data.message || 'ÐÑибка безопаÑноÑÑи пÑи пÑовеÑке полÑзоваÑелÑ.'; 1573 console.error('Ðе ÑдалоÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ nonce:', errorMsg); 1574 if ($errorContainer.length) { 1575 $errorContainer.text(errorMsg).show(); 1576 } else { 1577 alert(errorMsg); 1578 } 1579 $btn.prop('disabled', false).text(originalBtnText); 1580 if (typeof onErrorCallback === 'function') { 1581 onErrorCallback(errorMsg); 1582 } 1583 } 1584 }, 1585 error: function (nonceXhr, nonceStatus, nonceError) { 1586 // --- ÐÑибка AJAX пÑи полÑÑении nonce --- 1587 const errorMsg = 'ÐÑибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (полÑÑение nonce).'; 1588 console.error('ÐÑибка полÑÑÐµÐ½Ð¸Ñ nonce:', nonceXhr, nonceStatus, nonceError); 1589 if ($errorContainer.length) { 1590 $errorContainer.text(errorMsg).show(); 1591 } else { 1592 alert(errorMsg); 1593 } 1594 $btn.prop('disabled', false).text(originalBtnText); 1595 if (typeof onErrorCallback === 'function') { 1596 onErrorCallback(errorMsg); 1597 } 1598 } 1599 }); 1600} 1601 1602 1603 // ÐалидаÑÐ¸Ñ email (Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½Ð°Ð´Ð¾Ð±Ð¸ÑÑÑÑ Ð³Ð´Ðµ-Ñо еÑÑ) 1604 /* function validateEmail(email) { 1605 const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 1606 return re.test(email); 1607 } 1608*/ 1609 // Ðоказ оÑибки (Ð´Ð»Ñ email, еÑли иÑполÑзÑеÑÑÑ Ð³Ð´Ðµ-Ñо еÑÑ) 1610 function showError(message) { 1611 $('#emailError').text(message).show(); // ÐÑедполагаеÑÑÑ, ÑÑо ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ id="emailError" ÑÑÑеÑÑвÑÐµÑ 1612 } 1613 1614 1615 function sendPaymentRequest(email, nonce, $btn) { 1616 $.ajax({ 1617 url: mains_ajax_object.ajax_url, 1618 type: 'POST', 1619 data: { 1620 action: 'handle_payment_user', 1621 package_id: currentPackage.id, 1622 price: currentPackage.price, 1623 amount: currentPackage.amount, 1624 nonce: nonce // ÐÑполÑзÑем новÑй nonce 1625 }, 1626 success: function(response) { 1627 1628 console.log('ÐÑÐ²ÐµÑ ÑеÑвеÑа (оплаÑа):', response); 1629 if (response.success) { 1630 // ÐоказÑваем ÑоÑÐ¼Ñ Ð¾Ð¿Ð»Ð°ÑÑ Ñ Ð¿ÑавилÑнÑми паÑамеÑÑами 1631 showPaymentForm( 1632 response.data.user_id, 1633 response.data.price, 1634 response.data.amount, 1635 response.data.package_id 1636 ); 1637 } else { 1638 showError(response.data.message || 'ÐÑоизоÑла оÑибка'); 1639 } 1640 }, 1641 error: function(xhr, status, error) { 1642 console.log('ÐÑибка AJAX (оплаÑа):', xhr, status, error); 1643 showError('ÐÑоизоÑла оÑибка пÑи обÑабоÑке запÑоÑа'); 1644 }, 1645 complete: function() { 1646 // УбедиÑеÑÑ, ÑÑо кнопка ÑазблокиÑÑеÑÑÑ ÑолÑко поÑле оÑновного запÑоÑа 1647 // или обÑабоÑайÑе ÑÑо внÑÑÑи success/error вÑÑе 1648 if($btn) { // ÐÑовеÑка, еÑли $btn пеÑедан 1649 $btn.prop('disabled', false).text('ÐплаÑиÑÑ'); 1650 } 1651 } 1652 }); 1653} 1654 1655 1656// --- ÐÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ showPaymentForm Ñ Ð»Ð¾Ð³Ð¸Ñованием --- 1657function showPaymentForm(userId, price, amount, packId) { 1658 console.log('showPaymentForm called with args:', {userId, price, amount}); 1659 1660 var displayAmount, displayPrice; 1661 1662 if (price !== undefined && amount !== undefined && price > 0 && amount > 0) { 1663 displayAmount = amount; 1664 displayPrice = price; 1665 console.log("ÐÑполÑзÑем пеÑеданнÑе price и amount:", {displayPrice, displayAmount}); 1666 } else if (typeof currentPackage !== 'undefined' && currentPackage && currentPackage.price > 0 && currentPackage.amount > 0) { 1667 displayAmount = currentPackage.amount; 1668 displayPrice = currentPackage.price; 1669 console.log("ÐÑполÑзÑем даннÑе из currentPackage:", {displayPrice, displayAmount}); 1670 } else { 1671 displayAmount = 0; 1672 displayPrice = 0; 1673 console.warn("Ðе ÑдалоÑÑ Ð¾Ð¿ÑеделиÑÑ price и amount. ÐÑполÑзÑÑÑÑÑ Ð´ÐµÑолÑнÑе знаÑÐµÐ½Ð¸Ñ 0."); 1674 } 1675 1676 $('#paymentModal').hide(); 1677 1678 console.log('Display values to be used:', {displayAmount, displayPrice}); 1679 1680 var widget = new cp.CloudPayments(); 1681 1682 var receipt = { 1683 "Items": [ 1684 { 1685 label: 'ÐплаÑа за ' + displayAmount + ' алмазов', 1686 price: parseFloat(displayPrice), 1687 quantity: 1.00, 1688 amount: parseFloat(displayPrice), 1689 vat: 0, // 0 - без ÐÐС 1690 method: 0, // необÑзаÑелÑно 1691 object: 0, // необÑзаÑелÑно 1692 } 1693 ], 1694 calculationPlace: "sozd.ai", 1695 taxationSystem: 1, 1696 isBso: false, 1697 amounts: { 1698 electronic: parseFloat(displayPrice), 1699 advancePayment: 0.00, 1700 credit: 0.00, 1701 provision: 0.00 1702 } 1703 }; 1704 1705 widget.pay("charge", { 1706 publicId: mains_ajax_object.cloudpayments_public_id, 1707 description: 'ÐплаÑа за ' + displayAmount + ' алмазов', 1708 amount: displayPrice, 1709 currency: 'RUB', 1710 accountId: userId, 1711 data: { 1712 CloudPayments: { 1713 CustomerReceipt: receipt, 1714 }, 1715 userId: userId, 1716 amount: displayAmount, 1717 packageId: packId 1718 }, 1719 }).then(function(result) { 1720 // logToServer('Payment Result Object: ' + JSON.stringify(result), 'detailed', userId); // ÐогиÑÑем деÑали 1721 1722 if (result.type === 'cancel') { 1723 //logToServer('Payment Cancelled.', 'cancel', userId); // ÐеÑедаем Ñип 'cancel' 1724 console.log('ÐолÑзоваÑÐµÐ»Ñ Ð·Ð°ÐºÑÑл окно оплаÑÑ Ð±ÐµÐ· пÑÐ¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ñежа'); 1725 return; 1726 } else if (result.type === 'payment' || result.type === 'installment') { 1727 if (result.status === 'success') { 1728 //logToServer('Payment Success! Transaction ID: ' + result.data?.transactionId, 'payment',userId); // ÐеÑедаем Ñип 'payment' 1729 //ym(104015232,'reachGoal','oplata'); 1730 console.log('ÐплаÑа пÑоÑла ÑÑпеÑно'); 1731 console.log('Transaction ID:', result.data?.transactionId); 1732 1733 setTimeout(function() { 1734 window.location.href = '/?payment_success=1&user_id=' + userId + '&t=' + Date.now(); 1735 }, 2000); 1736 } else if (result.status === 'fail') { 1737 //logToServer('Payment Failed! Message: ' + result.message + ', Transaction ID: ' + result.data?.transactionId, 'fail',userId); // ÐеÑедаем Ñип 'fail' 1738 console.error('ÐплаÑа не пÑоÑла:', result.message); 1739 console.log('Transaction ID:', result.data?.transactionId); 1740 alert('ÐплаÑа не пÑоÑла. ' + (result.message || 'ÐожалÑйÑÑа, попÑобÑйÑе еÑе Ñаз или ÑвÑжиÑеÑÑ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой.')); 1741 } 1742 } else if (result.type === 'error') { 1743 // logToServer('Payment Error! Message: ' + result.message + ', Transaction ID: ' + result.data?.transactionId, 'error',userId); // ÐеÑедаем Ñип 'error' 1744 console.error('ÐÑибка оплаÑÑ CloudPayments:', result.message); 1745 console.log('Transaction ID:', result.data?.transactionId); 1746 alert('ÐÑибка пÑи пÑоведении оплаÑÑ. ' + (result.message || 'ÐожалÑйÑÑа, попÑобÑйÑе еÑе Ñаз или ÑвÑжиÑеÑÑ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой.')); 1747 } else { 1748 // logToServer('Payment Unhandled Result Type: ' + result.type + ', Full Result: ' + JSON.stringify(result), 'unhandled',userId); // ÐеÑедаем Ñип 'unhandled' 1749 // ym(104015232,'reachGoal','oplata'); 1750 console.warn('ÐеобÑабоÑаннÑй Ñип ÑезÑлÑÑаÑа оплаÑÑ:', result); 1751 setTimeout(function() { 1752 window.location.href = '/?payment_success=1&user_id=' + userId + '&t=' + Date.now(); 1753 }, 2000); 1754 } 1755 }).catch(function(reason) { 1756 //logToServer('Payment Promise Rejected! Reason: ' + reason, 'promise_error',userId); // ÐеÑедаем Ñип 'promise_error' 1757 console.error('ÐÑибка оплаÑÑ CloudPayments (Promise):', reason); 1758 alert('ÐÑибка пÑи пÑоведении оплаÑÑ. ÐожалÑйÑÑа, попÑобÑйÑе еÑе Ñаз или ÑвÑжиÑеÑÑ Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой.'); 1759 }); 1760} 1761 1762/** 1763 * ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑпÑавки ÑообÑÐµÐ½Ð¸Ñ Ð² лог на ÑеÑвеÑе 1764 * @param {string} message - СообÑение Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ 1765 * @param {string} log_type - Тип лога ('payment', 'cancel', 'fail', 'error', 'unhandled', 'promise_error', 'detailed') 1766 */ 1767function logToServer(message, log_type, userids) { 1768 jQuery.ajax({ 1769 url: mains_ajax_object.ajax_url, 1770 type: 'POST', 1771 data: { 1772 action: 'log_payment_debug', 1773 security: mains_ajax_object.nonce, // УбедиÑеÑÑ, ÑÑо nonce иÑполÑзÑеÑÑÑ Ð¸ пÑовеÑÑеÑÑÑ Ð² PHP 1774 log_message: message, 1775 log_type: log_type, // ÐеÑедаем Ñип лога 1776 timestamp: new Date().toISOString(), 1777 user_id: userids 1778 //user_id: mains_ajax_object.current_user_id // ÐÑли нÑжно логиÑоваÑÑ ID полÑзоваÑÐµÐ»Ñ 1779 }, 1780 success: function(response) { 1781 // console.log('Log sent to server:', response); 1782 }, 1783 error: function(xhr, status, error) { 1784 console.error('Failed to send log to server:', error); 1785 console.log('Local log fallback:', message); 1786 } 1787 }); 1788} 1789// --- ÐÐÐÐЦ Ðбновленной ÑÑнкÑии showPaymentForm Ñ Ð»Ð¾Ð³Ð¸Ñованием --- 1790// --- ÐÐÐÐЦ Ðбновленной ÑÑнкÑии showPaymentForm --- 1791 1792// yandex auth 1793 1794 $('.yandex-login-btn').on('click', function(e) { 1795 e.preventDefault(); 1796 window.location.href = ajax_object.ajax_url + '?action=yandex_auth'; 1797 }); 1798 1799// vk auth 1800$('.vk-login-btn').on('click', function(e) { 1801 $('.vk-login-btn').on('click', function(e) { 1802 e.preventDefault(); 1803 1804 // ÐÑпÑавлÑем AJAX-запÑÐ¾Ñ Ð½Ð° ÑеÑÐ²ÐµÑ WordPress Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ URL авÑоÑизаÑии 1805 $.ajax({
1806 url: ajax_object.ajax_url, // ÐлобалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ, ÑодеÑжаÑÐ°Ñ URL wp-admin/admin-ajax.php 1807 type: 'POST', 1808 dataType: 'json', 1809 data: { 1810 action: 'vk_auth_start' // Ðазвание ÑкÑена, ÑооÑвеÑÑÑвÑÐµÑ add_action('wp_ajax_...') 1811 }, 1812 success: function(response) { 1813 if (response.success && response.data.auth_url) { 1814 // ÐеÑенапÑавлÑем полÑзоваÑÐµÐ»Ñ Ð½Ð° ÑÑÑаниÑÑ Ð°Ð²ÑоÑизаÑии ÐÐ 1815 window.location.href = response.data.auth_url; 1816 } else { 1817 console.error('ÐÑибка полÑÑÐµÐ½Ð¸Ñ URL авÑоÑизаÑии:', response); 1818 alert('ÐÑоизоÑла оÑибка пÑи попÑÑке Ð²Ñ Ð¾Ð´Ð° ÑеÑез VK.'); 1819 } 1820 }, 1821 error: function(xhr, status, error) { 1822 console.error('AJAX Error:', status, error); 1823 alert('ÐÑоизоÑла оÑибка пÑи попÑÑке Ð²Ñ Ð¾Ð´Ð° ÑеÑез VK.'); 1824 } 1825 }); 1826 }); 1827 1828 // ÐÑовеÑÑем, еÑÑÑ Ð»Ð¸ Ñ ÑÑ Ð² URL (поÑле возвÑаÑа из ÐÐ) 1829 const hashParams = new URLSearchParams(window.location.hash.substring(1)); // УбиÑаем '#' и паÑÑим 1830 if (hashParams.has('access_token')) { 1831 // ÐолÑÑаем Ñокен, ÑÑок дейÑÑвиÑ, user_id, email из Ñ ÑÑа 1832 const accessToken = hashParams.get('access_token'); 1833 const expiresIn = hashParams.get('expires_in'); 1834 const userId = hashParams.get('user_id'); 1835 const email = hashParams.get('email'); // ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ null, еÑли полÑзоваÑÐµÐ»Ñ ÑкÑÑл его или не пÑедоÑÑавил доÑÑÑп 1836 const state = hashParams.get('state'); 1837 1838 if (accessToken && userId && state) { 1839 // ÐÑовеÑÑем nonce, еÑли иÑполÑзовали 1840 if (!wp_verify_nonce(state, 'vk_auth_nonce')) { 1841 console.error('ÐевеÑнÑй nonce.'); 1842 return; // ÐÑеÑÑваем вÑполнение 1843 } 1844 1845 // ÐÑпÑавлÑем полÑÑеннÑе даннÑе на ÑеÑÐ²ÐµÑ WordPress Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð°Ð²ÑоÑизаÑии 1846 $.ajax({ 1847 url: ajax_object.ajax_url, // ÐлобалÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ 1848 type: 'POST', 1849 dataType: 'json', 1850 data: { 1851 action: 'vk_complete_auth', 1852 access_token: accessToken, 1853 user_id: userId, 1854 email: email // ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ null 1855 }, 1856 success: function(response) { 1857 if (response.success) { 1858 // ÐвÑоÑизаÑÐ¸Ñ ÑÑпеÑна, пеÑезагÑÑжаем ÑÑÑаниÑÑ Ð¸Ð»Ð¸ делаем дÑÑгие дейÑÑÐ²Ð¸Ñ 1859 window.location.reload(); 1860 } else { 1861 console.error('ÐÑибка завеÑÑÐµÐ½Ð¸Ñ Ð°Ð²ÑоÑизаÑии:', response.data.message || response); 1862 alert(response.data.message || 'ÐÑоизоÑла оÑибка пÑи завеÑÑении Ð²Ñ Ð¾Ð´Ð° ÑеÑез VK.'); 1863 } 1864 }, 1865 error: function(xhr, status, error) { 1866 console.error('AJAX Error пÑи завеÑÑении:', status, error); 1867 alert('ÐÑоизоÑла оÑибка пÑи завеÑÑении Ð²Ñ Ð¾Ð´Ð° ÑеÑез VK.'); 1868 } 1869 }); 1870 } 1871 } 1872 }); 1873 1874// ÐÑи оÑпÑавке ÑоÑÐ¼Ñ 1875 $('.wpcf7').on('wpcf7invalid', function() { 1876 $(this).find('.wpcf7-not-valid').each(function() { 1877 var errorMessage = $(this).siblings('.wpcf7-not-valid-tip').text(); 1878 var originalPlaceholder = $(this).data('original-placeholder') || $(this).attr('placeholder'); 1879 1880 // Ð¡Ð¾Ñ ÑанÑем оÑигиналÑнÑй placeholder 1881 if (!$(this).data('original-placeholder')) { 1882 $(this).data('original-placeholder', originalPlaceholder); 1883 } 1884 1885 // УÑÑанавливаем оÑÐ¸Ð±ÐºÑ ÐºÐ°Ðº placeholder 1886 $(this).attr('placeholder', errorMessage); 1887 }); 1888 }); 1889 1890 // ÐÑи ÑокÑÑе воÑÑÑанавливаем оÑигиналÑнÑй placeholder 1891 $(document).on('focus', '.wpcf7-not-valid', function() { 1892 var originalPlaceholder = $(this).data('original-placeholder') || ''; 1893 $(this).attr('placeholder', originalPlaceholder); 1894 }); 1895 1896 // ÐÑи blur пÑовеÑÑем пÑÑÑое знаÑение 1897 $(document).on('blur', '.wpcf7-not-valid', function() { 1898 if ($(this).val() === '') { 1899 var errorMessage = $(this).siblings('.wpcf7-not-valid-tip').text(); 1900 $(this).attr('placeholder', errorMessage); 1901 } 1902 }); 1903 1904 1905 1906});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.