Spaces:
Sleeping
Sleeping
| let conversation = [ | |
| { role: 'bot', message: 'Hi there! I\'m Chef Bot! May I know your name?' } | |
| ]; | |
| let selectedIngredients = []; | |
| 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 = []; | |
| // Store food preference (Vegetarian or Non-Vegetarian) | |
| if (conversation.length === 2) { // After name input | |
| 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 (lastMessage.includes('non-vegetarian') || lastMessage.includes('non veg') || lastMessage.includes('nonveg')) { | |
| conversation.push({ role: 'user', message: 'Non-Vegetarian' }); // Store Non-Vegetarian preference | |
| console.log("Food preference selected: Non-Vegetarian"); | |
| console.log("Conversation Array after storing Non-Vegetarian:", conversation); // Debugging: Log conversation | |
| botResponse = 'Great choice! 🍽️ We have some amazing non-vegetarian options! What\'s your dietary preference?'; | |
| options = [ | |
| { text: 'Low Carb', class: '' }, | |
| { text: 'Dairy-Free', class: '' }, | |
| { text: 'Keto', class: '' }, | |
| { text: 'Halal', class: '' } | |
| ]; | |
| } else if (lastMessage.includes('vegetarian')) { | |
| conversation.push({ role: 'user', message: 'Vegetarian' }); // Store Vegetarian preference | |
| console.log("Food preference selected: Vegetarian"); | |
| console.log("Conversation Array after storing Vegetarian:", conversation); // Debugging: Log conversation | |
| botResponse = 'Great choice! 🍽️ We have some amazing vegetarian options! What\'s your dietary preference?'; | |
| options = [ | |
| { text: 'Vegan', class: '' }, | |
| { text: 'Gluten-Free', class: '' }, | |
| { text: 'Low Carb', class: '' }, | |
| { text: 'Dairy-Free', class: '' }, | |
| { text: 'Keto', class: '' }, | |
| { text: 'Halal', class: '' } | |
| ]; | |
| } else if (lastMessage.includes('low carb') || lastMessage.includes('dairy-free') || lastMessage.includes('keto') || lastMessage.includes('halal') || lastMessage.includes('gluten-free') || lastMessage.includes('vegan') || lastMessage.includes('vegetarian')) { | |
| // Fetch ingredients based on previous food preference (Vegetarian or Non-Vegetarian) | |
| console.log("Conversation Array before finding food preference:", conversation); // Debugging | |
| const foodPreference = conversation.find(msg => msg.role === 'user' && (msg.message.toLowerCase().includes('vegetarian') || msg.message.toLowerCase().includes('non-vegetarian')))?.message.toLowerCase(); | |
| console.log("Previous food preference: " + foodPreference); // Debug which food preference is selected | |
| if (foodPreference === 'vegetarian') { | |
| console.log("Fetching Vegetarian ingredients..."); // Debug when fetching vegetarian ingredients | |
| fetchIngredients('veg'); // Fetch Vegetarian ingredients | |
| } else if (foodPreference === 'non-vegetarian') { | |
| console.log("Fetching Non-Vegetarian ingredients..."); // Debug when fetching non-vegetarian ingredients | |
| fetchIngredients('non-vegetarian'); // Fetch Non-Vegetarian ingredients | |
| } | |
| return; // Exit early to fetch ingredients | |
| } | |
| addMessage('bot', botResponse); | |
| if (options.length > 0) { | |
| displayOptions(options); | |
| } | |
| } | |
| function fetchIngredients(foodPreference) { | |
| fetch('/get_ingredients', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ dietary_preference: foodPreference }) // Send the food preference to the backend | |
| }) | |
| .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', 'Here are some available ingredients:'); | |
| displayIngredientsList(ingredients); | |
| displaySelectedIngredients(); | |
| } | |
| }) | |
| .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; | |
| } | |
| // Create or update ingredients list | |
| 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'; // Fallback image | |
| 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); | |
| }); | |
| } | |
| function displaySelectedIngredients() { | |
| const chatMessages = document.getElementById('chatMessages'); | |
| if (!chatMessages) { | |
| console.error('Chat messages container not found for selected ingredients!'); | |
| return; | |
| } | |
| // Create or update selected ingredients area | |
| let selectedArea = document.querySelector('.selected-ingredients'); | |
| if (!selectedArea) { | |
| selectedArea = document.createElement('div'); | |
| selectedArea.className = 'selected-ingredients'; | |
| chatMessages.appendChild(selectedArea); | |
| } else { | |
| selectedArea.innerHTML = ''; | |
| } | |
| selectedIngredients.forEach(ingredient => { | |
| const div = document.createElement('div'); | |
| div.textContent = ingredient.name; | |
| selectedArea.appendChild(div); | |
| }); | |
| // Check if there are selected ingredients | |
| if (selectedIngredients.length > 0) { | |
| // Create and display the Submit button | |
| let submitButton = document.querySelector('.submit-button'); | |
| if (!submitButton) { | |
| submitButton = document.createElement('button'); | |
| submitButton.className = 'submit-button'; | |
| submitButton.textContent = 'Submit Ingredients'; | |
| submitButton.onclick = () => { | |
| submitIngredients(selectedIngredients); | |
| }; | |
| chatMessages.appendChild(submitButton); | |
| } | |
| } | |
| } | |
| function submitIngredients(selectedIngredients) { | |
| fetch('/submit_ingredients', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ ingredients: selectedIngredients }) | |
| }) | |
| .then(response => response.json()) | |
| .then(data => { | |
| if (data.success) { | |
| // Now fetch dish suggestions | |
| fetch('/get_dish_suggestions', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ ingredients: selectedIngredients }) | |
| }) | |
| .then(response => response.json()) | |
| .then(suggestionData => { | |
| if (suggestionData.suggestions) { | |
| // Display dish suggestions | |
| displayDishSuggestions(suggestionData.suggestions); | |
| } | |
| }); | |
| } else { | |
| addMessage('bot', 'There was an issue submitting your ingredients. Please try again.'); | |
| } | |
| }) | |
| .catch(error => { | |
| addMessage('bot', `Error: ${error.message}`); | |
| }); | |
| } | |
| function displayDishSuggestions(suggestions) { | |
| const chatMessages = document.getElementById('chatMessages'); | |
| if (!chatMessages) { | |
| console.error('Chat messages container not found for dish suggestions!'); | |
| return; | |
| } | |
| addMessage('bot', `Based on your ingredients, here are some dish suggestions:`); | |
| // Create and display the suggestions | |
| const suggestionDiv = document.createElement('div'); | |
| suggestionDiv.className = 'suggestions-list'; | |
| suggestionDiv.textContent = suggestions; | |
| chatMessages.appendChild(suggestionDiv); | |
| } | |
| function displayOptions(options) { | |
| const chatMessages = document.getElementById('chatMessages'); | |
| if (!chatMessages) { | |
| console.error('Chat messages container not found for options!'); | |
| 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 = ''; // Clear previous messages | |
| conversation.forEach(msg => addMessage(msg.role, msg.message)); | |
| setTimeout(() => handleResponse(opt.text), 500); | |
| }; | |
| chatMessages.appendChild(button); | |
| }); | |
| chatMessages.appendChild(document.createElement('br')); | |
| const backButton = document.createElement('button'); | |
| backButton.textContent = 'Go Back'; | |
| backButton.className = 'option-button'; | |
| backButton.onclick = () => { | |
| conversation.pop(); // Remove last user input | |
| selectedIngredients = []; // Clear selected ingredients | |
| chatMessages.innerHTML = ''; // Clear previous messages | |
| conversation.forEach(msg => addMessage(msg.role, msg.message)); | |
| setTimeout(() => handleResponse(conversation[conversation.length - 1].message), 500); | |
| }; | |
| chatMessages.appendChild(backButton); | |
| } | |
| // 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'); |