function openProfilePanel() { const panel = document.getElementById('profilePanel'); const overlay = document.getElementById('profilePanelOverlay'); if (!panel || !overlay) return; const discountMessage = document.getElementById('profileDiscountMessage'); if (discountMessage) { discountMessage.textContent = ''; discountMessage.classList.add('hidden'); discountMessage.classList.remove('is-error', 'is-success'); } const freespinMessage = document.getElementById('profileFreespinMessage'); if (freespinMessage) { freespinMessage.textContent = ''; freespinMessage.classList.add('hidden'); freespinMessage.classList.remove('is-error', 'is-success', 'is-warning', 'is-info'); } panel.classList.add('is-open'); overlay.classList.add('is-open'); panel.setAttribute('aria-hidden', 'false'); overlay.setAttribute('aria-hidden', 'false'); var toggle = document.getElementById('header-user-menu-toggle'); if (toggle) { toggle.setAttribute('aria-expanded', 'true'); try { var r = toggle.getBoundingClientRect(); var w = panel.offsetWidth || 240; var left = Math.min(Math.max(8, r.right - w), window.innerWidth - w - 8); panel.style.top = Math.round(r.bottom + 8) + 'px'; panel.style.right = 'auto'; panel.style.left = Math.round(left) + 'px'; } catch (e) {} } document.body.classList.add('profile-dropdown-open'); } function closeProfilePanel() { const panel = document.getElementById('profilePanel'); const overlay = document.getElementById('profilePanelOverlay'); if (!panel || !overlay) return; panel.classList.remove('is-open'); overlay.classList.remove('is-open'); panel.setAttribute('aria-hidden', 'true'); overlay.setAttribute('aria-hidden', 'true'); var toggle = document.getElementById('header-user-menu-toggle'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); document.body.classList.remove('profile-dropdown-open'); try { unlockPageScrollForProfilePanel(); } catch (e) {} } document.addEventListener('DOMContentLoaded', function () { const overlay = document.getElementById('profilePanelOverlay'); const closeBtn = document.getElementById('profilePanelClose'); const promoForm = document.getElementById('profilePanelPromoForm'); if (overlay) { overlay.addEventListener('click', closeProfilePanel); } document.querySelectorAll('.profile-panel__link[href], .profile-panel__quick-btn[href]').forEach(function (link) { link.addEventListener('click', function () { closeProfilePanel(); }); }); if (closeBtn) { closeBtn.addEventListener('click', closeProfilePanel); } document.querySelectorAll('[data-profile-scroll]').forEach(function (link) { link.addEventListener('click', function (event) { event.preventDefault(); const target = document.getElementById(link.getAttribute('data-profile-scroll')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }); }); document.querySelectorAll('[data-profile-action="sidebar"]').forEach(function (link) { link.addEventListener('click', function (event) { event.preventDefault(); closeProfilePanel(); if (typeof toggleSidebar === 'function') { toggleSidebar(); } }); }); document.querySelectorAll('[data-profile-action="discount"]').forEach(function (link) { link.addEventListener('click', function (event) { event.preventDefault(); const messageBox = document.getElementById('profileDiscountMessage'); const showMessage = function (text, tone) { if (!messageBox) return; messageBox.textContent = text; messageBox.classList.remove('hidden', 'is-error', 'is-success'); if (tone === 'error') messageBox.classList.add('is-error'); if (tone === 'success') messageBox.classList.add('is-success'); }; if (link.getAttribute('data-discount-can-request') !== '1') { showMessage(link.getAttribute('data-discount-message') || 'Şu anda talep oluşturamazsınız.', 'error'); return; } if (link.classList.contains('is-loading')) { return; } link.classList.add('is-loading'); fetch('https://puslubet.com/api/discount/request', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '' }, body: JSON.stringify({}) }) .then(function (response) { if (response.status === 419) { throw new Error('csrf'); } return response.json(); }) .then(function (data) { showMessage(data.message || 'İşlem tamamlandı.', data.success ? 'success' : 'error'); if (data.success) { link.setAttribute('data-discount-can-request', '0'); link.classList.add('profile-panel__chip--disabled'); } }) .catch(function (error) { if (error && error.message === 'csrf') { showMessage('Oturum süresi doldu. Sayfayı yenileyip tekrar deneyin.', 'error'); return; } showMessage('Talep gönderilemedi. Lütfen tekrar deneyin.', 'error'); }) .finally(function () { link.classList.remove('is-loading'); }); }); }); document.querySelectorAll('[data-profile-action="freespin"]').forEach(function (link) { const statusBox = document.querySelector('[data-freespin-status]'); const flashBox = document.getElementById('profileFreespinMessage'); const applyTone = function (el, tone) { if (!el) return; el.classList.remove('is-error', 'is-success', 'is-warning', 'is-info'); if (tone) el.classList.add('is-' + tone); }; const syncFreespinUi = function (data) { const message = data.message || link.getAttribute('data-freespin-message') || ''; const tone = data.tone || (data.success ? 'success' : 'error'); const canRequest = data.can_request === true || data.can_request === 1 || data.can_request === '1'; link.setAttribute('data-freespin-message', message); link.setAttribute('data-freespin-tone', tone); if (data.state) link.setAttribute('data-freespin-state', data.state); link.setAttribute('data-freespin-can-request', canRequest ? '1' : '0'); if (statusBox) { const showStatus = data.show_status !== false && data.show_status !== 0 && data.show_status !== '0'; if (showStatus) { statusBox.textContent = message; statusBox.classList.remove('hidden'); applyTone(statusBox, tone); } else { statusBox.textContent = ''; statusBox.classList.add('hidden'); } } if (canRequest) { link.classList.remove('profile-panel__chip--disabled'); link.removeAttribute('aria-disabled'); link.removeAttribute('tabindex'); } else { link.classList.add('profile-panel__chip--disabled'); link.setAttribute('aria-disabled', 'true'); link.setAttribute('tabindex', '-1'); } var labelEl = link.querySelector('[data-freespin-label]'); if (labelEl) { var st = data.state || link.getAttribute('data-freespin-state') || ''; if (st === 'active') labelEl.textContent = 'FREE SPIN AKTİF'; else if (st === 'pending') labelEl.textContent = 'FREE SPIN İŞLENİYOR'; else labelEl.textContent = 'FREE SPIN TALEP ET'; } // Aktif / başarılı durumda kırmızı hata kutusunu temizle if (flashBox && (data.success || (data.state === 'active') || !canRequest)) { if (data.success || data.state === 'active') { flashBox.textContent = ''; flashBox.classList.add('hidden'); flashBox.classList.remove('is-error', 'is-success', 'is-warning', 'is-info'); } } }; // Panel açılışında sunucu durumuna göre etiketi senkronla // Aktif hakkı varsa bilgi kutusunu zorla açma — alındıktan sonra gizli kalsın var initState = link.getAttribute('data-freespin-state') || ''; var initShowStatus = initState !== 'active' && initState !== 'consumed' && !!(statusBox && !statusBox.classList.contains('hidden') && statusBox.getAttribute('hidden') === null); syncFreespinUi({ message: link.getAttribute('data-freespin-message') || '', tone: link.getAttribute('data-freespin-tone') || 'info', state: initState, can_request: link.getAttribute('data-freespin-can-request') === '1', show_status: initShowStatus, success: initState === 'active' }); if (initState === 'active') { if (statusBox) { statusBox.textContent = ''; statusBox.classList.add('hidden'); statusBox.setAttribute('hidden', ''); } if (flashBox) { flashBox.textContent = ''; flashBox.classList.add('hidden'); } } const showFlash = function (text, tone) { if (!flashBox) return; flashBox.textContent = text; flashBox.classList.remove('hidden'); applyTone(flashBox, tone); }; link.addEventListener('click', function (event) { event.preventDefault(); if (link.getAttribute('data-freespin-can-request') !== '1' || link.classList.contains('profile-panel__chip--disabled')) { return; } if (link.classList.contains('is-loading')) { return; } link.classList.add('is-loading'); link.classList.add('profile-panel__chip--disabled'); fetch('https://puslubet.com/api/freespin/request', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]')?.getAttribute('content') || '' }, body: JSON.stringify({}) }) .then(function (response) { if (response.status === 419) { throw new Error('csrf'); } return response.json(); }) .then(function (data) { if (flashBox) { flashBox.textContent = ''; flashBox.classList.add('hidden'); } // Alındıktan sonra kutuyu hemen kapat (10 sn bekleme yok) if (data && data.state === 'active') { data.show_status = false; } syncFreespinUi(data); if (data && data.state === 'active' && statusBox) { statusBox.textContent = ''; statusBox.classList.add('hidden'); statusBox.setAttribute('hidden', ''); } }) .catch(function (error) { if (error && error.message === 'csrf') { showFlash('Oturum süresi doldu. Sayfayı yenileyip tekrar deneyin.', 'error'); if (link.getAttribute('data-freespin-can-request') === '1') { link.classList.remove('profile-panel__chip--disabled'); } return; } showFlash('Talep gönderilemedi. Lütfen tekrar deneyin.', 'error'); if (link.getAttribute('data-freespin-can-request') === '1') { link.classList.remove('profile-panel__chip--disabled'); } }) .finally(function () { link.classList.remove('is-loading'); }); }); }); if (promoForm && typeof handlePromoCodeSubmit === 'function') { promoForm.addEventListener('submit', function (event) { event.preventDefault(); handlePromoCodeSubmit(promoForm, 'profilePanelPromoMessage'); }); } document.addEventListener('keydown', function (event) { if (event.key === 'Escape') { closeProfilePanel(); } }); document.addEventListener('touchmove', function (event) { if (!document.body.classList.contains('profile-panel-open')) { return; } var profilePanel = document.getElementById('profilePanel'); if (profilePanel && profilePanel.contains(event.target)) { return; } event.preventDefault(); }, { passive: false }); });