let conversation = [ { role: 'bot', message: 'Hi there! I\'m Chef Bot! May I know your name?' } ]; let selectedIngredients = []; let currentStep = 'name'; // Track conversation step: 'name', 'dietary', 'ingredients', 'recipes' function addMessage(role, message) { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) { console.error('Chat messages container not found!'); return; } const messageDiv = document.createElement('div'); messageDiv.className = role === 'bot' ? 'bot-message' : 'user-message'; messageDiv.textContent = message; chatMessages.appendChild(messageDiv); chatMessages.scrollTop = chatMessages.scrollHeight; console.log(`Added ${role} message: ${message}`); } function sendMessage() { const userInput = document.getElementById('userInput'); if (!userInput) { console.error('User input field not found!'); return; } const message = userInput.value.trim(); if (message) { addMessage('user', message); conversation.push({ role: 'user', message: message }); userInput.value = ''; setTimeout(() => { handleResponse(message); }, 500); } else { console.warn('Empty message!'); } } function handleResponse(userInput) { const lastMessage = conversation[conversation.length - 1].message.toLowerCase(); let botResponse = ''; let options = []; if (currentStep === 'name' && conversation.length === 2) { currentStep = 'dietary'; botResponse = `Nice to meet you, ${userInput}! 😊 Let's create your perfect meal! What type of food would you prefer?`; options = [ { text: 'Vegetarian', class: 'green' }, { text: 'Non-Vegetarian', class: 'red' } ]; } else if (currentStep === 'dietary' && (lastMessage.includes('vegetarian') || lastMessage.includes('non-vegetarian'))) { currentStep = 'ingredients'; botResponse = 'Great choice! 🍽️ Please select your ingredients from the list below.'; } else if (currentStep === 'ingredients' && selectedIngredients.length > 0) { // Wait for "Send" button return; } else if (currentStep === 'recipes') { if (lastMessage.includes('back')) { if (conversation.length > 2) { conversation.pop(); // Remove 'back' const prevMessage = conversation[conversation.length - 1].message.toLowerCase(); if (prevMessage.includes('vegetarian') || prevMessage.includes('non-vegetarian')) { currentStep = 'dietary'; selectedIngredients = []; chatMessages.innerHTML = ''; conversation.forEach(msg => addMessage(msg.role, msg.message)); handleResponse(prevMessage); return; } else if (prevMessage.includes('send')) { currentStep = 'ingredients'; chatMessages.innerHTML = ''; conversation.forEach(msg => addMessage(msg.role, msg.message)); displaySelectedIngredients(); addSendButton(); return; } } } } addMessage('bot', botResponse); if (options.length > 0) { displayOptions(options); } else if (currentStep === 'ingredients') { fetchIngredients(lastMessage); } else if (currentStep === 'recipes') { displayBackButton(); // Ensure back button is available } } function fetchIngredients(dietaryPreference) { fetch('/get_ingredients', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ dietary_preference: dietaryPreference }) }) .then(response => response.json()) .then(data => { if (data.error) { addMessage('bot', `Sorry, there was an error fetching ingredients: ${data.error}`); } else { const ingredients = data.ingredients || []; addMessage('bot', 'Great choice! These are available ingredients:'); displayIngredientsList(ingredients); } }) .catch(error => { addMessage('bot', `Error: Unable to connect to the ingredient database. ${error.message}`); }); } function displayIngredientsList(ingredients) { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) { console.error('Chat messages container not found for ingredients!'); return; } let ingredientsList = document.querySelector('.ingredients-list'); if (!ingredientsList) { ingredientsList = document.createElement('div'); ingredientsList.className = 'ingredients-list'; chatMessages.appendChild(ingredientsList); } else { ingredientsList.innerHTML = ''; } ingredients.forEach(ingredient => { const item = document.createElement('div'); item.className = 'ingredient-item'; const img = document.createElement('img'); img.src = ingredient.image_url || 'https://via.placeholder.com/80'; img.alt = ingredient.name; const name = document.createElement('div'); name.textContent = ingredient.name; name.style.textAlign = 'center'; name.style.marginTop = '5px'; name.style.fontSize = '12px'; const button = document.createElement('button'); button.textContent = 'Add'; button.onclick = () => { if (!selectedIngredients.some(item => item.name === ingredient.name)) { selectedIngredients.push(ingredient); displaySelectedIngredients(); } }; item.appendChild(img); item.appendChild(name); item.appendChild(button); ingredientsList.appendChild(item); }); displaySelectedIngredients(); // Show selected ingredients below addSendButton(); // Add Send button below ingredients } function displaySelectedIngredients() { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) { console.error('Chat messages container not found for selected ingredients!'); return; } let selectedArea = document.querySelector('.selected-ingredients'); if (!selectedArea) { selectedArea = document.createElement('div'); selectedArea.className = 'selected-ingredients'; chatMessages.appendChild(selectedArea); } else { selectedArea.innerHTML = ''; } if (selectedIngredients.length > 0) { selectedIngredients.forEach(ingredient => { const div = document.createElement('div'); div.textContent = ingredient.name; selectedArea.appendChild(div); }); } else { selectedArea.innerHTML = '
No ingredients selected yet.
'; } } function addSendButton() { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) return; let sendButton = document.querySelector('.send-button'); if (!sendButton) { sendButton = document.createElement('button'); sendButton.textContent = 'Send'; sendButton.className = 'option-button send-button'; sendButton.onclick = () => { if (selectedIngredients.length > 0) { generateRecipes(); } else { addMessage('bot', 'Please select at least one ingredient first!'); } }; chatMessages.appendChild(sendButton); } } function generateRecipes() { const ingredients = selectedIngredients.map(item => item.name); fetch('/generate_recipes', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ ingredients: ingredients }) }) .then(response => response.json()) .then(data => { if (data.error) { addMessage('bot', `Error generating recipes: ${data.error}`); } else { currentStep = 'recipes'; addMessage('bot', 'Here are 5 South Indian recipes based on your ingredients:'); displayRecipes(data.recipes); } }) .catch(error => { addMessage('bot', `Error: Unable to generate recipes. ${error.message}`); }); } function displayRecipes(recipes) { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) return; recipes.forEach(recipe => { const item = document.createElement('div'); item.className = 'recipe-item'; const img = document.createElement('img'); img.src = recipe.image_url; img.alt = recipe.name; img.style.width = '100px'; img.style.height = '100px'; img.style.objectFit = 'cover'; const name = document.createElement('div'); name.textContent = recipe.name; name.style.margin = '5px 0'; const desc = document.createElement('div'); desc.textContent = recipe.description; desc.style.fontSize = '12px'; const addButton = document.createElement('button'); addButton.textContent = 'Add to Cart'; addButton.className = 'option-button'; addButton.onclick = () => showPopup(recipe); const backButton = document.createElement('button'); backButton.textContent = 'Back'; backButton.className = 'option-button'; backButton.onclick = () => { addMessage('user', 'Back'); conversation.push({ role: 'user', message: 'Back' }); handleResponse('Back'); }; item.appendChild(img); item.appendChild(name); item.appendChild(desc); item.appendChild(addButton); item.appendChild(backButton); chatMessages.appendChild(item); }); } function showPopup(recipe) { const popup = document.getElementById('popup'); const popupContent = document.getElementById('popupContent'); if (!popup || !popupContent) return; popupContent.innerHTML = `

${recipe.name}

${recipe.name}

Description: ${recipe.description}

Preparation Steps: ${recipe.details.preparation}

Key Ingredients: ${recipe.details.key_ingredients.join(', ')}

`; popup.style.display = 'block'; } function closePopup() { const popup = document.getElementById('popup'); if (popup) popup.style.display = 'none'; } function resetChat() { conversation = [{ role: 'bot', message: 'Hi there! I\'m Chef Bot! May I know your name?' }]; selectedIngredients = []; currentStep = 'name'; const chatMessages = document.getElementById('chatMessages'); if (chatMessages) { chatMessages.innerHTML = ''; addMessage('bot', conversation[0].message); } } function displayOptions(options) { const chatMessages = document.getElementById('chatMessages'); if (!chatMessages) return; options.forEach(opt => { const button = document.createElement('button'); button.textContent = opt.text; button.className = `option-button ${opt.class}`; button.onclick = () => { addMessage('user', opt.text); conversation.push({ role: 'user', message: opt.text }); chatMessages.innerHTML = ''; conversation.forEach(msg => addMessage(msg.role, msg.message)); setTimeout(() => handleResponse(opt.text), 500); }; chatMessages.appendChild(button); }); chatMessages.appendChild(document.createElement('br')); } // Add event listener for Enter key document.getElementById('userInput').addEventListener('keypress', function(e) { if (e.key === 'Enter') { sendMessage(); } }); // Initial load check console.log('Script loaded successfully');