diff --git a/app.js b/app.js index 450e04d..17ad062 100644 --- a/app.js +++ b/app.js @@ -1,417 +1,133 @@ -// let name = "adi"; -// let age = 19; - -// let num1 = 25; -// let num2 = 25; -// let sum = num1 + num2; - -// Wishlistz Chatbot JavaScript - // Get DOM elements const messageInput = document.getElementById('messageInput'); const sendButton = document.getElementById('sendButton'); const chatMessages = document.getElementById('chatMessages'); const attachButton = document.getElementById('attachButton'); const fileInput = document.getElementById('fileInput'); +const toggleSwitch = document.getElementById('themeCheckbox'); +const minimizeButton = document.getElementById('minimizeButton'); // Matches your HTML ID +const chatContainer = document.querySelector('.chat-container'); + +// --- DATA ARRAYS --- +const botResponses = ["Welcome to Wishlistz ๐๏ธ", "Men, Women or Kids?", "Browse latest fashion ๐ฅ", "Great choice!", "Added to wishlist โค๏ธ", "Item available in all sizes", "Check todayโs offers ๐ธ", "Popular item right now โญ", "View your wishlist anytime", "New arrivals are live โจ", "Need size help?", "More styles available ๐๐", "Item saved successfully โ๏ธ", "Shop smart with Wishlistz ๐", "What would you like to add?"]; +const fileResponses = ["๐Looks like a shirt ๐ Added to your wishlist", "โ Beautiful! dress saved successfully.", "โจ Menโs product added ๐.", "๐จ Product image saved to wishlist โค๏ธ!"]; +const imageResponses = ["โ Looks like a shirt ๐ Added to your wishlist", "๐ธ Beautiful! dress saved successfully.", "โจ Menโs product added ๐.", "๐จ Product image saved to wishlist โค๏ธ!"]; + +// --- MINIMIZE & EXPAND LOGIC --- +minimizeButton.addEventListener('click', (e) => { + e.stopPropagation(); // Prevents immediate re-opening + chatContainer.classList.add('minimized'); +}); -// Array of bot responses -const botResponses = [ - "Welcome to Wishlistz ๐๏ธ", - "Men, Women or Kids?", - "Browse latest fashion ๐ฅ", - "Great choice!", - "Added to wishlist โค๏ธ", - "Item available in all sizes", - "Check todayโs offers ๐ธ", - "Popular item right now โญ", - "View your wishlist anytime", - "New arrivals are live โจ", - "Need size help?", - "More styles available ๐๐", - "Item saved successfully โ๏ธ", - "Shop smart with Wishlistz ๐", - "What would you like to add?" -]; - -// Array of file-specific bot responses -const fileResponses = [ - "๐Looks like a shirt ๐ Added to your wishlist", - "โ Beautiful! dress saved successfully.", - "โจ Menโs product added ๐.", - "๐จ Product image saved to wishlist โค๏ธ!" -]; - -// Array of image-specific bot responses -const imageResponses = [ - "โ Looks like a shirt ๐ Added to your wishlist", - "๐ธ Beautiful! dress saved successfully.", - "โจ Menโs product added ๐.", - "๐จ Product image saved to wishlist โค๏ธ!" -]; - -// Helper Function: Get Current Time -function getCurrentTime() { - const now = new Date(); - let hours = now.getHours(); - let minutes = now.getMinutes(); - const ampm = hours >= 12 ? 'PM' : 'AM'; - - // Convert to 12-hour format - hours = hours % 12; - hours = hours ? hours : 12; // Hour '0' should be '12' - - // Add leading zero to minutes if needed - minutes = minutes < 10 ? '0' + minutes : minutes; - - return `${hours}:${minutes} ${ampm}`; -} - -// Helper Function: Get File Extension -function getFileExtension(filename) { - return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2).toLowerCase(); -} - -// Helper Function: Get File Icon -function getFileIcon(extension) { - const iconMap = { - 'pdf': '๐', - 'doc': '๐', - 'docx': '๐', - 'txt': '๐', - 'jpg': '๐ผ๏ธ', - 'jpeg': '๐ผ๏ธ', - 'png': '๐ผ๏ธ' - }; - return iconMap[extension] || '๐'; -} - -// Helper Function: Format File Size -function formatFileSize(bytes) { - if (bytes === 0) return '0 Bytes'; +chatContainer.addEventListener('click', () => { + if (chatContainer.classList.contains('minimized')) { + chatContainer.classList.remove('minimized'); + } +}); - const k = 1024; - const sizes = ['Bytes', 'KB', 'MB', 'GB']; - const i = Math.floor(Math.log(bytes) / Math.log(k)); +// --- THEME TOGGLE LOGIC --- +toggleSwitch.addEventListener('change', function(e) { + if (this.checked) { + document.body.classList.add('light-mode'); + localStorage.setItem('theme', 'light'); + } else { + document.body.classList.remove('light-mode'); + localStorage.setItem('theme', 'dark'); + } +}); - return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i]; +// Load saved theme on refresh +if (localStorage.getItem('theme') === 'light') { + toggleSwitch.checked = true; + document.body.classList.add('light-mode'); } -// Helper Function: Check if File is Image -function isImageFile(filename) { - const extension = getFileExtension(filename); - return ['jpg', 'jpeg', 'png'].includes(extension); -} -// Helper Function: Scroll to Bottom -function scrollToBottom() { - chatMessages.scrollTop = chatMessages.scrollHeight; -} +function getFileExtension(fn) { return fn.slice((fn.lastIndexOf(".") - 1 >>> 0) + 2).toLowerCase(); } +function isImageFile(fn) { return ['jpg', 'jpeg', 'png'].includes(getFileExtension(fn)); } +function scrollToBottom() { chatMessages.scrollTop = chatMessages.scrollHeight; } -// Function: Add Message to Chat +// --- MESSAGE DISPLAY LOGIC --- function addMessage(text, isUser = false) { - // Create message container const messageDiv = document.createElement('div'); messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`; - - // Create message content - const messageContent = document.createElement('div'); - messageContent.className = 'message-content'; - - // Create message text - const messageText = document.createElement('p'); - messageText.textContent = text; - - // Create timestamp - const messageTime = document.createElement('span'); - messageTime.className = 'message-time'; - messageTime.textContent = getCurrentTime(); - - // Append elements - messageContent.appendChild(messageText); - messageContent.appendChild(messageTime); - messageDiv.appendChild(messageContent); + messageDiv.innerHTML = ` +
`; chatMessages.appendChild(messageDiv); - - // Scroll to bottom scrollToBottom(); } -// Function: Add File Message to Chat function addImageMessage(imageSrc, isUser = false) { - // Create message container const messageDiv = document.createElement('div'); messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`; - - // Create message content - const messageContent = document.createElement('div'); - messageContent.className = 'message-content has-image'; - - // Create image element - const img = document.createElement('img'); - img.src = imageSrc; - img.className = 'message-image'; - img.alt = 'Uploaded image'; - - // Create timestamp - const messageTime = document.createElement('span'); - messageTime.className = 'message-time'; - messageTime.textContent = getCurrentTime(); - - // Append elements - messageContent.appendChild(img); - messageContent.appendChild(messageTime); - messageDiv.appendChild(messageContent); + messageDiv.innerHTML = ` + `; chatMessages.appendChild(messageDiv); - - // Scroll to bottom scrollToBottom(); } -// Function: Add File Message to Chat -function addFileMessage(fileName, fileSize, isUser = false) { - // Get file extension and icon - const extension = getFileExtension(fileName); - const icon = getFileIcon(extension); - - // Create message container - const messageDiv = document.createElement('div'); - messageDiv.className = `message ${isUser ? 'user-message' : 'bot-message'}`; - - // Create message content - const messageContent = document.createElement('div'); - messageContent.className = 'message-content'; - - // Create file card - const fileCard = document.createElement('div'); - fileCard.className = 'file-card'; - - // Create file icon - const fileIcon = document.createElement('div'); - fileIcon.className = 'file-icon'; - fileIcon.textContent = icon; - - // Create file info container - const fileInfo = document.createElement('div'); - fileInfo.className = 'file-info'; - - // Create file name - const fileNameDiv = document.createElement('div'); - fileNameDiv.className = 'file-name'; - fileNameDiv.textContent = fileName; - - // Create file size - const fileSizeDiv = document.createElement('div'); - fileSizeDiv.className = 'file-size'; - fileSizeDiv.textContent = formatFileSize(fileSize); - - // Append file info - fileInfo.appendChild(fileNameDiv); - fileInfo.appendChild(fileSizeDiv); - - // Append to file card - fileCard.appendChild(fileIcon); - fileCard.appendChild(fileInfo); - - // Create timestamp - const messageTime = document.createElement('span'); - messageTime.className = 'message-time'; - messageTime.textContent = getCurrentTime(); - - // Append to message content - messageContent.appendChild(fileCard); - messageContent.appendChild(messageTime); - messageDiv.appendChild(messageContent); - chatMessages.appendChild(messageDiv); - - // Scroll to bottom - scrollToBottom(); -} - -// Function: Show Typing Indicator function showTypingIndicator() { const typingDiv = document.createElement('div'); typingDiv.className = 'message bot-message'; typingDiv.id = 'typingIndicator'; - - const typingContent = document.createElement('div'); - typingContent.className = 'message-content'; - - const typingIndicator = document.createElement('div'); - typingIndicator.className = 'typing-indicator'; - - // Create three dots - for (let i = 0; i < 3; i++) { - const dot = document.createElement('div'); - dot.className = 'typing-dot'; - typingIndicator.appendChild(dot); - } - - typingContent.appendChild(typingIndicator); - typingDiv.appendChild(typingContent); + typingDiv.innerHTML = ``; chatMessages.appendChild(typingDiv); - scrollToBottom(); } -// Function: Remove Typing Indicator -function removeTypingIndicator() { - const typingIndicator = document.getElementById('typingIndicator'); - if (typingIndicator) { - typingIndicator.remove(); - } -} - -// Function: Get Random Bot Response -function getRandomBotResponse() { - const randomIndex = Math.floor(Math.random() * botResponses.length); - return botResponses[randomIndex]; -} - -// Function: Get Random File Response -function getRandomFileResponse() { - const randomIndex = Math.floor(Math.random() * fileResponses.length); - return fileResponses[randomIndex]; -} - -// Function: Get Random Image Response -function getRandomImageResponse() { - const randomIndex = Math.floor(Math.random() * imageResponses.length); - return imageResponses[randomIndex]; -} - -// Function: Send Bot Response -function sendBotResponse(isFileUpload = false, isImageUpload = false) { - // Show typing indicator +function sendBotResponse(isFile = false, isImg = false) { showTypingIndicator(); - - // Simulate bot thinking time (1-2 seconds) - const thinkingTime = Math.random() * 1000 + 1000; - setTimeout(() => { - // Remove typing indicator - removeTypingIndicator(); - - // Add bot message based on context - let botMessage; - if (isImageUpload) { - botMessage = getRandomImageResponse(); - } else if (isFileUpload) { - botMessage = getRandomFileResponse(); - } else { - botMessage = getRandomBotResponse(); - } - - addMessage(botMessage, false); - }, thinkingTime); + const indicator = document.getElementById('typingIndicator'); + if (indicator) indicator.remove(); + + let response; + if (isImg) response = imageResponses[Math.floor(Math.random() * imageResponses.length)]; + else if (isFile) response = fileResponses[Math.floor(Math.random() * fileResponses.length)]; + else response = botResponses[Math.floor(Math.random() * botResponses.length)]; + + addMessage(response, false); + }, 1200); } -// Function: Handle File Upload -function handleFileUpload(event) { - const file = event.target.files[0]; +function handleSendMessage() { + const text = messageInput.value.trim(); + if (text === '') return; + addMessage(text, true); + messageInput.value = ''; + sendBotResponse(); +} - // Check if file exists - if (!file) { - return; - } +sendButton.addEventListener('click', handleSendMessage); +messageInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') handleSendMessage(); }); - // Check if file is an image +attachButton.addEventListener('click', () => fileInput.click()); +fileInput.addEventListener('change', (e) => { + const file = e.target.files[0]; + if (!file) return; if (isImageFile(file.name)) { - // Use FileReader to read image as Data URL const reader = new FileReader(); - - reader.onload = function(e) { - // Add image message to chat - addImageMessage(e.target.result, true); - - // Send bot response for image + reader.onload = (ev) => { + addImageMessage(ev.target.result, true); sendBotResponse(false, true); }; - - // Read file as Data URL (base64) reader.readAsDataURL(file); } else { - // Handle other file types (PDF, DOC, TXT) - addFileMessage(file.name, file.size, true); - - // Send bot response for file + addMessage(`๐ Sent: ${file.name}`, true); sendBotResponse(true, false); } - - // Reset file input so same file can be uploaded again - fileInput.value = ''; -} -// Function: Handle Send Message -function handleSendMessage() { - // Get message text and trim whitespace - const messageText = messageInput.value.trim(); - - // Check if message is not empty - if (messageText === '') { - return; - } - - // Add user message to chat - addMessage(messageText, true); - - // Clear input field - messageInput.value = ''; - - // Focus back on input - messageInput.focus(); - - // Send bot response after a short delay - sendBotResponse(); -} - -// Event Listeners - -// Attach button click event - triggers file input -attachButton.addEventListener('click', () => { - fileInput.click(); }); -// File input change event - handles file upload -fileInput.addEventListener('change', handleFileUpload); - -// Send button click event -sendButton.addEventListener('click', handleSendMessage); - -// Enter key press event -messageInput.addEventListener('keypress', (event) => { - if (event.key === 'Enter') { - handleSendMessage(); +document.addEventListener('click', (e) => { + if (e.target.classList.contains('qa-btn')) { + const text = e.target.innerText; + addMessage(text, true); // Use your existing addMessage function + sendBotResponse(); // Trigger your existing bot response + e.target.parentElement.style.display = 'none'; // Optional: hide after use } -}); - -// Input field focus on page load -window.addEventListener('load', () => { - messageInput.focus(); - - // Add a slight delay before scrolling to ensure DOM is ready - setTimeout(scrollToBottom, 100); -}); - -// Optional: Disable send button when input is empty -messageInput.addEventListener('input', () => { - if (messageInput.value.trim() === '') { - sendButton.style.opacity = '0.5'; - sendButton.style.cursor = 'not-allowed'; - } else { - sendButton.style.opacity = '1'; - sendButton.style.cursor = 'pointer'; - } -}); - -// Initialize button state -if (messageInput.value.trim() === '') { - sendButton.style.opacity = '0.5'; - sendButton.style.cursor = 'not-allowed'; -} - -// Theme Toggle Logic -const themeToggle = document.getElementById('themeToggle'); - -themeToggle.addEventListener('click', () => { - document.body.classList.toggle('light-mode'); - themeToggle.textContent = document.body.classList.contains('light-mode') ? '๐' : '๐'; }); \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000..4b84bb4 Binary files /dev/null and b/image.png differ diff --git a/index.html b/index.html index 6abba50..54ad101 100644 --- a/index.html +++ b/index.html @@ -7,13 +7,12 @@ - -
+