/** * Ask AI functionality - Based on original working implementation */ // Global variables for AI functionality let aiProfileData = null; // Original functions from working implementation function toggleAskAI() { const panel = document.getElementById('askAiPanel'); const isVisible = panel.style.display !== 'none'; panel.style.display = isVisible ? 'none' : 'block'; if (!isVisible) { checkAuthenticationStatus(); } } function checkAuthenticationStatus() { const userSections = document.querySelectorAll('.user-section'); const isAuthenticated = userSections.length > 0; if (isAuthenticated) { // User is authenticated - show Ask AI UI document.getElementById('authCheck').style.display = 'none'; document.getElementById('chatForm').style.display = 'block'; document.getElementById('chatHistory').style.display = 'block'; // Show initial greeting if chat history is empty const chatHistory = document.getElementById('chatHistory'); if (chatHistory.children.length === 0) { showInitialGreeting(); } // Focus on input setTimeout(() => { document.getElementById('aiQuestion').focus(); }, 50); } else { // User not authenticated - show auth message document.getElementById('authCheck').style.display = 'block'; document.getElementById('chatForm').style.display = 'none'; document.getElementById('chatHistory').style.display = 'none'; } } function askQuestion() { const question = document.getElementById('aiQuestion').value; if (!question.trim()) return; const askButton = document.getElementById('askButton'); askButton.disabled = true; askButton.textContent = 'Posting...'; try { // Add user message to chat addUserMessage(question); // Clear input document.getElementById('aiQuestion').value = ''; // Show loading showLoadingMessage(); // Post question via OAuth app window.dispatchEvent(new CustomEvent('postAIQuestion', { detail: { question: question } })); } catch (error) { console.error('Failed to ask question:', error); showErrorMessage('Sorry, I encountered an error. Please try again.'); } finally { askButton.disabled = false; askButton.textContent = 'Ask'; } } function addUserMessage(question) { const chatHistory = document.getElementById('chatHistory'); const userSection = document.querySelector('.user-section'); let userAvatar = 'π€'; let userDisplay = 'You'; let userHandle = 'user'; if (userSection) { const avatarImg = userSection.querySelector('.user-avatar'); const displayName = userSection.querySelector('.user-display-name'); const handle = userSection.querySelector('.user-handle'); if (avatarImg && avatarImg.src) { userAvatar = `<img src="${avatarImg.src}" alt="${displayName?.textContent || 'User'}" class="profile-avatar">`; } if (displayName?.textContent) { userDisplay = displayName.textContent; } if (handle?.textContent) { userHandle = handle.textContent.replace('@', ''); } } const questionDiv = document.createElement('div'); questionDiv.className = 'chat-message user-message comment-style'; questionDiv.innerHTML = ` <div class="message-header"> <div class="avatar">${userAvatar}</div> <div class="user-info"> <div class="display-name">${userDisplay}</div> <div class="handle">@${userHandle}</div> <div class="timestamp">${new Date().toLocaleString()}</div> </div> </div> <div class="message-content">${question}</div> `; chatHistory.appendChild(questionDiv); } function showLoadingMessage() { const chatHistory = document.getElementById('chatHistory'); const loadingDiv = document.createElement('div'); loadingDiv.className = 'ai-loading-simple'; loadingDiv.innerHTML = ` <i class="fas fa-robot"></i> <span>θγγ¦γγΎγ</span> <i class="fas fa-spinner fa-spin"></i> `; chatHistory.appendChild(loadingDiv); } function showErrorMessage(message) { const chatHistory = document.getElementById('chatHistory'); removeLoadingMessage(); const errorDiv = document.createElement('div'); errorDiv.className = 'chat-message error-message comment-style'; errorDiv.innerHTML = ` <div class="message-header"> <div class="avatar">β οΈ</div> <div class="user-info"> <div class="display-name">System</div> <div class="handle">@system</div> <div class="timestamp">${new Date().toLocaleString()}</div> </div> </div> <div class="message-content">${message}</div> `; chatHistory.appendChild(errorDiv); } function removeLoadingMessage() { const loadingMsg = document.querySelector('.ai-loading-simple'); if (loadingMsg) { loadingMsg.remove(); } } function showInitialGreeting() { if (!aiProfileData) return; const chatHistory = document.getElementById('chatHistory'); const greetingDiv = document.createElement('div'); greetingDiv.className = 'chat-message ai-message comment-style initial-greeting'; const avatarElement = aiProfileData.avatar ? `<img src="${aiProfileData.avatar}" alt="${aiProfileData.displayName}" class="profile-avatar">` : 'π€'; greetingDiv.innerHTML = ` <div class="message-header"> <div class="avatar">${avatarElement}</div> <div class="user-info"> <div class="display-name">${aiProfileData.displayName}</div> <div class="handle">@${aiProfileData.handle}</div> <div class="timestamp">${new Date().toLocaleString()}</div> </div> </div> <div class="message-content"> Hello! I'm an AI assistant trained on this blog's content. I can answer questions about the articles, provide insights, and help you understand the topics discussed here. What would you like to know? </div> `; chatHistory.appendChild(greetingDiv); } function updateAskAIButton() { const button = document.getElementById('askAiButton'); if (!button) return; // Only update text, never modify the icon if (aiProfileData && aiProfileData.displayName) { const textNode = button.childNodes[2] || button.lastChild; if (textNode && textNode.nodeType === Node.TEXT_NODE) { textNode.textContent = aiProfileData.displayName; } } } function handleAIResponse(responseData) { const chatHistory = document.getElementById('chatHistory'); removeLoadingMessage(); const aiProfile = responseData.aiProfile; if (!aiProfile || !aiProfile.handle || !aiProfile.displayName) { console.error('AI profile data is missing'); return; } const timestamp = new Date(responseData.timestamp || Date.now()); const avatarElement = aiProfile.avatar ? `<img src="${aiProfile.avatar}" alt="${aiProfile.displayName}" class="profile-avatar">` : 'π€'; const answerDiv = document.createElement('div'); answerDiv.className = 'chat-message ai-message comment-style'; answerDiv.innerHTML = ` <div class="message-header"> <div class="avatar">${avatarElement}</div> <div class="user-info"> <div class="display-name">${aiProfile.displayName}</div> <div class="handle">@${aiProfile.handle}</div> <div class="timestamp">${timestamp.toLocaleString()}</div> </div> </div> <div class="message-content">${responseData.answer}</div> `; chatHistory.appendChild(answerDiv); // Limit chat history limitChatHistory(); } function limitChatHistory() { const chatHistory = document.getElementById('chatHistory'); if (chatHistory.children.length > 10) { chatHistory.removeChild(chatHistory.children[0]); if (chatHistory.children.length > 0) { chatHistory.removeChild(chatHistory.children[0]); } } } // Event listeners setup function setupAskAIEventListeners() { // Listen for AI profile updates from OAuth app window.addEventListener('aiProfileLoaded', function(event) { aiProfileData = event.detail; console.log('AI profile loaded:', aiProfileData); updateAskAIButton(); }); // Listen for AI responses window.addEventListener('aiResponseReceived', function(event) { handleAIResponse(event.detail); }); // Listen for OAuth callback completion from iframe window.addEventListener('message', function(event) { if (event.data.type === 'oauth_success') { console.log('Received OAuth success message:', event.data); // Close any OAuth popups/iframes const oauthFrame = document.getElementById('oauth-frame'); if (oauthFrame) { oauthFrame.remove(); } // Reload the page to refresh OAuth app state setTimeout(() => { window.location.reload(); }, 500); } }); // Track IME composition state let isComposing = false; const aiQuestionInput = document.getElementById('aiQuestion'); if (aiQuestionInput) { aiQuestionInput.addEventListener('compositionstart', function() { isComposing = true; }); aiQuestionInput.addEventListener('compositionend', function() { isComposing = false; }); } // Keyboard shortcuts document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { const panel = document.getElementById('askAiPanel'); if (panel) { panel.style.display = 'none'; } } // Enter key to send message (only when not composing Japanese input) if (e.key === 'Enter' && e.target.id === 'aiQuestion' && !e.shiftKey && !isComposing) { e.preventDefault(); askQuestion(); } }); } // Initialize Ask AI when DOM is loaded document.addEventListener('DOMContentLoaded', function() { setupAskAIEventListeners(); console.log('Ask AI initialized successfully'); }); // Global functions for onclick handlers window.toggleAskAI = toggleAskAI; window.askQuestion = askQuestion;