132 lines
5.0 KiB
JavaScript
132 lines
5.0 KiB
JavaScript
// script.js
|
||
const searchBtn = document.getElementById("searchBtn");
|
||
const queryInput = document.getElementById("query");
|
||
const resultsDiv = document.getElementById("results");
|
||
|
||
// تابع دانلود عکس از URL
|
||
function downloadImage(url, filename = 'product.jpg') {
|
||
// اطمینان از اینکه URL معتبر است
|
||
if (!url || url.startsWith('data:') || url.startsWith('blob:')) {
|
||
// اگر URL دیتای داخلی است، مستقیم دانلود میشود
|
||
const a = document.createElement('a');
|
||
a.href = url;
|
||
a.download = filename;
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
document.body.removeChild(a);
|
||
return;
|
||
}
|
||
|
||
// برای URLهای خارجی: با fetch دانلود و به عنوان blob دانلود
|
||
fetch(url)
|
||
.then(response => {
|
||
if (!response.ok) throw new Error('Network response was not ok');
|
||
return response.blob();
|
||
})
|
||
.then(blob => {
|
||
const blobUrl = window.URL.createObjectURL(blob);
|
||
const a = document.createElement('a');
|
||
a.href = blobUrl;
|
||
a.download = filename;
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
window.URL.revokeObjectURL(blobUrl);
|
||
document.body.removeChild(a);
|
||
})
|
||
.catch(err => {
|
||
console.error('Failed to download image:', err);
|
||
alert('در حال حاضر امکان دانلود این تصویر وجود ندارد.');
|
||
});
|
||
}
|
||
|
||
searchBtn.addEventListener("click", async () => {
|
||
const q = queryInput.value.trim();
|
||
if (!q) return alert("لطفاً یک نام محصول وارد کنید");
|
||
|
||
resultsDiv.innerHTML = "<p class='text-center'>در حال بارگذاری...</p>";
|
||
|
||
try {
|
||
const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`);
|
||
const data = await res.json();
|
||
|
||
const hasResults = data.basalam?.length > 0 ||
|
||
data.torob?.length > 0 ||
|
||
data.digikala?.length > 0;
|
||
|
||
if (!hasResults) {
|
||
resultsDiv.innerHTML = "<p class='text-center'>هیچ نتیجهای یافت نشد</p>";
|
||
return;
|
||
}
|
||
|
||
resultsDiv.innerHTML = "";
|
||
|
||
const allItems = [
|
||
...data.basalam.map(item => ({...item, source: 'باسلام'})),
|
||
...data.torob.map(item => ({...item, source: 'ترب'})),
|
||
...data.digikala.map(item => ({...item, source: 'دیجیکالا'}))
|
||
];
|
||
|
||
if (allItems.length === 0) {
|
||
resultsDiv.innerHTML = "<p class='text-center'>هیچ نتیجهای یافت نشد</p>";
|
||
return;
|
||
}
|
||
|
||
allItems.forEach(item => {
|
||
const col = document.createElement("div");
|
||
col.className = "col";
|
||
|
||
const card = document.createElement("div");
|
||
card.className = "card h-100";
|
||
|
||
const title = item.title || item.name || "بدون عنوان";
|
||
const price = item.price !== undefined && item.price !== null ?
|
||
(typeof item.price === 'object' ?
|
||
(item.price.value || JSON.stringify(item.price)) :
|
||
item.price) :
|
||
"—";
|
||
const image = (item.image || "https://via.placeholder.com/150").trim();
|
||
|
||
card.innerHTML = `
|
||
<img src="${image}" class="card-img-top product-image" alt="${title}" data-url="${image}">
|
||
<div class="card-body d-flex flex-column">
|
||
<h5 class="card-title name">${title}</h5>
|
||
<p class="card-text price">${price}</p>
|
||
<small class="source">منبع: ${item.source}</small>
|
||
</div>
|
||
`;
|
||
|
||
// روی بقیه کارت (نه عکس) کلیک = باز کردن لینک
|
||
card.addEventListener('click', (e) => {
|
||
// اگر کلیک روی عکس بود، جلوی انتشار event را بگیر
|
||
if (e.target.closest('.product-image')) {
|
||
return;
|
||
}
|
||
if (item.link) {
|
||
window.open(item.link, '_blank');
|
||
}
|
||
});
|
||
|
||
// روی عکس کلیک = دانلود
|
||
const imgElement = card.querySelector('.product-image');
|
||
imgElement.addEventListener('click', (e) => {
|
||
e.stopPropagation(); // جلوگیری از باز شدن لینک
|
||
const cleanUrl = imgElement.src;
|
||
const filename = `product_${item.source}_${Date.now()}.jpg`;
|
||
downloadImage(cleanUrl, filename);
|
||
});
|
||
|
||
col.appendChild(card);
|
||
resultsDiv.appendChild(col);
|
||
});
|
||
} catch (err) {
|
||
console.error(err);
|
||
resultsDiv.innerHTML = "<p class='text-center text-danger'>خطا در دریافت دادهها</p>";
|
||
}
|
||
});
|
||
|
||
// Allow Enter key
|
||
queryInput.addEventListener('keypress', (e) => {
|
||
if (e.key === 'Enter') {
|
||
searchBtn.click();
|
||
}
|
||
}); |