// Скрипт для Firebase Phone Auth на Tilda
// Вставте цей код в блок T123 (HTML/JS)
(function() {
// Функція для додавання скрипту та очікування його завантаження
function loadScript(url) {
return new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = url;
script.onload = resolve;
script.onerror = reject;
document.head.appendChild(script);
});
}
// Функція для перевірки, чи DOM завантажено
function domReady() {
return new Promise((resolve) => {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', resolve);
} else {
resolve();
}
});
}
// Головна функція
async function main() {
try {
// Завантажуємо Firebase скрипти послідовно
await loadScript('https://www.gstatic.com/firebasejs/9.22.2/firebase-app-compat.js');
console.log('✅ Firebase App SDK завантажено');
await loadScript('https://www.gstatic.com/firebasejs/9.22.2/firebase-auth-compat.js');
console.log('✅ Firebase Auth SDK завантажено');
// Чекаємо завантаження DOM
await domReady();
console.log('✅ DOM завантажено');
// Перевіряємо, чи Firebase доступний
if (typeof firebase === 'undefined') {
throw new Error('Firebase не завантажено');
}
// Ініціалізуємо Firebase
firebase.initializeApp({
apiKey: "AIzaSyANRlt_Q8U-dZewVZ2WCL5DgHo0mMByD3o",
authDomain: "otplanding-1e545.firebaseapp.com",
projectId: "otplanding-1e545",
storageBucket: "otplanding-1e545.firebasestorage.app",
messagingSenderId: "115078213638",
appId: "1:115078213638:web:d9f9274db66656e96a5387",
measurementId: "G-KZHZ6L5YPC"
});
console.log('✅ Firebase ініціалізовано');
// Знаходимо форму
const form = document.querySelector('form.t-form');
if (!form) {
throw new Error('Форму не знайдено');
}
console.log('✅ Форма знайдена');
// Знаходимо поле телефону
const phoneInput = document.getElementById('ph-1696334278713');
if (!phoneInput) {
throw new Error('Поле телефону не знайдено');
}
console.log('✅ Поле телефону знайдено');
// Створюємо кнопку "Отримати код"
const sendCodeButton = document.createElement('button');
sendCodeButton.innerText = 'Отримати код';
sendCodeButton.type = 'button';
sendCodeButton.style.cssText = 'margin-top:10px; padding:8px 12px; background:#007bff; color:#fff; border:none; cursor:pointer; border-radius:4px;';
phoneInput.parentNode.insertBefore(sendCodeButton, phoneInput.nextSibling);
console.log('✅ Кнопка "Отримати код" створена');
// Створюємо контейнер для поля вводу коду
const codeWrapper = document.createElement('div');
codeWrapper.style.display = 'none';
codeWrapper.innerHTML = `
Код з SMS: Підтвердити код
`;
sendCodeButton.parentNode.insertBefore(codeWrapper, sendCodeButton.nextSibling);
console.log('✅ Блок вводу коду створено');
// Створюємо контейнер для reCAPTCHA
const recaptchaContainer = document.createElement('div');
recaptchaContainer.id = 'recaptcha-container-' + Date.now();
recaptchaContainer.style.display = 'none';
document.body.appendChild(recaptchaContainer);
console.log('✅ Контейнер reCAPTCHA створено');
// Змінні для зберігання стану
let confirmationResult = null;
let smsSent = false;
// Обробник кнопки "Отримати код"
sendCodeButton.addEventListener('click', async function() {
try {
// Отримуємо номер телефону через prompt
const phoneNumber = prompt('Введіть номер телефону (наприклад, 0991234567):');
if (!phoneNumber) {
alert('Ви не ввели номер телефону');
return;
}
// Обробляємо номер телефону
const digitsOnly = phoneNumber.replace(/\D/g, '');
if (digitsOnly.length < 9) {
alert('Введіть коректний номер телефону (мінімум 9 цифр)');
return;
}
// Форматуємо номер з кодом країни
let formattedNumber;
if (digitsOnly.startsWith('380')) {
formattedNumber = '+' + digitsOnly;
} else if (digitsOnly.startsWith('0')) {
formattedNumber = '+38' + digitsOnly;
} else {
formattedNumber = '+380' + digitsOnly;
}
console.log('???? Номер телефону для відправки:', formattedNumber);
if (smsSent) {
alert('Код уже надіслано. Введіть його нижче.');
return;
}
// Створюємо новий контейнер для reCAPTCHA
document.body.removeChild(recaptchaContainer);
const newRecaptchaContainerId = 'recaptcha-container-' + Date.now();
const newRecaptchaContainer = document.createElement('div');
newRecaptchaContainer.id = newRecaptchaContainerId;
newRecaptchaContainer.style.display = 'none';
document.body.appendChild(newRecaptchaContainer);
// Створюємо reCAPTCHA верифікатор
const recaptchaVerifier = new firebase.auth.RecaptchaVerifier(newRecaptchaContainerId, {
size: 'invisible',
callback: function() {
console.log('✅ reCAPTCHA підтверджено');
}
});
// Надсилаємо SMS
confirmationResult = await firebase.auth().signInWithPhoneNumber(formattedNumber, recaptchaVerifier);
smsSent = true;
codeWrapper.style.display = 'block';
alert('✅ Код надіслано. Введіть його нижче.');
} catch (error) {
console.error('❌ Помилка:', error);
alert('❌ Помилка: ' + error.message);
}
});
// Обробник кнопки "Підтвердити код"
document.getElementById('verifyCodeBtn').addEventListener('click', async function() {
try {
const code = document.getElementById('verificationCode').value.trim();
if (!code) {
alert('⚠️ Введіть код з SMS');
return;
}
if (!confirmationResult) {
alert('⚠️ Спочатку отримайте код');
return;
}
const result = await confirmationResult.confirm(code);
alert('✅ Код підтверджено! Форма буде надіслана.');
// Додаємо номер у приховане поле форми
let phoneHiddenInput = document.createElement('input');
phoneHiddenInput.type = 'hidden';
phoneHiddenInput.name = 'phoneVerified';
phoneHiddenInput.value = 'true';
form.appendChild(phoneHiddenInput);
// Відправляємо форму
form.submit();
} catch (error) {
console.error('❌ Помилка підтвердження коду:', error);
alert('❌ Невірний код: ' + error.message);
}
});
// Блокуємо відправку форми без підтвердження
form.addEventListener('submit', function(e) {
if (!smsSent || !confirmationResult) {
e.preventDefault();
alert('⚠️ Спочатку підтвердіть номер телефону');
}
});
} catch (error) {
console.error('❌ Критична помилка:', error);
alert('❌ Критична помилка: ' + error.message);
}
}
// Запускаємо головну функцію
main();
})();