import {utilites} from "../utilities";
import {$, doc, pageInit} from "../base";
import {
cartDispose,
getCart,
priceTax,
priceTotal,
removeProductFromCart,
setProductCount,
updatePricesFromApi,
} from "../cart-core";
import {getCounterControl} from "../components";
import {strings} from "../i10n.ts";
import {submitOrder} from "../api/order-api";
import "bootstrap/js/dist/tab";
const inputName = $("#input-name");
const inputEmail = $("#input-email");
const inputPhone = $("#input-phone");
const inputComment = $("#input-comment");
const invoiceMail = $("#invoice-mail");
const orderSummaryWrapper = $("#order-summary-wrapper");
const submitOrderWrapper = $("#submit-order-wrapper");
const orderSummaryLoader = $("#order-summary-spinner");
const total = $("#total-wrapper");
function setOrderSummaryLoaderVisibility(show = false) {
if (show) {
orderSummaryWrapper.classList.add("d-none");
orderSummaryLoader.classList.remove("d-none");
} else {
orderSummaryWrapper.classList.remove("d-none");
orderSummaryLoader.classList.add("d-none");
}
}
function renderOverview() {
setOrderSummaryLoaderVisibility(true);
const cartData = getCart();
if (utilites.array.isEmpty(cartData)) {
const noItemsAlert = doc.createElement("div");
noItemsAlert.className = "alert alert-primary";
noItemsAlert.innerHTML = `${strings.languageSpesific.the_shopping_bag_is_empty}, ${strings.languageSpesific.go_to} /produktar ${strings.languageSpesific.to_add_LC}`;
orderSummaryWrapper.appendChild(noItemsAlert);
setOrderSummaryLoaderVisibility(false);
orderSummaryWrapper.querySelector("table").classList.add("d-none");
total.classList.add("d-none");
submitOrderWrapper.classList.add("d-none");
return;
}
const tbody = orderSummaryWrapper.querySelector("tbody");
tbody.innerHTML = "";
for (const product of cartData)
tbody.appendChild(getProductTableRow(product));
updateTotal();
setOrderSummaryLoaderVisibility(false);
}
function updateTotal() {
total.querySelector("#total-sum").innerText = priceTotal();
total.querySelector("#total-tax").innerText = priceTax();
}
function getProductTableRow(product) {
const row = doc.createElement("tr");
const productCell = doc.createElement("td");
productCell.innerText = product.name;
const priceTotalCell = doc.createElement("td");
priceTotalCell.innerText = (product.price * product.count).toFixed(2) + ",-";
const countCell = doc.createElement("td");
const counterControl = getCounterControl({
initialCount: product.count,
min: "0",
max: product.maxCount,
onChange: (e) => {
const newCount = parseInt(e.target.value);
if (newCount === 0) {
removeProductFromCart(product.id, (updatedCart) => {
if (updatedCart.length >= 1) {
row.remove();
updateTotal();
} else {
renderOverview();
}
});
return;
}
setProductCount(product.id, newCount);
priceTotalCell.innerText = (product.price * newCount).toFixed(2) + ",-";
updateTotal();
},
});
counterControl.style.height = "30px";
countCell.appendChild(counterControl);
const priceCell = doc.createElement("td");
priceCell.innerText = product.readablePrice;
row.appendChild(productCell);
row.appendChild(countCell);
row.appendChild(priceCell);
row.appendChild(priceTotalCell);
return row;
}
function getOrderPayload() {
const payload = {
comment: inputComment.value,
contactInfo: {
name: inputName.value,
emailAddress: inputEmail.value,
phoneNumber: inputPhone.value,
},
products: [],
};
const cartData = getCart();
if (utilites.array.isEmpty(cartData)) return undefined;
for (const item of cartData) {
if (payload.products.findIndex(c => c.id === item.id) !== -1) continue;
payload.products.push({
id: item.id,
numberOfItems: item.count,
});
}
return payload;
}
function isSubmitOrderFormValid() {
return (
inputName.value &&
inputEmail.value &&
inputPhone.value &&
$("#vipps-terms-confirm").checked || $("#invoice-terms-confirm").checked
);
}
function submitOrderForm(type) {
if (isSubmitOrderFormValid()) {
const payload = getOrderPayload();
if (payload === undefined) return;
payload.paymentType = type;
$("#submit-order-form").classList.add("loading");
$("#form-errors").classList.add("d-none");
$("#form-errors").innerHTML = "";
submitOrder(payload).then(res => {
if (res.ok) {
res.text().then(continueTo => {
window.location.replace(continueTo.replaceAll("\"", ""));
});
} else {
console.log(res.headers.get("Content-Type"));
if (res.headers.get("Content-Type")?.startsWith("application/json")) {
res.json().then(errorJson => {
if (errorJson.isValid === false) {
errorJson = utilites.resolveReferences(errorJson);
for (const error of errorJson.errors) {
if (error.id == null) {
const listItem = doc.createElement("li");
if (error.errors.length === 1) {
listItem.innerText = error.errors[0];
} else {
let html;
for (const itemError of error.errors) {
html += itemError + "
";
}
listItem.innerHTML = html;
}
$("#form-errors").appendChild(listItem);
} else {
const cartproducts = getCart();
const errorProduct = cartproducts.find(c => c.id === error.id);
const listItem = doc.createElement("li");
if (error.errors.length === 1) {
listItem.innerHTML = `${errorProduct.name}: ${error.errors[0]}`;
} else {
let html = "";
for (const itemError of error.errors) {
html += `${errorProduct.name}: ${itemError}
`;
}
listItem.innerHTML = html;
}
$("#form-errors").appendChild(listItem);
}
}
$("#form-errors").classList.remove("d-none");
$("#submit-order-form").classList.remove("loading");
} else {
utilites.handleError(res, {
title: strings.languageSpesific.an_unknown_error_occured,
message: strings.languageSpesific.try_again_soon,
});
$("#submit-order-form").classList.remove("loading");
}
});
} else {
utilites.handleError(res, {
title: strings.languageSpesific.an_unknown_error_occured,
message: strings.languageSpesific.try_again_soon,
});
$("#submit-order-form").classList.remove("loading");
}
}
})
.catch(err => {
console.error(err);
});
}
}
window.disposeCart = () => {
cartDispose();
location.href = "/";
};
function handleCallbackError() {
const urlParams = new URLSearchParams(window.location.search);
const error = urlParams.get("error");
console.log(error);
switch (error) {
case "cancelled":
$("#order-alert").classList.remove("d-none");
$("#order-alert").innerHTML = "Din bestilling er kansellert! Klikk her for å slette handlekorgen";
break;
case "failed":
$("#order-alert").classList.remove("d-none");
$("#order-alert").innerHTML = "Bestillingen feilet, venlegst prøv igjen eller ta kontakt med oss hvis problemet vedvarer!";
break;
}
urlParams.delete("error");
}
if (location.pathname.startsWith("/handlekorg")) {
pageInit(() => {
updatePricesFromApi().then(() => {
$(".submit-vipps").addEventListener("click", () => submitOrderForm(0));
$(".submit-invoice").addEventListener("click", () => submitOrderForm(1));
inputEmail.addEventListener("keyup", (e) => {
if (utilites.validators.isEmail(e.target.value)) {
invoiceMail.innerText = e.target.value;
} else {
invoiceMail.innerText = "din e-postadresse";
}
});
renderOverview();
});
handleCallbackError();
});
}