| | |
| | | add_action('wp_login', [$this, 'handleSuccessfulLogin'], 10, 2); |
| | | |
| | | add_filter( 'login_url', [$this, 'loginUrl'], 10, 3 ); |
| | | add_filter( 'logout_url', [$this, 'logoutUrl'], 10, 2 ); |
| | | // Allow other features to register handlers |
| | | do_action('jvbLoginManagerInit', $this); |
| | | add_action('user_register', array($this, 'saveRegistrationFields'), 999, 2); |
| | |
| | | } |
| | | return $login_url; |
| | | } |
| | | |
| | | public function logoutUrl(string $logout_url, string $redirect): string |
| | | { |
| | | // Build custom logout URL |
| | | $logout_url = site_url('/login/', 'login'); |
| | | $logout_url = add_query_arg('action', 'logout', $logout_url); |
| | | |
| | | if (!empty($redirect)) { |
| | | $logout_url = add_query_arg('redirect_to', urlencode($redirect), $logout_url); |
| | | } |
| | | |
| | | // Add nonce for security |
| | | $logout_url = wp_nonce_url($logout_url, 'log-out'); |
| | | |
| | | return $logout_url; |
| | | } |
| | | public function getLoginPage():int|false |
| | | { |
| | | return (int)get_option(BASE.'login_page'); |
| | |
| | | ob_start(); |
| | | ?> |
| | | |
| | | document.addEventListener('DOMContentLoaded', () => { |
| | | const form = document.querySelector('.login form'); |
| | | if (!form) return; |
| | | document.addEventListener('DOMContentLoaded', async function () { |
| | | window.auth.subscribe(event => { |
| | | if (event === 'auth-loaded') { |
| | | const form = document.querySelector('.login form'); |
| | | if (!form) return; |
| | | |
| | | if (!window.jvbForm) { |
| | | console.error('jvbForm not loaded'); |
| | | return; |
| | | } |
| | | |
| | | window.LoginController = new window.jvbForm(); |
| | | window.LoginController.registerForm(form, { |
| | | autosave: false, |
| | | endpoint: <?= "'{$action}'" ?>, |
| | | formStatus: false, |
| | | cache: false, |
| | | }); |
| | | |
| | | window.LoginController.subscribe((event, data) => { |
| | | if (event === 'form-submit') { |
| | | handleFormSubmission(data); |
| | | if (!window.jvbForm) { |
| | | console.error('jvbForm not loaded'); |
| | | return; |
| | | } |
| | | }); |
| | | |
| | | |
| | | async function handleFormSubmission(data) { |
| | | let realFormData = data.fullData; |
| | | const { formId, config, data: formData } = data; |
| | | |
| | | |
| | | const form = config.element; |
| | | |
| | | const submit = form.querySelector('[type=submit]'); |
| | | let oldText = submit.textContent; |
| | | |
| | | |
| | | window.LoginController.showFormStatus(formId, 'uploading'); |
| | | |
| | | try { |
| | | submit.disabled = true; |
| | | submit.textContent = 'Loading...'; |
| | | const response = await fetch(`${jvbSettings.api}<?=($action === 'magic') ? $action : 'auth/'.$action?>`, { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Content-Type': 'application/json', |
| | | 'X-WP-Nonce': window.auth.getNonce() |
| | | }, |
| | | body: JSON.stringify(realFormData) |
| | | window.LoginController = new window.jvbForm(); |
| | | window.LoginController.registerForm(form, { |
| | | autosave: false, |
| | | endpoint: <?= "'{$action}'" ?>, |
| | | formStatus: false, |
| | | cache: false, |
| | | }); |
| | | |
| | | const result = await response.json(); |
| | | |
| | | // Handle errors |
| | | if (!response.ok) { |
| | | window.LoginController.showFormStatus(formId, 'error'); |
| | | window.LoginController.handleFormError(form, result); |
| | | return; |
| | | window.LoginController.subscribe((event, data) => { |
| | | if (event === 'form-submit') { |
| | | handleFormSubmission(data); |
| | | } |
| | | }); |
| | | |
| | | // Handle success |
| | | window.LoginController.showFormStatus(formId, 'submitted'); |
| | | |
| | | // Show success message briefly before redirect |
| | | if (result.message) { |
| | | window.LoginController.handleFormSuccess(form, result); |
| | | } |
| | | async function handleFormSubmission(data) { |
| | | let realFormData = data.fullData; |
| | | const { formId, config, data: formData } = data; |
| | | |
| | | if (window.auth && typeof window.auth.handleLogin === 'function' && Object.hasOwn(result, 'auth')) { |
| | | console.log('Awaiting Auth...'); |
| | | await window.auth.handleLogin(result.auth); // Pass the full result |
| | | } |
| | | |
| | | // Handle redirect |
| | | if (result.redirect) { |
| | | setTimeout(() => { |
| | | window.location.href = result.redirect; |
| | | }, 200); // Brief delay to show success message |
| | | } |
| | | const form = config.element; |
| | | |
| | | } catch (error) { |
| | | console.error('Form submission error:', error); |
| | | window.LoginController.showFormStatus(formId, 'error'); |
| | | window.LoginController.handleFormError(form, { |
| | | message: 'Network error. Please check your connection and try again.', |
| | | code: 'network_error' |
| | | const submit = form.querySelector('[type=submit]'); |
| | | let oldText = submit.textContent; |
| | | |
| | | |
| | | window.LoginController.showFormStatus(formId, 'uploading'); |
| | | |
| | | try { |
| | | submit.disabled = true; |
| | | submit.textContent = 'Loading...'; |
| | | const response = await window.auth.fetch(`${jvbSettings.api}auth/<?php echo $action; ?>`, { |
| | | method: 'POST', |
| | | body: JSON.stringify(realFormData) |
| | | }); |
| | | } finally { |
| | | submit.textContent = oldText; |
| | | submit.disabled = false; |
| | | |
| | | const result = await response.json(); |
| | | |
| | | // Handle errors |
| | | if (!response.ok) { |
| | | window.LoginController.showFormStatus(formId, 'error'); |
| | | window.LoginController.handleFormError(form, result); |
| | | return; |
| | | } |
| | | |
| | | // Handle success |
| | | window.LoginController.showFormStatus(formId, 'submitted'); |
| | | |
| | | // Show success message briefly before redirect |
| | | if (result.message) { |
| | | window.LoginController.handleFormSuccess(form, result); |
| | | } |
| | | |
| | | if (window.auth && typeof window.auth.handleLogin === 'function' && Object.hasOwn(result, 'auth')) { |
| | | console.log('Awaiting Auth...'); |
| | | await window.auth.handleLogin(result.auth); // Pass the full result |
| | | } |
| | | |
| | | // Handle redirect |
| | | if (result.redirect) { |
| | | setTimeout(() => { |
| | | window.location.href = result.redirect; |
| | | }, 100); // Brief delay to show success message |
| | | } |
| | | |
| | | } catch (error) { |
| | | console.error('Form submission error:', error); |
| | | window.LoginController.showFormStatus(formId, 'error'); |
| | | window.LoginController.handleFormError(form, { |
| | | message: 'Network error. Please check your connection and try again.', |
| | | code: 'network_error' |
| | | }); |
| | | } finally { |
| | | submit.textContent = oldText; |
| | | submit.disabled = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | | }); |
| | | |
| | | }); |
| | | |
| | | |
| | | |
| | | <?php |