{"repo": "abawe444/carsspacebot", "files": {"public/js/setup.js": {"c9702418341d3f44467d62c6cfbb641187770d98": {"t": 1786067877.6377082, "n": 11598, "h": "213ee605d882fdbb", "c": "let currentStep = 1;\nconst maxStep = 5;\n\nfunction showToast(message, type = 'info') {\n const toast = document.getElementById('toast');\n if (!toast) return;\n toast.textContent = message;\n toast.classList.remove('hidden');\n toast.style.background = type === 'error' ? '#b72626' : type === 'warning' ? '#a8670b' : '#1f6feb';\n setTimeout(() => toast.classList.add('hidden'), 2600);\n}\n\nasync function api(url, options = {}) {\n const response = await fetch(url, {\n headers: { 'Content-Type': 'application/json' },\n ...options\n });\n const data = await response.json().catch(() => ({}));\n if (!response.ok || data.success === false) {\n const error = new Error(data.message || data.error || 'فشل الطلب');\n error.status = response.status;\n error.statusText = response.statusText;\n error.data = data;\n error.details = data?.data || null;\n throw error;\n }\n return data;\n}\n\nfunction formatProviderErrorForUi(error) {\n const details = error?.details || {};\n const status = details.responseStatus || error?.status || '';\n const statusText = details.responseStatusText || error?.statusText || '';\n const rawError = details.error || error?.message || 'تعذر الاتصال بمزود الذكاء';\n const responseData = details.responseData ? JSON.stringify(details.responseData, null, 2) : 'null';\n const friendly = details.error_ar || error?.message || 'تعذر الاتصال بمزود الذكاء';\n\n return {\n friendly,\n full: `السبب: ${friendly}\nHTTP: ${status || '-'} ${statusText || ''}\nBackend: ${rawError}\nResponse: ${responseData}`\n };\n}\n\nfunction setStep(step) {\n currentStep = Math.min(maxStep, Math.max(1, step));\n\n for (let i = 1; i <= maxStep; i += 1) {\n const panel = document.getElementById(`step${i}`);\n panel?.classList.toggle('hidden-step', i !== currentStep);\n }\n\n document.querySelectorAll('.wiz-step').forEach((btn) => {\n btn.classList.toggle('active', Number(btn.getAttribute('data-step')) === currentStep);\n });\n\n document.getElementById('prevStepBtn').disabled = currentStep === 1;\n document.getElementById('nextStepBtn').textContent = currentStep === maxStep ? 'الانتقال للوحة' : 'التالي';\n}\n\nfunction setWhatsappStatus(status) {\n const badge = document.getElementById('setupWhatsappStatus');\n const text = document.getElementById('setupQrStatusText');\n const qrArea = document.getElementById('setupQrArea');\n\n const map = {\n connected: { label: 'متصل وجاهز للرد', cls: 'success' },\n qr: { label: 'بانتظار مسح QR', cls: 'warning' },\n reconnecting: { label: 'إعادة الاتصال', cls: 'warning' },\n disconnected: { label: 'غير متصل بواتساب', cls: 'danger' }\n };\n\n const item = map[status?.status] || map.disconnected;\n if (badge) {\n badge.textContent = item.label;\n badge.className = `status-pill ${item.cls}`;\n }\n if (text) text.textContent = item.label;\n\n if (!qrArea) return;\n if (status?.qr) {\n qrArea.innerHTML = ``;\n } else if (status?.status === 'connected') {\n qrArea.innerHTML = '
${formatted.full}`;\n setProviderStatus(false);\n showToast(formatted.friendly, 'error');\n }\n}\n\nasync function saveAssistant(e) {\n e.preventDefault();\n const payload = serializeForm('setupAssistantForm');\n await api('/api/setup/assistant', { method: 'POST', body: JSON.stringify(payload) });\n showToast('تم حفظ شخصية المساعد');\n}\n\nasync function finishSetup() {\n await api('/api/setup/complete', { method: 'POST' });\n showToast('تم إنهاء الإعداد بنجاح');\n setTimeout(() => {\n window.location.href = '/';\n }, 600);\n}\n\nfunction bindEvents() {\n document.querySelectorAll('.wiz-step').forEach((btn) => {\n btn.addEventListener('click', () => setStep(Number(btn.getAttribute('data-step'))));\n });\n\n document.getElementById('prevStepBtn')?.addEventListener('click', () => setStep(currentStep - 1));\n document.getElementById('nextStepBtn')?.addEventListener('click', () => {\n if (currentStep === maxStep) {\n window.location.href = '/';\n return;\n }\n setStep(currentStep + 1);\n });\n\n document.getElementById('providerSelect')?.addEventListener('change', onProviderChange);\n document.getElementById('setupCompanyForm')?.addEventListener('submit', saveCompany);\n document.getElementById('setupLocationsForm')?.addEventListener('submit', saveLocations);\n document.getElementById('setupProviderForm')?.addEventListener('submit', saveProvider);\n document.getElementById('setupAssistantForm')?.addEventListener('submit', saveAssistant);\n document.getElementById('testProviderBtn')?.addEventListener('click', testProvider);\n document.getElementById('finishSetupBtn')?.addEventListener('click', finishSetup);\n\n document.getElementById('setupReconnectBtn')?.addEventListener('click', async () => {\n await api('/api/connection/restart', { method: 'POST' });\n showToast('جارٍ إعادة الاتصال بواتساب');\n });\n\n document.getElementById('setupResetSessionBtn')?.addEventListener('click', async () => {\n if (!confirm('هل تريد حذف الجلسة الحالية؟')) return;\n await api('/api/session/reset', { method: 'POST' });\n showToast('تم حذف الجلسة');\n });\n}\n\nfunction initSocket() {\n const socket = io();\n socket.on('whatsapp:status', (status) => {\n setWhatsappStatus(status);\n });\n}\n\ndocument.addEventListener('DOMContentLoaded', async () => {\n bindEvents();\n setStep(1);\n initSocket();\n try {\n await loadSetupData();\n } catch (error) {\n showToast(error.message, 'error');\n }\n});\n"}}}}