diff --git a/public/icons/apple.png b/public/icons/apple.png deleted file mode 100644 index eea2e3b..0000000 Binary files a/public/icons/apple.png and /dev/null differ diff --git a/public/icons/microsoft.png b/public/icons/microsoft.png deleted file mode 100644 index 2ee14f0..0000000 Binary files a/public/icons/microsoft.png and /dev/null differ diff --git a/src/app/(auth-pages)/auth/callback/route.ts b/src/app/(auth-pages)/auth/callback/route.ts index a2a9cec..8d1d901 100644 --- a/src/app/(auth-pages)/auth/callback/route.ts +++ b/src/app/(auth-pages)/auth/callback/route.ts @@ -1,4 +1,3 @@ -// src/app/(auth-pages)/auth/callback/route.ts 'use server'; import 'server-only'; import { createServerClient } from '@/utils/supabase'; @@ -12,10 +11,8 @@ export const GET = async (request: NextRequest) => { const token_hash = searchParams.get('token'); const type = searchParams.get('type') as EmailOtpType | null; const redirectTo = searchParams.get('redirect_to') ?? '/'; - const supabase = await createServerClient(); - // Handle OAuth callback (Microsoft, Apple, etc.) if (code) { const { error } = await supabase.auth.exchangeCodeForSession(code); if (error) { @@ -25,7 +22,6 @@ export const GET = async (request: NextRequest) => { return redirect(redirectTo); } - // Handle email OTP (existing logic) if (token_hash && type) { const { error } = await supabase.auth.verifyOtp({ type, diff --git a/src/app/(auth-pages)/auth/callback/route.ts.bak b/src/app/(auth-pages)/auth/callback/route.ts.bak deleted file mode 100644 index 812d617..0000000 --- a/src/app/(auth-pages)/auth/callback/route.ts.bak +++ /dev/null @@ -1,77 +0,0 @@ -'use server'; - -import 'server-only'; -import { createServerClient } from '@/utils/supabase'; -import { type EmailOtpType } from '@supabase/supabase-js'; -import { type NextRequest, NextResponse } from 'next/server'; - -export const GET = async (request: NextRequest) => { - const { searchParams, origin } = new URL(request.url); - const code = searchParams.get('code'); - const token = searchParams.get('token'); - const type = searchParams.get('type') as EmailOtpType | null; - const redirectTo = searchParams.get('redirect_to')?.toString(); - - const supabase = await createServerClient(); - - if (token && type) { - try { - if (type === 'signup') { - // Confirm email signup - const { error } = await supabase.auth.verifyOtp({ - token_hash: token, - type: 'signup', - }); - - if (error) { - console.error('Email confirmation error:', error); - return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired confirmation link`); - } - } else if (type === 'recovery') { - // Handle password recovery - const { error } = await supabase.auth.verifyOtp({ - token_hash: token, - type: 'recovery', - }); - - if (error) { - console.error('Password recovery error:', error); - return NextResponse.redirect(`${origin}/sign-in?error=Invalid or expired reset link`); - } else { - return NextResponse.redirect(`${origin}/reset-password`); - } - } else if (type === 'email_change') { - // Handle email change - const { error } = await supabase.auth.verifyOtp({ - token_hash: token, - type: 'email_change', - }); - - if (error) { - console.error('Email change error:', error); - return NextResponse.redirect(`${origin}/profile?error=Invalid or expired email change link`); - } - } - } catch (error) { - console.error('Verification error:', error); - return NextResponse.redirect(`${origin}/sign-in?error=Verification failed`); - } - } - - // Handle code-based flow (OAuth, etc.) - if (code) { - await supabase.auth.exchangeCodeForSession(code); - } - - // Handle redirect - if (redirectTo) { - try { - new URL(redirectTo); - return NextResponse.redirect(redirectTo); - } catch { - return NextResponse.redirect(`${origin}${redirectTo}`); - } - } - - return NextResponse.redirect(origin); -} diff --git a/src/app/(auth-pages)/auth/success/page.tsx b/src/app/(auth-pages)/auth/success/page.tsx new file mode 100644 index 0000000..d41f474 --- /dev/null +++ b/src/app/(auth-pages)/auth/success/page.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { useAuth } from '@/components/context/auth'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import { Loader2 } from 'lucide-react'; + +const AuthSuccessPage = () => { + const { refreshUserData, isAuthenticated } = useAuth(); + const router = useRouter(); + + useEffect(() => { + const handleAuthSuccess = async () => { + // Refresh the auth context to pick up the new session + await refreshUserData(); + + // Small delay to ensure state is updated + setTimeout(() => { + router.push('/'); + }, 100); + }; + + handleAuthSuccess().catch((error) => { + console.error(`Error: ${error instanceof Error ? error.message : error}`); + }); + }, [refreshUserData, router]); + + // Show loading while processing + return ( +
Completing sign in...
+