(() => { const form = document.getElementById('paddleAccountForm'); if (!form) return; const button = form.querySelector('[data-paddle-prepare]'); const errorBox = document.getElementById('paddleCheckoutError'); const stage = document.getElementById('paddlePaymentStage'); const stageStatus = document.getElementById('paddleStageStatus'); let initialized = false; let currentOrderId = null; let successUrl = form.dataset.successUrl || '/'; function message(text) { if (!errorBox) return; errorBox.textContent = text || ''; errorBox.hidden = !text; } function setBusy(busy) { if (!button) return; button.disabled = busy; button.classList.toggle('is-loading', busy); const defaultText = button.dataset.defaultText || button.textContent; button.dataset.defaultText = defaultText; button.textContent = busy ? (form.dataset.loadingText || 'Paddle wird vorbereitet …') : defaultText; } function onPaddleEvent(event) { const name = String(event?.name || ''); if (name === 'checkout.completed') { if (stageStatus) { stageStatus.textContent = form.dataset.completedText || 'Zahlung abgeschlossen – GoVipe verarbeitet den Webhook …'; } const suffix = currentOrderId ? ('?order=' + encodeURIComponent(currentOrderId)) : ''; window.setTimeout(() => { window.location.assign(successUrl + suffix); }, 700); } } form.addEventListener('submit', async (event) => { event.preventDefault(); message(''); if (!window.Paddle) { message(form.dataset.loadError || 'Paddle.js konnte nicht geladen werden.'); return; } setBusy(true); try { const response = await fetch('/actions/prepare-paddle-purchase.php', { method: 'POST', credentials: 'same-origin', headers: { 'Accept': 'application/json' }, body: new FormData(form) }); const data = await response.json().catch(() => ({})); if (!response.ok || !data.ok) { throw new Error(data.error || 'Die Zahlung konnte nicht vorbereitet werden.'); } currentOrderId = data.order_id || null; successUrl = data.success_url || successUrl; if (!initialized) { if (data.environment === 'sandbox') { Paddle.Environment.set('sandbox'); } Paddle.Initialize({ token: data.client_token, eventCallback: onPaddleEvent, checkout: { settings: { displayMode: 'inline', frameTarget: 'paddle-checkout-frame', frameInitialHeight: 620, frameStyle: 'width:100%;min-width:312px;background-color:transparent;border:none;', theme: 'dark', locale: form.dataset.locale || 'en', variant: 'one-page', allowLogout: false } } }); initialized = true; } form.classList.add('is-prepared'); if (stage) { stage.hidden = false; stage.scrollIntoView({ behavior: 'smooth', block: 'center' }); } if (stageStatus) { stageStatus.textContent = form.dataset.readyText || 'Paddle ist bereit.'; } Paddle.Checkout.open({ transactionId: data.transaction_id, customer: { email: data.email || String(form.elements.email?.value || '') } }); } catch (error) { message(error instanceof Error ? error.message : String(error)); setBusy(false); } }); })();