const skazkiData = { "skazki": [ { "title": "Волшебный мир принцесс", "photoUrl": "img/card-ph-1.png", "description": "Описание сказки 1" }, { "title": "Космическое путешествие", "photoUrl": "url_to_photo2.jpg", "description": "Описание сказки 2" }, { "title": "Мир видеоигр", "photoUrl": "url_to_photo3.jpg", "description": "Описание сказки 3" }, { "title": "Вселенная супергероев", "photoUrl": "url_to_photo4.jpg", "description": "Описание сказки 4" }, { "title": "Академия магии", "photoUrl": "url_to_photo5.jpg", "description": "Описание сказки 5" }, { "title": "Средневековые легенды", "photoUrl": "url_to_photo6.jpg", "description": "Описание сказки 6" }, { "title": "Чудесный мир аниме", "photoUrl": "url_to_photo7.jpg", "description": "Описание сказки 7" }, { "title": "Русские сказки", "photoUrl": "url_to_photo8.jpg", "description": "Описание сказки 8" }, { "title": "Реализм", "photoUrl": "url_to_photo9.jpg", "description": "Описание сказки 9" } ] }; const kidPhotoInput = document.getElementById("kidPhoto"); const kidPhotoPreview = document.getElementById("kidPhotoContainer"); // Элемент для показа фото kidPhotoInput.addEventListener("change", function () { const file = kidPhotoInput.files[0]; if (!file) return; // Если файл не выбран - ничего не делаем if (!file.type.startsWith("image/")) { alert("Файл должен быть изображением"); kidPhotoInput.value = ""; // Очищаем input return; } else if (file.size > 8 * 1024 * 1024) { alert("Файл не должен превышать 8MB"); kidPhotoInput.value = ""; // Очищаем input return; } const reader = new FileReader(); reader.onload = function (e) { kidPhotoPreview.src = e.target.result; // Устанавливаем превью // Закрываем модальное окно Bootstrap const modal = bootstrap.Modal.getInstance(document.getElementById("modalPhoto")); if (modal) modal.hide(); // Добавляем класс up-done к элементу с классом upload-success document.querySelector(".upload-success")?.classList.add("up-done"); }; reader.readAsDataURL(file); }); function updatePopup(index) { const skazka = skazkiData.skazki[index]; if (!skazka) return; setTimeout(() => { document.querySelector('.skazka_title').textContent = skazka.title; document.querySelector('.skazka_description').textContent = skazka.description; document.querySelector('.skazka_photo').src = skazka.photoUrl; }, 100); } document.querySelectorAll('[class^="popup-open"]').forEach((button, index) => { button.addEventListener('click', () => updatePopup(index)); }); document.addEventListener('DOMContentLoaded', () => { const createButton = document.querySelector('.create-btn'); const progressContainer = document.querySelector('.progress-container'); const progressBar = document.querySelector('.progress-bar'); const modalOrder = new bootstrap.Modal(document.getElementById('modalOrder')); createButton.addEventListener('click', () => { // Сбрасываем анимацию прогресс-бара progressBar.style.transition = 'none'; progressBar.style.width = '0%'; // Делаем контейнер видимым progressContainer.style.opacity = 1; progressContainer.scrollIntoView({ behavior: 'smooth', block: 'center' }); // Запускаем анимацию заново с небольшой задержкой setTimeout(() => { progressBar.style.transition = 'width 5s linear'; progressBar.style.width = '100%'; }, 50); // Показываем модальное окно после завершения анимации setTimeout(() => { modalOrder.show(); }, 5000); }); }); const phoneInput = document.querySelector("#phoneAuth"); const errorDiv = document.querySelector("#phoneError"); // Автоподстановка +7 при фокусе phoneInput.addEventListener("focus", () => { if (!phoneInput.value) { phoneInput.value = "+7"; } }); // Блокируем ввод нецифровых символов и ограничиваем длину phoneInput.addEventListener("input", () => { phoneInput.value = phoneInput.value.replace(/[^\d+]/g, ''); // Оставляем только цифры и + if (!phoneInput.value.startsWith("+7")) { phoneInput.value = "+7"; // Если пользователь удалил, вернуть +7 } }); // Валидация номера: строго +7 и 10 цифр после function validatePhoneNumber() { const number = phoneInput.value; if (/^\+7\d{10}$/.test(number)) { errorDiv.style.display = "none"; return true; } else { errorDiv.style.display = "block"; errorDiv.textContent = "Введите номер в формате +7XXXXXXXXXX"; return false; } } // Валидация на событиях phoneInput.addEventListener("blur", validatePhoneNumber); phoneInput.addEventListener("input", validatePhoneNumber); document.addEventListener('DOMContentLoaded', () => { const buttons = document.querySelectorAll('.button-par'); buttons.forEach(button => { button.addEventListener('click', () => { buttons.forEach(b => b.classList.remove('active-btn')); button.classList.add('active-btn'); }); }); }); document.addEventListener("DOMContentLoaded", () => { const hairSelect = document.getElementById("hair-select"); const eyeSelect = document.getElementById("eye-select"); const pickHair = document.getElementById("pick-hair"); const pickEye = document.getElementById("pick-eye"); const hairSelectedImg = document.getElementById("hair-selected-img"); const eyeSelectedImg = document.getElementById("eye-selected-img"); const sendButton = document.getElementById("sendTo"); const polMan = document.getElementById("polMan"); const polWoman = document.getElementById("polWoman"); let selectedStoryId = null; let selectedHairId = null; let selectedEyeId = null; let gender = ""; let selectedOption = null; // Функция скрытия/показа блоков выбора const toggleVisibility = (toShow, toHide) => { toShow.classList.toggle("d-none"); toHide.classList.add("d-none"); }; hairSelect.addEventListener("click", () => toggleVisibility(pickHair, pickEye)); eyeSelect.addEventListener("click", () => toggleVisibility(pickEye, pickHair)); // Выбор цвета волос document.querySelectorAll(".pick-hair-option").forEach((img) => { img.addEventListener("click", (e) => { const src = e.target.dataset.src; const id = e.target.id; hairSelectedImg.src = src; selectedHairId = id; pickHair.classList.add("d-none"); console.log("Выбранный цвет волос:", selectedHairId); }); }); // Выбор цвета глаз document.querySelectorAll(".pick-eye-option").forEach((img) => { img.addEventListener("click", (e) => { const src = e.target.dataset.src; const id = e.target.id; eyeSelectedImg.src = src; selectedEyeId = id; pickEye.classList.add("d-none"); console.log("Выбранный цвет глаз:", selectedEyeId); }); }); //Выбор стори стайл const cards = document.querySelectorAll('.card-par'); cards.forEach(card => { card.addEventListener('click', (event) => { cards.forEach(c => c.classList.remove('active-par')); card.classList.add('active-par'); selectedStoryId = event.currentTarget.id; console.log(selectedStoryId); }); }); // Функция обновления пола const updateGender = () => { updateImages(); // Меняем картинки при выборе пола if (polMan.classList.contains("active-btn")) { gender = "Мальчик"; } else if (polWoman.classList.contains("active-btn")) { gender = "Девочка"; } else { gender = ""; } }; polMan.addEventListener("click", updateGender); polWoman.addEventListener("click", updateGender); const images = { storyStyle1: { boy: "img/card-ph-b-1.png", girl: "img/card-ph-g-1.png" }, storyStyle2: { boy: "img/card-ph-b-2.png", girl: "img/card-ph-g-2.png" }, storyStyle3: { boy: "img/card-ph-b-3.png", girl: "img/card-ph-g-3.png" }, storyStyle4: { boy: "img/card-ph-b-4.png", girl: "img/card-ph-g-4.png" }, storyStyle5: { boy: "img/card-ph-b-5.png", girl: "img/card-ph-g-5.png" }, storyStyle6: { boy: "img/card-ph-b-6.png", girl: "img/card-ph-g-6.png" }, storyStyle7: { boy: "img/card-ph-b-7.png", girl: "img/card-ph-g-7.png" }, storyStyle8: { boy: "img/card-ph-b-8.png", girl: "img/card-ph-g-8.png" }, storyStyle9: { boy: "img/card-ph-b-9.png", girl: "img/card-ph-g-9.png" } }; const updateImages = () => { const selectedGender = polMan.classList.contains("active-btn") ? "boy" : polWoman.classList.contains("active-btn") ? "girl" : null; if (!selectedGender) return; // Если пол не выбран, не меняем картинки document.querySelectorAll(".card-par").forEach(card => { const id = card.id; const img = card.querySelector(".card-img-top"); if (images[id] && images[id][selectedGender]) { img.src = images[id][selectedGender]; } }); }; // Функция для выбора мессенджера document.querySelectorAll(".msg-option").forEach((msgOption) => { msgOption.addEventListener("click", (e) => { const option = e.target.closest(".msg-option").getAttribute("data-option"); selectedOption = option; // Обновляем выбранный мессенджер console.log("Выбранный мессенджер:", selectedOption); // Получаем все бейджи с нужными классами const tgBadges = document.querySelectorAll(".badge1"); const waBadges = document.querySelectorAll(".badge2"); // Скрываем все бейджи tgBadges.forEach(badge => badge.style.display = "none"); waBadges.forEach(badge => badge.style.display = "none"); // Показываем выбранные бейджи if (selectedOption === "tg") { tgBadges.forEach(badge => badge.style.display = "block"); } else if (selectedOption === "wa") { console.log("Активируем WA badge"); waBadges.forEach(badge => badge.style.display = "block"); } }); }); document.body.addEventListener("click", async (event) => { if (event.target && event.target.id === "sendTo") { const button = event.target; // Получаем элемент кнопки button.disabled = true; // Отключаем кнопку let errors = []; updateGender(); // Проверяем пол перед отправкой if (!gender) errors.push("Пол не выбран"); // Получение значений из input const kidName = document.getElementById("kidName").value.trim(); const kidAge = document.getElementById("kidAge").value.trim(); const storyMoral = document.getElementById("storyMoral").value.trim(); const fullStoryMoral = storyMoral ? "Мораль сказки - " + storyMoral : ""; const storyTem = document.getElementById("storyTem").value.trim(); const dopHero = document.getElementById("dopHero").value.trim(); const phoneClient = document.getElementById("phoneAuth").value.trim(); if (!kidName) errors.push("Имя ребенка не заполнено"); if (!kidAge) errors.push("Возраст ребенка не заполнен"); if (!phoneClient) errors.push("Телефон не заполнен"); if (!selectedOption) errors.push("Мессенджер не выбран"); const hairMap = { hair1: "Светлый", hair2: "Русый", hair3: "Рыжий", hair4: "Темный", hair5: "Черный", }; const eyeMap = { eye1: "Зеленый", eye2: "Голубой", eye3: "Ореховый", eye4: "Карий", eye5: "Серый", }; const selectedHair = hairMap[selectedHairId] || ""; const selectedEye = eyeMap[selectedEyeId] || ""; if (!selectedHair) errors.push("Цвет волос не выбран"); if (!selectedEye) errors.push("Цвет глаз не выбран"); const storyStyleMap = { storyStyle1: "1", storyStyle2: "2", storyStyle3: "3", storyStyle4: "4", storyStyle5: "5", storyStyle6: "6", storyStyle7: "7", storyStyle8: "8", storyStyle9: "9", }; const selectedStory = storyStyleMap[selectedStoryId] || ""; if (!selectedStory) errors.push("Стиль сказки не выбран"); const kidPhotoInput = document.getElementById("kidPhoto"); const kidPhoto = kidPhotoInput.files[0]; // Проверяем фото (если загружено) if (kidPhoto) { if (!kidPhoto.type.startsWith("image/")) { errors.push("Файл должен быть изображением"); } else if (kidPhoto.size > 8 * 1024 * 1024) { errors.push("Файл не должен превышать 8MB"); } } if (errors.length > 0) { alert("Ошибка:\n" + errors.join("\n")); button.disabled = false; // Включаем кнопку обратно в случае ошибки return; } const formData = new FormData(); formData.append("gender", gender); formData.append("kidName", kidName); formData.append("kidAge", kidAge); formData.append("storyMoral", fullStoryMoral || ""); formData.append("hairColor", selectedHair); formData.append("eyeColor", selectedEye); formData.append("selectedStory", selectedStory); formData.append("storyTem", storyTem); formData.append("dopHero", dopHero || ""); formData.append("phoneClient", phoneClient); formData.append("selectedOption", selectedOption); if (kidPhoto) { formData.append("kidPhoto", kidPhoto); } console.log("Отправляемые данные:", formData); try { if (kidPhoto && kidPhoto.size > 2 * 1024 * 1024) { console.log("Файл больше 1MB, добавляем задержку перед отправкой..."); await new Promise(resolve => setTimeout(resolve, 1000)); } const response = await fetch("/api/getPrompt.php", { method: "POST", body: formData, }); if (!response.ok) { throw new Error(`Ошибка при запросе: ${response.status}`); } const data = await response.json(); console.log("Ответ сервера:", data); const promptId = data?.api_response?.prompt_id; if (promptId) { if (selectedOption === "wa") { window.location.href = "https://wa.me/79520420255?text=Это%20автоматическое%20сообщение.%20Отправьте%20его%20для%20получения%20сказки!"; } else if (selectedOption === "tg") { window.location.href = `https://t.me/storyai_order_bot?start=${promptId}`; } } else { console.error("Ошибка: prompt_id отсутствует в ответе сервера"); alert("Ошибка: prompt_id отсутствует в ответе сервера"); button.disabled = false; // Включаем кнопку обратно в случае ошибки } } catch (error) { console.error("Ошибка с fetch:", error); alert("Произошла ошибка при отправке данных. Ошибка: " + error.message); button.disabled = false; // Включаем кнопку обратно в случае ошибки } } }); document.getElementById("payButton").addEventListener("click", function () { const selectedAmount = document.querySelector('input[name="flexRadioDefault"]:checked').value; fetch("api/payment.php", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ amount: selectedAmount, phone: document.getElementById("phoneAuth").value.trim() }) }) .then(response => response.json()) .then(data => { if (data.confirmation_url) { setTimeout(() => { window.open(data.confirmation_url, '_blank'); }, 500); // Небольшая задержка перед открытием окна } else { alert("Ошибка при создании платежа"); } }) .catch(error => console.error("Ошибка:", error)); }); }); document.addEventListener('DOMContentLoaded', () => { const phoneInput = document.querySelector("#phoneAuth"); const errorDiv = document.querySelector("#phoneError"); const modalBody = document.querySelector('#modalOrder .modal-body'); const checkButton = document.getElementById('check'); const payCheckButton = document.getElementById('checkPay'); phoneInput.value = "+7"; // Автоподстановка +7 при фокусе phoneInput.addEventListener("DOM", () => { if (!phoneInput.value) { phoneInput.value = "+7"; } }); // Блокируем ввод нецифровых символов и ограничиваем длину phoneInput.addEventListener("input", () => { phoneInput.value = phoneInput.value.replace(/[^\d+]/g, ''); // Оставляем только цифры и + if (!phoneInput.value.startsWith("+7")) { phoneInput.value = "+7"; // Если пользователь удалил, вернуть +7 } }); // Валидация номера: строго +7 и 10 цифр после function validatePhoneNumber() { const number = phoneInput.value; if (/^\+7\d{10}$/.test(number)) { errorDiv.style.display = "none"; return true; } else { errorDiv.style.display = "block"; errorDiv.textContent = "Введите номер в формате +7XXXXXXXXXX"; return false; } } // Функция отправки номера на сервер (только при успешной валидации) async function checkClient() { if (!validatePhoneNumber()) return; // Проверка, если невалидно — не отправлять const phone = phoneInput.value; try { const response = await fetch('/api/auth.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ phone }), }); if (!response.ok) { throw new Error('Ошибка сети'); } const result = await response.json(); renderModal(result); } catch (error) { modalBody.innerHTML = `

Ошибка запроса: ${error.message}

`; } } function renderModal(data) { // Скрываем все блоки модала const allBlocks = modalBody.querySelectorAll('.modal-block'); allBlocks.forEach(block => block.style.display = 'none'); // Проверяем статус и показываем нужный блок if (data.status === 'created') { document.getElementById('createdBlock').style.display = 'block'; } else if (data.status === 'exists') { const countOrdersElement = document.getElementById('countOrders'); if (countOrdersElement) { countOrdersElement.textContent = data.count_orders; } if (data.count_orders === 0) { // Если попыток нет — показываем блок оплаты document.getElementById('zeroBlock').style.display = 'block'; } else { // Если есть попытки — обычный блок document.getElementById('existsBlock').style.display = 'block'; } } else { // Ошибка const errorMessageElement = document.getElementById('errorMessage'); if (errorMessageElement) { errorMessageElement.textContent = data.error; } document.getElementById('errorBlock').style.display = 'block'; } } // Назначаем обработчик на кнопку checkButton.addEventListener('click', checkClient); payCheckButton.addEventListener('click', checkClient); // Валидация на событиях phoneInput.addEventListener("blur", validatePhoneNumber); phoneInput.addEventListener("input", validatePhoneNumber); });