product-WJ64SBTW.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // static/js/cart.js
  2. async function updateCart(form) {
  3. const formData = new FormData(form);
  4. const res = await fetch("/checkout?js=true", {
  5. method: "POST",
  6. body: formData
  7. });
  8. if (res.ok) {
  9. return res.json();
  10. } else {
  11. return { status: res.status, error: res.statusText };
  12. }
  13. }
  14. function updateCartIcon(data) {
  15. const cart_icon = document.querySelector(".cart-icon");
  16. if (cart_icon.length !== null) {
  17. let cart_icon_amount_list = cart_icon.querySelector(".cart-icon--amount");
  18. if (cart_icon_amount_list.length !== null) {
  19. cart_icon_amount_list.innerText = data.cart_breakdown.item_amount;
  20. }
  21. cart_icon.dataset.status = "busy";
  22. cart_icon.style.color = "#FF7070";
  23. cart_icon.style.textDecorationColor = "#FF7070";
  24. setTimeout(() => {
  25. cart_icon.dataset.status = "free";
  26. cart_icon.style.color = "#fff";
  27. cart_icon.style.textDecorationColor = "#fff";
  28. }, "2000");
  29. }
  30. }
  31. function displayProductSelectable(btnSubmit, isProductSelectable, isProductAvailable) {
  32. console.log("displayProductSelectable called with:", { isProductSelectable, isProductAvailable, btnSubmit, value: btnSubmit && btnSubmit.value });
  33. if (!btnSubmit) {
  34. return;
  35. }
  36. btnSubmit.classList.remove(
  37. "btn-product-available",
  38. "btn-product-unselectable",
  39. "btn-product-soldout"
  40. );
  41. if (!isProductAvailable || !isProductSelectable) {
  42. btnSubmit.setAttribute("disabled", "disabled");
  43. btnSubmit.classList.add("btn-product-soldout");
  44. btnSubmit.value = "sold out";
  45. } else {
  46. btnSubmit.removeAttribute("disabled");
  47. btnSubmit.classList.add("btn-product-available");
  48. btnSubmit.value = "add to cart";
  49. }
  50. }
  51. function updateProductURL(product_selected) {
  52. if ("URLSearchParams" in window) {
  53. const searchParams = new URLSearchParams(product_selected);
  54. history.pushState(null, "", "?".concat(searchParams.toString()));
  55. }
  56. }
  57. // static/js/product.js
  58. async function processForm(form) {
  59. form.addEventListener("submit", async (e) => {
  60. e.preventDefault();
  61. const data = await updateCart(form);
  62. console.log("AJAX response from /checkout:", data);
  63. updateCartIcon(data);
  64. const btnSubmit = form.querySelector(".btn-submit");
  65. const isProductSelectable = data.is_product_selectable;
  66. const isProductAvailable = data.is_product_available;
  67. displayProductSelectable(btnSubmit, isProductSelectable, isProductAvailable);
  68. console.log("displayProductSelectable called with:", isProductSelectable, isProductAvailable);
  69. updateProductURL(data.product_selected);
  70. });
  71. }
  72. async function checkProductAvailability(product_path, searchParams) {
  73. const res = await fetch("/".concat(product_path, "?js=true&").concat(searchParams.toString()));
  74. if (res.ok) {
  75. return res.json();
  76. } else {
  77. return { status: res.status, error: res.statusText };
  78. }
  79. }
  80. async function changeProductURLOnInputRadio(form) {
  81. const inputs = Array.from(form.querySelectorAll(".input-listen"));
  82. await Promise.all(inputs.map(async (input) => {
  83. input.addEventListener("change", async (e) => {
  84. let key = e.target.name;
  85. let value = e.target.value;
  86. if ("URLSearchParams" in window) {
  87. const product_path = form.querySelector("#product_path").value;
  88. const searchParams = new URLSearchParams(window.location.search);
  89. searchParams.set(key, value);
  90. let size = searchParams.get("size");
  91. let style = searchParams.get("style");
  92. if (size || style) {
  93. const data = await checkProductAvailability(product_path, searchParams);
  94. const btnSubmit = form.querySelector(".btn-submit");
  95. const isProductSelectable = data.is_product_selectable;
  96. const isProductAvailable = data.is_product_available;
  97. displayProductSelectable(btnSubmit, isProductSelectable, isProductAvailable);
  98. }
  99. history.pushState(null, "", "?".concat(searchParams.toString()));
  100. }
  101. ;
  102. });
  103. }));
  104. }
  105. window.addEventListener("load", () => {
  106. ;
  107. (async () => {
  108. const forms = Array.from(document.querySelectorAll(".product-item"));
  109. await Promise.all(forms.map(async (form) => {
  110. processForm(form);
  111. changeProductURLOnInputRadio(form);
  112. }));
  113. })();
  114. });