// resources/js/composables/usePrintStruk.js
import { computed, nextTick } from "vue";
export function usePrintStruk(
transaksi,
itemsWithMinimal,
formatDate,
formatNumber
) {
const handlePrint = async () => {
const printWindow = window.open("", "_blank", "width=900,height=600");
// Filter item yang valid
const items = itemsWithMinimal.value.filter((i) => i.harga_deal > 0);
const imageUrls = items
.map((i) => i.produk?.foto?.[0]?.url)
.filter(Boolean);
// 1. Kompresi & encode semua gambar ke base64 (40x40, JPEG 80%)
const compressedImages = await Promise.all(
imageUrls.map((url) => compressImageToBase64(url, 40, 40, 0.8))
);
// Ganti URL dengan base64 (fallback ke placeholder jika gagal)
const imageMap = {};
imageUrls.forEach((url, i) => {
imageMap[url] =
compressedImages[i] ||
"https://via.placeholder.com/40x40?text=No+Img";
});
const item = itemsWithMinimal.value[0]
const imgSrc = imageMap[item.produk?.foto?.[0]?.url] || 'https://via.placeholder.com/100x100?text=No+Img'
const printContent = `
Struk #${transaksi.value.kode_transaksi || 'N/A'}
${escapeHtml(transaksi.value.kode_transaksi || 'N/A')}
${formatDate(transaksi.value.created_at)}
${escapeHtml(transaksi.value.nama_pembeli || '-')}
${escapeHtml(transaksi.value.alamat || '-')}
${escapeHtml(transaksi.value.no_hp || '-')}
1
${escapeHtml(item.produk?.nama || '')}
${escapeHtml(item.posisi_asal || 'Brankas')}
${item.produk?.berat ? formatNumber(item.produk.berat)+'g' : ''}
${item.produk?.kadar ? item.produk.kadar+'k' : ''}
Rp${formatNumber(item.harga_deal)}
${escapeHtml(transaksi.value.nama_sales || '-')}
${(transaksi.value.ongkos_bikin||0).toLocaleString()},-
${(transaksi.value.total_harga||0).toLocaleString()},-
`;
printWindow.document.write(printContent);
printWindow.document.close();
printWindow.onload = () => {
setTimeout(() => {
printWindow.focus();
printWindow.print();
printWindow.close();
}, 300);
};
};
return { handlePrint };
}
// === Helper: Kompresi Gambar ke Base64 ===
async function compressImageToBase64(url, width, height, quality = 0.8) {
return new Promise((resolve) => {
const img = new Image();
img.crossOrigin = "anonymous";
img.onload = () => {
const canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
const base64 = canvas.toDataURL("image/jpeg", quality);
resolve(base64);
};
img.onerror = () => resolve(null);
img.src = url + (url.includes("?") ? "&" : "?") + "t=" + Date.now();
});
}
function escapeHtml(text) {
if (!text) return "";
const div = document.createElement("div");
div.textContent = text;
return div.innerHTML;
}