44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
'use server';
|
|
import 'server-only';
|
|
import { createServerClient } from '@/utils/supabase';
|
|
import { type EmailOtpType } from '@supabase/supabase-js';
|
|
import { type NextRequest } from 'next/server';
|
|
import { redirect } from 'next/navigation';
|
|
|
|
export const GET = async (request: NextRequest) => {
|
|
const { searchParams, origin } = new URL(request.url);
|
|
const code = searchParams.get('code');
|
|
const token_hash = searchParams.get('token');
|
|
const type = searchParams.get('type') as EmailOtpType | null;
|
|
const redirectTo = searchParams.get('redirect_to') ?? '/';
|
|
const supabase = await createServerClient();
|
|
|
|
if (code) {
|
|
const { error } = await supabase.auth.exchangeCodeForSession(code);
|
|
if (error) {
|
|
console.error('OAuth error:', error);
|
|
return redirect(`/sign-in?error=${encodeURIComponent(error.message)}`);
|
|
}
|
|
return redirect(redirectTo);
|
|
}
|
|
|
|
if (token_hash && type) {
|
|
const { error } = await supabase.auth.verifyOtp({
|
|
type,
|
|
token_hash,
|
|
});
|
|
if (!error) {
|
|
if (type === 'signup' || type === 'magiclink' || type === 'email')
|
|
return redirect('/');
|
|
if (type === 'recovery' || type === 'email_change')
|
|
return redirect('/profile');
|
|
if (type === 'invite') return redirect('/sign-up');
|
|
}
|
|
return redirect(
|
|
`/?error=${encodeURIComponent(error?.message ?? 'Unknown error')}`,
|
|
);
|
|
}
|
|
|
|
return redirect('/');
|
|
};
|