All files / solutions register-solution.ts

0% Statements 0/41
0% Branches 0/17
0% Functions 0/7
0% Lines 0/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103                                                                                                                                                                                                             
import initConfirmationModal from "./modules/ConfirmationModal.js";
 
type ConfirmationFormData = Record<string, FormDataEntryValue>;
 
interface SolutionNameValidationResponse {
  exists: boolean;
}
 
function getRegistrationMessage(formData: ConfirmationFormData): string {
  const name = formData.name || "[name not provided]";
  const publisher = formData.publisher || "[publisher not selected]";
 
  return `Are you sure you want to register the solution "${name}" 
          under the publisher "${publisher}"? 
          This will submit the solution for name review.`;
}
 
document.addEventListener("DOMContentLoaded", function () {
  initConfirmationModal({
    formSelector: ".p-form",
    getMessage: getRegistrationMessage,
  });
 
  const nameInput = document.getElementById("name") as HTMLInputElement | null;
  const validationContainer = document.getElementById(
    "solution-name-validation"
  );
  const validationMessage = document.getElementById(
    "solution-name-validation-message"
  );
 
  const submitButton = document.querySelector<HTMLButtonElement>(
    'button[type="submit"]'
  );
 
  if (!nameInput || !validationContainer || !validationMessage) {
    return;
  }
 
  let validationTimeout: ReturnType<typeof setTimeout> | null = null;
 
  function showValidationError(message: string): void {
    validationMessage!.textContent = message;
    validationContainer!.classList.add("is-error");
    nameInput!.setAttribute("aria-invalid", "true");
    nameInput!.setAttribute(
      "aria-describedby",
      "solution-name-validation-message"
    );
 
    if (submitButton) {
      submitButton.disabled = true;
    }
  }
 
  function hideValidationError(): void {
    validationMessage!.textContent = "";
    validationContainer!.classList.remove("is-error");
    nameInput!.removeAttribute("aria-invalid");
    nameInput!.removeAttribute("aria-describedby");
 
    if (submitButton) {
      submitButton.disabled = false;
    }
  }
 
  async function validateSolutionName(name: string): Promise<boolean> {
    try {
      const response = await fetch(
        `/validate-solution-name?name=${encodeURIComponent(name)}`
      );
      const data = (await response.json()) as SolutionNameValidationResponse;
      return data.exists;
    } catch (error) {
      console.error("Error validating solution name:", error);
      return false;
    }
  }
 
  nameInput.addEventListener("input", () => {
    const name = nameInput.value.trim();
 
    clearTimeout(validationTimeout as ReturnType<typeof setTimeout>);
 
    if (name.length === 0) {
      hideValidationError();
      return;
    }
 
    validationTimeout = setTimeout(async () => {
      const exists = await validateSolutionName(name);
 
      if (exists) {
        showValidationError(
          `A solution with the name "${name}" already exists. Please choose a different name.`
        );
      } else {
        hideValidationError();
      }
    }, 500);
  });
});