${esc(lead.company_ar)}
${esc(lead.company_en)}
${lead.fit_score}/${lead.confidence}
${esc(lead.industry || '—')}
${esc(lead.est_size || '—')}
${signals.length ? `
إشارات
${signals.map(s => `- ${esc(s)}
`).join('')}
` : ''}
${dmHints.length ? `
متخذو قرار محتملون
${dmHints.map(s => `- ${esc(s)}
`).join('')}
` : ''}
${openings}
${lead.evidence ? `
لماذا تطابق
${esc(lead.evidence)}
` : ''}
${links.length ? `${links.join(' · ')}
` : ''}
`;
}
function renderResults(data) {
const leads = Array.isArray(data.leads) ? data.leads : [];
countOutEl.textContent = `${leads.length} نتيجة من ${data.count_requested || leads.length} مطلوبة`;
gridEl.innerHTML = leads.map(renderCard).join('');
notesEl.textContent = data.search_notes || '';
resultsEl.hidden = leads.length === 0;
}
async function callApi(path, body) {
const attempt = async (base) => {
const r = await fetch(base + path, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body || {}),
});
return r;
};
try {
const r = await attempt(API_BASE_PRIMARY);
if (r.ok || (r.status >= 400 && r.status < 500)) return r;
// 5xx → try fallback
if (API_BASE_PRIMARY !== API_BASE_FALLBACK) return attempt(API_BASE_FALLBACK);
return r;
} catch (e) {
if (API_BASE_PRIMARY !== API_BASE_FALLBACK) return attempt(API_BASE_FALLBACK);
throw e;
}
}
form.addEventListener('submit', async (ev) => {
ev.preventDefault();
const icp = (icpEl.value || '').trim();
const use_case = useCaseEl.value || 'sales';
const count = parseInt(countEl.value || '10', 10);
if (icp.length < 20) {
setStatus('أضف وصفاً أطول (20 حرف على الأقل) للعميل المثالي.', 'error');
return;
}
submitBtn.disabled = true;
submitBtn.textContent = 'يبحث...';
setStatus('يبحث عن leads مطابقة... (15-45 ثانية)', 'loading');
resultsEl.hidden = true;
try {
const t0 = performance.now();
const r = await callApi('/api/v1/prospect/discover', { icp, use_case, count });
const data = await r.json();
const dt = ((performance.now() - t0) / 1000).toFixed(1);
if (!r.ok) {
const detail = data && data.detail ? data.detail : ('HTTP ' + r.status);
throw new Error(detail);
}
renderResults(data);
setStatus(`اكتمل في ${dt} ثانية`, null);
setTimeout(() => setStatus(''), 3000);
if (window.track) window.track('prospector_run', { use_case, count, returned: (data.leads || []).length });
} catch (err) {
console.error('prospector error', err);
setStatus('حدث خطأ: ' + (err && err.message ? err.message : 'غير معروف') + ' — جرّب مرة ثانية.', 'error');
} finally {
submitBtn.disabled = false;
submitBtn.textContent = 'ابحث الآن';
}
});
// Prefill demo ICP on first load (only if empty)
if (icpEl && !icpEl.value) {
icpEl.setAttribute('data-default-demo',
'شركات SaaS B2B في السعودية بحجم 20-100 موظف، تبيع للشركات المتوسطة، أحد المؤسسين أعلن عن جولة تمويل في آخر 12 شهر.'
);
}
})();