chatbot2 / static /script.js
nagasurendra's picture
Update static/script.js
f4f01e5 verified
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');