'use client'; import { useEffect, useState, Suspense } from 'react'; import { useSearchParams, useRouter } from 'next/navigation'; import { auth } from '@/lib/firebase/config'; import { exchangeCodeForToken, getGitHubUser } from '@/lib/github/oauth'; import { Loader2, CheckCircle2, XCircle } from 'lucide-react'; function GitHubCallbackContent() { const searchParams = useSearchParams(); const router = useRouter(); const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); const [error, setError] = useState(null); useEffect(() => { async function handleCallback() { try { const code = searchParams.get('code'); const state = searchParams.get('state'); const error = searchParams.get('error'); if (error) { throw new Error(`GitHub OAuth error: ${error}`); } if (!code) { throw new Error('No authorization code received'); } // Verify state (CSRF protection) const storedState = sessionStorage.getItem('github_oauth_state'); if (state !== storedState) { throw new Error('Invalid state parameter'); } sessionStorage.removeItem('github_oauth_state'); // Exchange code for token const tokenData = await exchangeCodeForToken(code); // Get GitHub user info const githubUser = await getGitHubUser(tokenData.access_token); // Store connection in Firebase const user = auth.currentUser; if (!user) { throw new Error('User not authenticated'); } const idToken = await user.getIdToken(); const response = await fetch('/api/github/connect', { method: 'POST', headers: { 'Authorization': `Bearer ${idToken}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ accessToken: tokenData.access_token, githubUser, }), }); if (!response.ok) { throw new Error('Failed to store GitHub connection'); } setStatus('success'); // Redirect back to connections page after 2 seconds setTimeout(() => { const workspace = user.displayName || 'workspace'; router.push(`/${workspace}/connections`); }, 2000); } catch (err: any) { console.error('[GitHub Callback] Error:', err); setError(err.message); setStatus('error'); } } handleCallback(); }, [searchParams, router]); return (
{status === 'loading' && ( <>

Connecting to GitHub...

Please wait while we complete the connection.

)} {status === 'success' && ( <>

Successfully Connected!

Your GitHub account has been connected. Redirecting...

)} {status === 'error' && ( <>

Connection Failed

{error}

)}
); } export default function GitHubCallbackPage() { return (

Loading...

} >
); }