diff --git a/my-blog/static/js/ask-ai.js b/my-blog/static/js/ask-ai.js index ab84092..824a3b4 100644 --- a/my-blog/static/js/ask-ai.js +++ b/my-blog/static/js/ask-ai.js @@ -253,6 +253,24 @@ function setupAskAIEventListeners() { 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'); @@ -284,52 +302,8 @@ function setupAskAIEventListeners() { }); } -// OAuth Callback handling -function handleOAuthCallback() { - // Check if we're on the callback page - if (window.location.pathname === '/oauth/callback') { - const urlParams = new URLSearchParams(window.location.search); - const code = urlParams.get('code'); - const error = urlParams.get('error'); - - if (error) { - console.error('OAuth error:', error); - // Redirect to home page with error - setTimeout(() => { - window.location.href = '/?oauth_error=' + encodeURIComponent(error); - }, 1000); - return; - } - - if (code) { - console.log('OAuth callback successful, code received'); - - // Get the original page from localStorage or use home page - const originalPage = localStorage.getItem('oauth_original_page') || '/'; - localStorage.removeItem('oauth_original_page'); - - // Wait a bit for OAuth app to process the callback - setTimeout(() => { - console.log('Redirecting back to:', originalPage); - window.location.href = originalPage; - }, 2000); - - return; - } - } - - // Store current page before OAuth if we're not on callback page - if (window.location.pathname !== '/oauth/callback') { - localStorage.setItem('oauth_original_page', window.location.href); - } -} - // Initialize Ask AI when DOM is loaded document.addEventListener('DOMContentLoaded', function() { - // Handle OAuth callback first - handleOAuthCallback(); - - // Then initialize Ask AI setupAskAIEventListeners(); console.log('Ask AI initialized successfully'); }); diff --git a/oauth/src/App.css b/oauth/src/App.css index cbe6bfe..63f6085 100644 --- a/oauth/src/App.css +++ b/oauth/src/App.css @@ -44,7 +44,7 @@ body { .oauth-header-content { display: flex; - justify-content: flex-start; + justify-content: space-between; align-items: center; max-width: 800px; margin: 0 auto; @@ -62,7 +62,74 @@ body { display: flex; gap: 8px; align-items: center; - width: 100%; +} + +/* OAuth User Profile in Header */ +.oauth-user-profile { + display: flex; + align-items: center; + gap: 12px; + flex: 1; +} + +.profile-avatar-section { + flex-shrink: 0; +} + +.profile-avatar-section .profile-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + object-fit: cover; + border: 2px solid var(--border); +} + +.profile-avatar-fallback { + width: 48px; + height: 48px; + border-radius: 50%; + background: var(--background-secondary); + border: 2px solid var(--border); + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + font-weight: 700; + color: var(--text-secondary); +} + +.profile-info { + flex: 1; + min-width: 0; +} + +.profile-display-name { + font-size: 18px; + font-weight: 700; + color: var(--text); + margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.profile-handle { + font-size: 14px; + color: var(--text-secondary); + margin-bottom: 2px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.profile-did { + font-size: 11px; + color: var(--text-secondary); + font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + opacity: 0.7; } /* Buttons */ @@ -647,6 +714,41 @@ body { .chat-container { height: 300px; } + + /* OAuth User Profile Mobile */ + .oauth-user-profile { + gap: 8px; + } + + .profile-avatar-section .profile-avatar, + .profile-avatar-fallback { + width: 36px; + height: 36px; + font-size: 14px; + } + + .profile-display-name { + font-size: 14px; + } + + .profile-handle { + font-size: 12px; + } + + .profile-did { + font-size: 9px; + } + + .oauth-header-content { + flex-direction: column; + gap: 12px; + align-items: flex-start; + } + + .oauth-header-actions { + width: 100%; + justify-content: center; + } } /* Avatar Styles */ diff --git a/oauth/src/App.jsx b/oauth/src/App.jsx index 9ab8d20..11fac13 100644 --- a/oauth/src/App.jsx +++ b/oauth/src/App.jsx @@ -69,8 +69,32 @@ export default function App() { if (isLoading) { return ( -
読み込み中...
+読み込み中...
+ +{status}
- {status.includes('エラー') && ( - - )} ++ 認証が完了しましたら自動で元のページに戻ります +
+ +