get_comment.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. const modal = document.getElementById("commentModal");
  2. const closeCommentModal = document.getElementById("closeCommentModal");
  3. const cancelCommentBtn = document.getElementById("cancelCommentBtn");
  4. const submitCommentBtn = document.getElementById("submitCommentBtn");
  5. const commentTextarea = document.getElementById("commentTextarea");
  6. const commentForm = document.getElementById("commentForm");
  7. const titleComment = document.getElementById("titleComment");
  8. const selectCommentTypeForm = document.getElementById("selectCommentTypeForm");
  9. const selectOptions = document.getElementById("selectOptions");
  10. export const COMMENT_TYPES = {
  11. LIBRE : 0,
  12. DESPLEGABLE : 1
  13. }
  14. export async function getComment(type, options=[]) {
  15. // 1. Limpiar estado anterior
  16. commentTextarea.value = "";
  17. selectOptions.innerHTML = "";
  18. if (type === COMMENT_TYPES.LIBRE) {
  19. commentForm.classList.remove("hidden");
  20. selectCommentTypeForm.classList.add("hidden");
  21. submitCommentBtn.disabled = true; // Deshabilitar al inicio
  22. commentTextarea.value = options[0] || "";
  23. } else if (type === COMMENT_TYPES.DESPLEGABLE) {
  24. selectCommentTypeForm.classList.remove("hidden");
  25. commentForm.classList.add("hidden");
  26. options.forEach(option => {
  27. const optionElement = document.createElement("button");
  28. optionElement.type = "button";
  29. optionElement.className = "flex items-center gap-2 px-4 py-2 rounded-lg border border-gray-300 hover:bg-gray-50 transition-colors";
  30. optionElement.textContent = option;
  31. // Usamos dataset para guardar el valor, por si es diferente al texto
  32. optionElement.dataset.value = option
  33. selectOptions.appendChild(optionElement);
  34. });
  35. } else {
  36. return; // Tipo no válido
  37. }
  38. modal.classList.remove("hidden");
  39. // 2. Gestionar listeners de forma aislada para ESTA promesa
  40. return new Promise((resolve) => {
  41. // --- Handlers (las funciones que se ejecutarán) ---
  42. const disableEvent = (event) => {
  43. event.preventDefault();
  44. event.stopPropagation();
  45. };
  46. const handleInput = () => {
  47. submitCommentBtn.disabled = commentTextarea.value.trim() === "";
  48. };
  49. const handleSubmit = (event) => {
  50. if (event) event.preventDefault();
  51. cleanup(); // Limpiar todos los listeners
  52. resolve(commentTextarea.value);
  53. };
  54. const handleCancel = () => {
  55. cleanup();
  56. resolve(null);
  57. };
  58. const handleOptionClick = (event) => {
  59. const button = event.target.closest('button');
  60. if (!button) return; // Clic no fue en un botón
  61. cleanup();
  62. resolve(button.dataset.value); // Resolver con el valor del dataset
  63. };
  64. // --- Función de limpieza ---
  65. // Elimina todos los listeners de esta instancia
  66. const cleanup = () => {
  67. modal.classList.add("hidden");
  68. commentTextarea.removeEventListener("input", handleInput);
  69. commentForm.removeEventListener("submit", handleSubmit);
  70. submitCommentBtn.removeEventListener("click", handleSubmit);
  71. cancelCommentBtn.removeEventListener("click", handleCancel);
  72. closeCommentModal.removeEventListener("click", handleCancel);
  73. selectOptions.removeEventListener("click", handleOptionClick);
  74. selectCommentTypeForm.removeEventListener("submit", disableEvent);
  75. commentForm.removeEventListener("submit", disableEvent);
  76. };
  77. // --- Asignar Listeners ---
  78. // Asignamos solo los listeners necesarios para este 'type'
  79. if (type === COMMENT_TYPES.LIBRE) {
  80. commentTextarea.addEventListener("input", handleInput);
  81. commentForm.addEventListener("submit", handleSubmit);
  82. submitCommentBtn.addEventListener("click", handleSubmit);
  83. commentForm.addEventListener("submit", disableEvent);
  84. } else {
  85. // DESPLEGABLE
  86. selectOptions.addEventListener("click", handleOptionClick);
  87. selectCommentTypeForm.removeEventListener("submit", disableEvent);
  88. }
  89. // Listeners de cancelación siempre se asignan
  90. cancelCommentBtn.addEventListener("click", handleCancel);
  91. closeCommentModal.addEventListener("click", handleCancel);
  92. });
  93. }