function checkUID(m = "") { const userData = JSON.parse(localStorage.getItem("userData")) || {}; const urlNow = window.location.href; const isNotValidUID = userData.length > 0 && !userData.uid; const message = m === "addToCart" ? "Silakan masuk terlebih dahulu untuk menambahkan produk ke keranjang." : isNotValidUID ? "Sesi Anda telah habis. Silakan masuk kembali untuk melanjutkan." : m === "jelajah" ? "Anda telah menjelajah selama 5 detik. Silakan masuk terlebih dahulu untuk mendapatkan pengalaman yang lebih baik." : null; if ( (Object.keys(userData).length === 0 || isNotValidUID) && !urlNow.includes("profile") ) { localStorage.clear(); window.location.href = `profile.html?redirect=${urlNow}` + (message ? `&message=${message}` : ""); } } setTimeout(() => { checkUID("jelajah"); }, 5000); function formatRupiah(number) { return "Rp " + number.toLocaleString("id-ID"); } async function loadProducts() { const products = await fetchProductsData(); const productList = document.getElementById("product-list"); if (!productList) return; productList.innerHTML = ""; products.forEach((product) => { const col = document.createElement("div"); col.className = "col-lg-3 col-md-4 col-sm-6"; const card = document.createElement("div"); card.className = "card h-100"; let thumbnail = "assets/"; if (product.files && product.files.length > 0) { thumbnail += product.files[0]; } let thumbHTML = ""; if (thumbnail.match(/\.(jpg|jpeg|png|gif)$/i)) { thumbHTML = `${product.name}`; } else { thumbHTML = `${product.name}`; } const cardBody = document.createElement("div"); cardBody.className = "card-body d-flex flex-column"; const title = document.createElement("h5"); title.className = "card-title"; title.innerText = product.name; const desc = document.createElement("p"); desc.className = "card-text"; desc.innerText = product.description; const price = document.createElement("p"); price.className = "card-text fw-bold"; price.innerText = formatRupiah(product.price); const detailLink = document.createElement("a"); detailLink.href = "product.html?id=" + product.id; detailLink.className = "btn btn-primary btn-lg mt-auto"; detailLink.innerText = "Lihat Detail"; const cartBtn = document.createElement("button"); cartBtn.className = "btn btn-success btn-lg mt-2"; cartBtn.innerText = "Tambah Keranjang"; cartBtn.onclick = async function () { await promptQuantityAndAdd(product.id); }; card.innerHTML = thumbHTML; cardBody.appendChild(title); cardBody.appendChild(desc); cardBody.appendChild(price); cardBody.appendChild(detailLink); cardBody.appendChild(cartBtn); card.appendChild(cardBody); col.appendChild(card); productList.appendChild(col); }); } async function loadProductDetail() { const params = new URLSearchParams(window.location.search); const productId = parseInt(params.get("id")); const container = document.getElementById("product-detail"); if (!container) return; if (!productId) { container.innerText = "Produk tidak ditemukan."; return; } const products = await fetchProductsData(); const product = products.find((p) => p.id === productId); if (!product) { container.innerText = "Produk tidak ditemukan."; return; } let carouselHTML = ""; if (product.files && product.files.length > 0) { carouselHTML += ``; } container.innerHTML = `
${carouselHTML}

${product.name}

${product.description}

${formatRupiah(product.price)}

`; AOS.refresh(); } function formatTransactionDate(key) { const parts = key.split("_"); if (parts.length !== 7) return key; const [year, month, day, hour, minute, second, ms] = parts; const dateObj = new Date( year, parseInt(month) - 1, day, hour, minute, second, ms ); const formattedDate = dateObj.toLocaleDateString("id-ID", { day: "2-digit", month: "long", year: "numeric", }); const formattedTime = dateObj.toLocaleTimeString("id-ID", { hour: "2-digit", minute: "2-digit", hour12: false, }); return [formattedDate, formattedTime]; } async function loadTransactions() { const userData = await getUserData() || {transactions: {}}; const transactions = userData.transactions || {}; if (Object.keys(transactions).length === 0) { document.getElementById("transaction-list").innerHTML = "

Anda belum melakukan transaksi apapun. Silahkan beli produk terlebih dahulu.

"; alert("Anda belum melakukan transaksi apapun. Silahkan beli produk terlebih dahulu.", false) return; } const transactionList = document.getElementById("transaction-list"); if (!transactionList) return; transactionList.innerHTML = ""; Object.entries(transactions) .sort((a, b) => { const parseDateFromKey = (key) => { const [year, month, day, hour, minute, second, ms] = key.split("_"); return new Date(year, month - 1, day, hour, minute, second, ms); }; return parseDateFromKey(b[0]) - parseDateFromKey(a[0]); }) .forEach(([transactionKey, transaction]) => { let total = 0; transaction.products.forEach((product) => { total += product.price * product.total; }); let paymentIcon = ""; switch (transaction.payment_method) { case "bank": paymentIcon = "bi-building"; break; case "qr": paymentIcon = "bi-qr-code"; break; case "card": paymentIcon = "bi-credit-card"; break; default: paymentIcon = "bi-currency-dollar"; } const col = document.createElement("div"); col.className = "transactions-body col-lg-4 col-md-6 col-sm-12 mt-4"; const card = document.createElement("div"); card.className = "card h-100"; const cardBody = document.createElement("div"); cardBody.className = "card-body d-flex flex-column"; cardBody.style.position = "relative"; const td = formatTransactionDate(transactionKey); cardBody.innerHTML = `
Metode: ${ transaction.payment_method ? transaction.payment_method : "N/A" }
Total: ${formatRupiah(total)}
Tanggal: ${td[0]}
Waktu: ${td[1]}
`; card.appendChild(cardBody); col.appendChild(card); transactionList.appendChild(col); col.addEventListener( "click", () => (window.location.href = `transaction.html?date=${transactionKey}`) ); }); } let transactionKey; async function updateActionButtonsPosition() { const wrapper = document.querySelector(".receipt-wrapper"); const actionButtons = document.querySelector(".action-buttons"); if (!wrapper || !actionButtons) { console.error("Element tidak ditemukan!"); return; } const receiptHeight = wrapper.getBoundingClientRect().height + 128; actionButtons.setAttribute("style", `top: ${receiptHeight}px !important`); } async function loadTransactionDetail() { const params = new URLSearchParams(window.location.search); const transactionKey = params.get("date"); const detailsContainer = document.getElementById("transaction-details"); const mainElement = document.querySelector("main"); if (!transactionKey) { detailsContainer.innerHTML = "

Transaksi tidak ditemukan.

"; return; } const userData = await getUserData(); if (!userData.transactions || !userData.transactions[transactionKey]) { mainElement.innerHTML = "

Transaksi tidak ditemukan.

"; return; } const transaction = userData.transactions[transactionKey]; const td = formatTransactionDate(transactionKey); let total = 0; transaction.products.forEach((prod) => { total += prod.price * prod.total; }); let html = `

TonS E-Commerce


Sidoarjo

Telp: 0896-6804-1554

Tanggal: ${td[0]} ${td[1]}

`; transaction.products.forEach((prod, index) => { const qty = prod.total; const subtotal = prod.price * qty; html += ` `; }); html += `
No Produk Harga Qty Subtotal
${index + 1} ${prod.name} ${formatRupiah(prod.price)} ${qty} ${formatRupiah(subtotal)}
Total ${formatRupiah(total)}
`; detailsContainer.innerHTML = html; const wrapper = document.createElement("div"); wrapper.className = "receipt-wrapper"; wrapper.innerHTML = detailsContainer.innerHTML; detailsContainer.innerHTML = ""; detailsContainer.appendChild(wrapper); await updateActionButtonsPosition(); window.addEventListener("resize", async () => { requestAnimationFrame(updateActionButtonsPosition); }); } document.addEventListener("DOMContentLoaded", async function () { AOS.init(); if (document.getElementById("product-list")) { loadProducts(); } if (document.getElementById("product-detail")) { loadProductDetail(); } if (document.getElementById("transaction-details")) { await loadTransactionDetail(); await updateActionButtonsPosition(); window.addEventListener("resize", async () => { requestAnimationFrame(updateActionButtonsPosition); }); document .getElementById("download-pdf") .addEventListener("click", async () => { const mainElement = document.getElementById( "transaction-details" ); const receiptWrapperElement = document.querySelector(".receipt-wrapper"); const widthElement = receiptWrapperElement.offsetWidth - receiptWrapperElement.offsetLeft; const heightElement = receiptWrapperElement.offsetHeight - receiptWrapperElement.offsetTop; const params = new URLSearchParams(window.location.search); const transactionKey = params.get("date"); try { await html2pdf() .from(mainElement) .set({ margin: 10, filename: `receipt_${transactionKey}.pdf`, image: { type: "png", quality: 3 }, html2canvas: { scale: 3, useCORS: true }, jsPDF: { unit: "px", format: [widthElement, heightElement], orientation: "portrait", }, }) .toPdf() .save(); } catch (error) { console.error("Error generating PDF:", error); } }); document .getElementById("print-receipt") .addEventListener("click", async () => { const mainElement = document.getElementById( "transaction-details" ); const lastMainElement = mainElement.innerHTML; mainElement.innerHTML += ` `; await printJS("transaction-details", "html"); mainElement.innerHTML = lastMainElement; }); } if (document.getElementById("transaction-list")) { loadTransactions(); } let backButton = document.getElementById("backButton"); if (backButton) { backButton.addEventListener("click", (e) => { e.preventDefault(); window.history.back(); }); } });