(function() {
'use strict';
// دریافت تنظیمات از wp_localize_script
const config = {
siteUrl: karmatusData.siteUrl,
ajaxUrl: karmatusData.ajaxUrl,
nonce: karmatusData.nonce,
isMobile: window.innerWidth <= 768
};
let state = { query: '', page: 1, isLoading: false, hasMore: true };
let history = JSON.parse(localStorage.getItem('karmatus_history') || '[]');
const debounce = (func, wait) => {
let timeout;
return function executedFunction(...args) {
const later = () => { clearTimeout(timeout); func(...args); };
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
};
// تزریق فرم جستجو فقط در دسکتاپ
const injectDesktop = () => {
if (!config.isMobile) {
const target = document.querySelector('.dina-search-con');
if (target && !target.querySelector('.dina-search-form')) {
target.innerHTML = `
`;
const deskInput = target.querySelector('.search-input');
if (deskInput) deskInput.addEventListener('input', (e) => handleSearch(e.target.value, true));
}
}
};
const renderHistory = () => {
const box = document.querySelector('.karmatus-history-box');
const items = document.querySelector('.history-items');
if (!history.length) { if (box) box.style.display = 'none'; return; }
if (box) box.style.display = 'block';
if (items) {
items.innerHTML = history.map(t =>
`${t}`
).join('');
}
};
const performSearch = (query, isDesktop, isLoadMore) => {
if (query.length < 2) return;
state.isLoading = true;
const els = {
prodGrid: document.querySelector('.karmatus-products-grid'),
catGrid: document.querySelector('.karmatus-cats-grid'),
loadMore: document.querySelector('.karmatus-load-more-btn'),
msg: document.querySelector('.karmatus-status-msg'),
desktopRes: document.querySelector('.karmatus-desktop-results')
};
if (isLoadMore && els.loadMore) {
els.loadMore.innerText = 'در حال بارگذاری...';
els.loadMore.disabled = true;
} else if (!isDesktop) {
if (state.page === 1 && els.prodGrid) els.prodGrid.innerHTML = `
کاوش در میان ۱۰۰,۰۰۰+ محصول...
`;
if (els.msg) els.msg.style.display = 'none';
} else if (isDesktop && els.desktopRes) {
els.desktopRes.classList.add('active');
els.desktopRes.innerHTML = ``;
}
const params = new URLSearchParams();
params.append('action', 'karmatus_search_load');
params.append('query', query);
params.append('page', state.page);
params.append('nonce', config.nonce);
fetch(config.ajaxUrl, {
method: 'POST',
body: params
})
.then(res => res.json())
.then(data => {
state.isLoading = false;
if (!isDesktop) {
if (state.page === 1) els.prodGrid.innerHTML = '';
if (state.page === 1 && data.categories.length && els.catGrid) {
els.catGrid.innerHTML = data.categories.map(c =>
`
${c.name}
${c.type}`
).join('');
}
if (data.products.length && els.prodGrid) {
const productsHTML = data.products.map(p =>
`
`
).join('');
els.prodGrid.insertAdjacentHTML('beforeend', productsHTML);
}
if (els.loadMore) {
state.hasMore = (state.page < data.max_pages);
els.loadMore.style.display = state.hasMore ? 'block' : 'none';
els.loadMore.innerText = 'نمایش نتایج بیشتر';
els.loadMore.disabled = false;
}
if (state.page === 1 && !data.products.length && !data.categories.length && els.msg) {
els.msg.style.display = 'block';
els.msg.innerText = 'هیچ نتیجهای یافت نشد.';
}
if (state.page === 1 && (data.products.length || data.categories.length)) {
history = history.filter(h => h !== query);
history.unshift(query);
history = history.slice(0, 6);
localStorage.setItem('karmatus_history', JSON.stringify(history));
}
} else {
let html = '';
if (data.categories.length) {
html += `دستهبندی و کالکشنها
`;
html += data.categories.map(c => `${c.name} ${c.type}`).join('');
}
if (data.products.length) {
html += `محصولات
`;
html += data.products.map(p =>
`
`
).join('');
html += `مشاهده همه نتایج`;
}
els.desktopRes.innerHTML = html || 'نتیجهای یافت نشد.
';
}
})
.catch(err => {
console.error(err);
state.isLoading = false;
});
};
const handleSearch = debounce((query, isDesktop) => {
state.query = query;
state.page = 1;
state.hasMore = true;
if (!isDesktop) {
const pGrid = document.querySelector('.karmatus-products-grid');
const cGrid = document.querySelector('.karmatus-cats-grid');
if (pGrid) pGrid.innerHTML = '';
if (cGrid) cGrid.innerHTML = '';
document.querySelector('.karmatus-load-more-btn').style.display = 'none';
}
performSearch(query, isDesktop, false);
}, 600);
document.addEventListener("DOMContentLoaded", function() {
injectDesktop();
document.body.addEventListener('click', function(e) {
if (e.target.closest('.karmatus-glass-bar')) {
document.querySelector('.karmatus-search-overlay').classList.add('active');
document.querySelector('.karmatus-search-page').classList.add('active');
renderHistory();
setTimeout(() => document.querySelector('.karmatus-real-input').focus(), 300);
}
if (e.target.closest('.karmatus-search-back')) {
document.querySelector('.karmatus-search-page').classList.remove('active');
setTimeout(() => document.querySelector('.karmatus-search-overlay').classList.remove('active'), 300);
}
if (e.target.classList.contains('hist-item')) {
const term = e.target.dataset.term;
document.querySelector('.karmatus-real-input').value = term;
handleSearch(term, false);
}
if (e.target.classList.contains('clear-history')) {
history = [];
localStorage.setItem('karmatus_history', '[]');
renderHistory();
}
if (e.target.classList.contains('karmatus-load-more-btn')) {
if (!state.isLoading && state.hasMore) {
state.page++;
performSearch(state.query, false, true);
}
}
if (config.isMobile === false && !e.target.closest('.dina-search-con')) {
const res = document.querySelector('.karmatus-desktop-results');
if (res) res.classList.remove('active');
}
});
const mobInput = document.querySelector('.karmatus-real-input');
if (mobInput) mobInput.addEventListener('input', (e) => handleSearch(e.target.value, false));
});
})();