1document.addEventListener('DOMContentLoaded', function () { 2 const forms = document.querySelectorAll('.js-member-profile-form'); 3 if (!forms.length) return; 4 5 forms.forEach((form) => { 6 const submitButton = form.querySelector('button[type="submit"], input[type="submit"]'); 7 const messageBox = form.querySelector('.form-messages') || (() => { 8 const el = document.createElement('div'); 9 el.className = 'form-messages'; 10 form.appendChild(el); 11 return el; 12 })(); 13 14 form.addEventListener('submit', async function (e) { 15 e.preventDefault(); 16 17 const name = (form.querySelector('[name="name"]')?.value || '').trim(); 18 const email = (form.querySelector('[name="email"]')?.value || '').trim(); 19 const phone = (form.querySelector('[name="phone"]')?.value || '').trim(); 20 const old_password = (form.querySelector('[name="old_password"]')?.value || ''); 21 const new_password = (form.querySelector('[name="new_password"]')?.value || ''); 22 const confirm_password = (form.querySelector('[name="confirm_password"]')?.value || ''); 23 24 const restUrl = form.dataset.restUrl || '/wp-json/sync360/v1/member-profile'; 25 const restNonce = form.dataset.restNonce || ''; 26 27 if (!name || !email || !phone) { 28 messageBox.style.display = 'block'; 29 messageBox.innerHTML = '<p style="color:red">Preencha todos os campos.</p>'; 30 return; 31 } 32 33 const wantsPasswordChange = !!(old_password || new_password || confirm_password); 34 if (wantsPasswordChange) { 35 const pwErrors = []; 36 if (!old_password) pwErrors.push('Informe a senha atual.'); 37 if (!new_password) pwErrors.push('Informe a nova senha.'); 38 if (new_password && new_password.length < 8) pwErrors.push('A nova senha deve ter pelo menos 8 caracteres.'); 39 if (new_password !== confirm_password) pwErrors.push('A confirmação de senha não confere.'); 40 if (pwErrors.length) { 41 messageBox.style.display = 'block'; 42 messageBox.innerHTML = pwErrors.map((m) => `<p style="color:red">${m}</p>`).join(''); 43 return; 44 } 45 } 46 47 // Initial feedback 48 if (submitButton) { 49 submitButton.disabled = true; 50 submitButton.dataset._originalText = submitButton.textContent; 51 submitButton.textContent = 'Salvando...'; 52 } 53 messageBox.innerHTML = ''; 54 messageBox.style.display = 'none'; 55 56 try { 57 const payload = { name, email, phone }; 58 if (wantsPasswordChange) { 59 payload.old_password = old_password; 60 payload.new_password = new_password; 61 payload.confirm_password = confirm_password; 62 } 63 64 const response = await fetch(restUrl, { 65 method: 'POST', 66 credentials: 'same-origin', 67 headers: { 68 'Content-Type': 'application/json', 69 ...(restNonce ? { 'X-WP-Nonce': restNonce } : {}), 70 }, 71 body: JSON.stringify(payload), 72 }); 73 74 const result = await response.json().catch(() => ({})); 75 messageBox.style.display = 'block'; 76 77 if (response.ok && result && result.success) { 78 let msg = 'Perfil atualizado com sucesso.'; 79 if (result.password_updated) { 80 msg += ' Sua senha foi alterada. Você pode precisar entrar novamente.'; 81 if (form.querySelector('[name="old_password"]')) form.querySelector('[name="old_password"]').value = ''; 82 if (form.querySelector('[name="new_password"]')) form.querySelector('[name="new_password"]').value = ''; 83 if (form.querySelector('[name="confirm_password"]')) form.querySelector('[name="confirm_password"]').value = ''; 84 } 85 messageBox.innerHTML = `<p style="color:green">${msg}</p>`; 86 } else if (result && result.errors) { 87 messageBox.innerHTML = result.errors.map((msg) => `<p style="color:red">${msg}</p>`).join(''); 88 } else { 89 messageBox.innerHTML = '<p style="color:red">Não foi possÃvel atualizar o perfil.</p>'; 90 } 91 } catch (err) { 92 console.error(err); 93 messageBox.style.display = 'block'; 94 messageBox.innerHTML = '<p style="color:red">Erro ao conectar com o servidor.</p>'; 95 } finally { 96 if (submitButton) { 97 submitButton.disabled = false;
98 submitButton.textContent = submitButton.dataset._originalText || 'Salvar alterações'; 99 } 100 } 101 }); 102 }); 103}); 104
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.