async function uploadAndSolve() { if (!selectedFile && !document.getElementById('manualCorrection').value.trim()) { alert("Please upload a file/photo or enter text in the correction box."); return; } const outputPanel = document.getElementById('outputPanel'); // 1. Show Loading UI outputPanel.innerHTML = `

SOLVING EQUATION & GENERATING GRAPH...

(If the server is sleeping, this may take up to 45 seconds...)

`; const formData = new FormData(); if (selectedFile) formData.append('file', selectedFile); formData.append('subject', document.getElementById('subjectSelect').value); formData.append('level', document.getElementById('levelSelect').value); formData.append('mode', document.getElementById('modeSelect').value); formData.append('layout', document.getElementById('layoutSelect').value); formData.append('corrected_text', document.getElementById('manualCorrection').value); // 2. Set Timeout Controller (60 seconds to allow Render cold start) const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 60000); try { const response = await fetch('https://stem-vision-backend.onrender.com/process-image', { method: 'POST', body: formData, signal: controller.signal }); clearTimeout(timeoutId); // Check for HTTP errors (e.g., 500 Server Error, 404 Not Found) if (!response.ok) { throw new Error(`Server status ${response.status}: ${response.statusText}`); } const data = await response.json(); // 3. Render Results if (data.solution_steps && Array.isArray(data.solution_steps)) { outputPanel.innerHTML = data.solution_steps.join(''); await renderMathJaxSafe(outputPanel); if (data.graph_data) { renderGraph(data.graph_data); } } else if (data.error) { outputPanel.innerHTML = `API ERROR

${data.error}

`; } else { outputPanel.innerHTML = 'ERROR PROCESSING REQUEST

No valid solution steps returned from engine.

'; } } catch (err) { clearTimeout(timeoutId); let errorMsg = err.name === 'AbortError' ? 'Request timed out. Render backend took too long to wake up.' : err.message; // Reset UI out of loading state so app isn't stuck outputPanel.innerHTML = ` CONNECTION ERROR

${errorMsg}

Check browser console (F12) for CORS or Network errors.

`; } }