`;
}
// Right column: Trending products
if (products && products.length > 0) {
html += `
⭐Produk Populer
`;
html += products.map((p, idx) => {
return `
${esc(p.name)}
${esc(p.price_label)}
`;
}).join('');
html += `
`;
}
html += `
`;
suggest.innerHTML = html;
suggest.hidden = false;
suggest.classList.add('open', 'trending-mode');
suggest.style.display = 'block';
console.log('[Trending] Rendered', trends?.length || 0, 'searches and', products?.length || 0, 'products');
}
function trackSearchClick(query, productId) {
fetch('/api/track_search_click.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: query,
product_id: productId,
click_type: 'suggestion'
})
}).catch(() => {}); // silent fail
}
function trackTrendingClick(query) {
fetch('/api/track_search_click.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: query,
click_type: 'trending'
})
}).catch(() => {});
}
function trackTrendingProductClick(productId, query) {
fetch('/api/track_search_click.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: query || 'trending_product',
product_id: productId,
click_type: 'trending_product'
})
}).catch(() => {});
}
function trackSearchSubmit(query) {
fetch('/api/track_search_click.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
query: query,
click_type: 'submit'
})
}).catch(() => {});
}
function logFinalSearch(query) {
// Log the final search to analytics (not during typing)
fetch('/api/search_products.php?q=' + encodeURIComponent(query) + '&log=1', {
headers: { 'Accept': 'application/json' }
}).catch(() => {});
}
// ==================== END TRENDING FUNCTIONS ====================
function clearSuggest(){
suggest.innerHTML = '';
suggest.hidden = true;
suggest.classList.remove('open', 'trending-mode');
currentIndex = -1;
}
// AI Toggle Handler
aiToggleBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
isAIModeEnabled = !isAIModeEnabled;
if (isAIModeEnabled) {
aiToggleBtn.classList.add('active');
localStorage.setItem('plazait_ai_search_mode', 'enabled');
updatePlaceholder(); // Update placeholder text
stopTypingAnimation(); // Stop typing animation in AI mode
// Show AI prompt if there's a query
const query = searchInput.value.trim();
if (query.length >= MIN_LEN) {
showAISearchPrompt(query);
} else {
showAIActivationMessage();
}
} else {
aiToggleBtn.classList.remove('active');
localStorage.setItem('plazait_ai_search_mode', 'disabled');
updatePlaceholder(); // Update placeholder text
startTypingAnimation(); // Start typing animation in normal mode
clearSuggest();
// Switch to normal search if there's a query
const query = searchInput.value.trim();
if (query.length >= MIN_LEN) {
performSearch(query);
}
}
});
function showAIActivationMessage() {
suggest.innerHTML = `
✨
AI Search Mode Activated!
Ketik query Anda untuk pencarian cerdas
`;
suggest.hidden = false;
suggest.classList.add('open');
suggest.style.display = 'block';
}
function renderAIInsights(insights){
if (!insights) return '';
// Generate AI summary via backend endpoint
const summary = insights.ai_summary || generateAISummary(insights);
if (!summary) return '';
return `
✨
AI Assistant
${summary}
`;
}
function generateAISummary(insights) {
// Fallback client-side summary generation if backend doesn't provide ai_summary
const productName = insights.product_name || '';
const categoryPath = insights.category_path || '';
const priceRange = insights.price_range || {};
const intent = insights.intent || '';
let summary = '';
// Parse category for natural display
let categoryDisplay = '';
if (categoryPath) {
const categoryParts = categoryPath.split('/');
categoryDisplay = categoryParts[categoryParts.length - 1] || categoryParts[categoryParts.length - 2] || categoryPath;
}
// Intent-based opening
if (intent === 'cek_stok') {
summary = `Berikut ketersediaan stok untuk ${esc(productName)}. `;
} else if (intent === 'rekomendasi_produk') {
summary = `Berikut rekomendasi produk ${esc(categoryDisplay || productName)} yang kami pilihkan untuk Anda. `;
} else {
// Default: cari_harga or general
if (productName && categoryDisplay) {
summary = `Kami menemukan ${esc(productName)} di kategori ${esc(categoryDisplay)}`;
} else if (productName) {
summary = `Kami menemukan produk ${esc(productName)}`;
} else if (categoryDisplay) {
summary = `Kami menemukan produk ${esc(categoryDisplay)}`;
}
// Add price context
if (priceRange.min > 0 && priceRange.max > 0) {
const minPrice = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(priceRange.min);
const maxPrice = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(priceRange.max);
summary += ` dengan kisaran harga ${minPrice} - ${maxPrice}`;
} else if (priceRange.min > 0) {
const minPrice = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(priceRange.min);
summary += ` dengan harga mulai ${minPrice}`;
} else if (priceRange.max > 0) {
const maxPrice = new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(priceRange.max);
summary += ` dengan harga maksimal ${maxPrice}`;
}
summary += ' yang sesuai dengan kebutuhan Anda.';
}
return summary || esc(insights.explanation || '');
}
function showAIProgressSteps() {
return `
🤖
AI sedang menganalisis...
Memproses query Anda dengan kecerdasan buatan
1
Memahami maksud pencarian...
2
Mengekstrak parameter pencarian...
3
Mencari produk yang relevan...
`;
}
function updateAIProgressStep(step) {
const steps = suggest.querySelectorAll('.ai-progress-step');
steps.forEach((stepEl, idx) => {
const icon = stepEl.querySelector('.ai-step-icon');
if (idx < step) {
stepEl.classList.remove('active', 'pending');
stepEl.classList.add('completed');
icon.textContent = '✓';
} else if (idx === step) {
stepEl.classList.remove('pending', 'completed');
stepEl.classList.add('active');
}
});
}
function renderSuggest(items, aiInsights){
if (!items.length){
clearSuggest();
return;
}
let html = '';
// Show AI insights if available
if (aiInsights && aiInsights.explanation) {
html += renderAIInsights(aiInsights);
}
// Section header for products with hint
html += `