Jake Vanderwerf
2026-01-02 e6287fd606e6e3220261fd68c394989e6ade0f90
inc/managers/LoginManager.php
@@ -64,6 +64,7 @@
      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);
@@ -303,6 +304,22 @@
      }
      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');
@@ -855,99 +872,99 @@
      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