summaryrefslogtreecommitdiff
path: root/http/public/scripts/contact/submit-contact-form.js
blob: a90f420bc010c606f0e2a6341c9db45778cc97f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { actions } from "./actions.js";
import { postErrorMessageOnContactForm } from "./post-error-message.js";
import { resetResendButton } from "./reset-resend-button.js";

/** @typedef {import("./selectors.js").Selectors} Selectors */

const fallbackErrorMsg =
  "No can do. I'm afraid joeac.net is a bit broken right now - sorry about that.";

/**
 * @param {Selectors} selectors
 * @param {NodeJS.Timeout | undefined} resetButtonInterval
 * @returns {Promise<Result>}
 */
export async function submitContactForm(selectors, resendButtonInterval) {
  const { contactForm, otpDialog } = selectors;

  const name = contactForm.nameElem()?.value;
  const email = contactForm.emailElem().value;

  contactForm.submitButton()?.setAttribute("disabled", "");
  try {
    await actions.sendOtp({ type: "email", name, email });
  } catch (sendOtpError) {
    const errorMsg = sendOtpError?.toString() ?? fallbackErrorMsg;
    postErrorMessageOnContactForm(selectors, errorMsg);
    throw sendOtpError;
  }

  const otpRecipient = otpDialog.otpRecipient();
  email && otpRecipient && (otpRecipient.textContent = `<${email}>`);
  const otpValidUntil = otpDialog.otpValidUntil();
  const validUntil = new Date(Date.now() + 1000 * 60 * 5);
  otpValidUntil &&
    (otpValidUntil.textContent = `until ${validUntil.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" })}`);

  const dialog = otpDialog.self();
  dialog.showModal();
  contactForm.submitButton()?.removeAttribute("disabled");
  dialog.addEventListener("click", function (event) {
    const rect = dialog.getBoundingClientRect();
    const isInDialog =
      rect.top <= event.clientY &&
      event.clientY <= rect.top + rect.height &&
      rect.left <= event.clientX &&
      event.clientX <= rect.left + rect.width;
    if (!isInDialog) {
      dialog.close();
    }
  });

  return resetResendButton(selectors, resendButtonInterval);
}