let questions = null; // Auto-detect API base URL const getApiBase = () => { const protocol = window.location.protocol; const hostname = window.location.hostname; // If running on localhost, assume backend is on port 3001 if (hostname === 'localhost' || hostname === '127.0.0.1') { return `${protocol}//${hostname}:3001`; } // For production, assume backend is on same origin return "https://fizika-backend.schmelczer.dev" }; const API_BASE = getApiBase(); const loadQuestions = async ( isSearch, categories, sourceScheme, questionCount ) => { if (questions === null) { try { const response = await fetch(`${API_BASE}/api/fizika`); if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`); } questions = await response.json(); console.log('Questions loaded from backend API'); } catch (error) { console.warn('Failed to load questions from API, falling back to local file:', error); try { const fallbackResponse = await fetch("fizika.json"); if (!fallbackResponse.ok) { throw new Error(`Local file not available: ${fallbackResponse.status}`); } questions = await fallbackResponse.json(); console.log('Questions loaded from local fallback file'); } catch (fallbackError) { console.error('Both API and local file failed:', fallbackError); throw new Error('Unable to load quiz data from either backend API or local file'); } } } let currentQuestions = questions.slice(); if (isSearch) { currentQuestions = currentQuestions.filter((q) => q.source.match(sourceScheme) ); } else { shuffleArray(currentQuestions); currentQuestions = currentQuestions.filter((q) => categories.includes(q.type) ); } resultHtml = ""; currentQuestions = currentQuestions.slice(0, questionCount); currentQuestions.forEach( ({ id, source, description, a, b, c, d, correct, image }, i) => { resultHtml += `
${description}
${image ? `