Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

87 lignes
4.0 KiB

  1. // assets/scripts/registration.js
  2. document.addEventListener('DOMContentLoaded', () => {
  3. const form = document.getElementById('register-form');
  4. const companyInput = document.getElementById('companyName');
  5. const slugPreview = document.getElementById('slug-preview');
  6. const submitBtn = document.getElementById('submit-btn');
  7. const errorBox = document.getElementById('register-errors');
  8. const appDomain = window.REGISTER_APP_DOMAIN ?? '';
  9. // ── Slug-Vorschau ─────────────────────────────────────────────────────────
  10. let debounce = null;
  11. companyInput?.addEventListener('input', () => {
  12. clearTimeout(debounce);
  13. debounce = setTimeout(async () => {
  14. const value = companyInput.value.trim();
  15. if (!value) { slugPreview.textContent = ''; return; }
  16. try {
  17. const res = await fetch('/api/register/preview-slug', {
  18. method: 'POST',
  19. headers: { 'Content-Type': 'application/json' },
  20. body: JSON.stringify({ companyName: value }),
  21. });
  22. const data = await res.json();
  23. slugPreview.textContent = data.slug ? data.slug + '.' + appDomain : '–';
  24. } catch {
  25. slugPreview.textContent = '';
  26. }
  27. }, 350);
  28. });
  29. // ── Formular absenden ─────────────────────────────────────────────────────
  30. form?.addEventListener('submit', async (e) => {
  31. e.preventDefault();
  32. errorBox.innerHTML = '';
  33. submitBtn.disabled = true;
  34. submitBtn.textContent = 'Wird gesendet …';
  35. const payload = {
  36. companyName: document.getElementById('companyName').value,
  37. email: document.getElementById('email').value,
  38. firstName: document.getElementById('firstName').value,
  39. lastName: document.getElementById('lastName').value,
  40. password: document.getElementById('password').value,
  41. passwordRepeat: document.getElementById('passwordRepeat').value,
  42. };
  43. try {
  44. const res = await fetch('/api/register', {
  45. method: 'POST',
  46. headers: { 'Content-Type': 'application/json' },
  47. body: JSON.stringify(payload),
  48. });
  49. const data = await res.json();
  50. if (res.ok) {
  51. document.querySelector('.register-page').innerHTML = `
  52. <div class="register-success">
  53. <div class="register-success__icon">✓</div>
  54. <h2 class="register-success__title">Fast geschafft!</h2>
  55. <p class="register-success__text">
  56. Wir haben eine Bestätigungs-E-Mail an
  57. <strong>${payload.email}</strong> geschickt.
  58. </p>
  59. <p class="register-success__hint">
  60. Bitte klicke auf den Link in der E-Mail um dein Konto zu aktivieren.
  61. Der Link ist 24 Stunden gültig.
  62. </p>
  63. </div>
  64. `;
  65. } else {
  66. (data.errors ?? ['Unbekannter Fehler.']).forEach(msg => {
  67. const p = document.createElement('p');
  68. p.textContent = msg;
  69. errorBox.appendChild(p);
  70. });
  71. submitBtn.disabled = false;
  72. submitBtn.textContent = 'Konto erstellen';
  73. }
  74. } catch {
  75. errorBox.innerHTML = '<p>Verbindungsfehler. Bitte versuche es erneut.</p>';
  76. submitBtn.disabled = false;
  77. submitBtn.textContent = 'Konto erstellen';
  78. }
  79. });
  80. });