Files
gh-hopeoverture-worldbuildi…/skills/supabase-auth-ssr-setup/assets/auth-actions.ts
2025-11-29 18:46:51 +08:00

99 lines
2.3 KiB
TypeScript

'use server';
import { createServerClient } from '@/lib/supabase/server';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
/**
* Sign out the current user
*/
export async function logout() {
const supabase = await createServerClient();
await supabase.auth.signOut();
revalidatePath('/', 'layout');
redirect('/');
}
/**
* Sign in with email and password
*/
export async function signInWithPassword(formData: FormData) {
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const supabase = await createServerClient();
const { error } = await supabase.auth.signInWithPassword({
email,
password,
});
if (error) {
return { error: error.message };
}
revalidatePath('/', 'layout');
redirect('/dashboard');
}
/**
* Sign up with email and password
*/
export async function signUpWithPassword(formData: FormData) {
const email = formData.get('email') as string;
const password = formData.get('password') as string;
const supabase = await createServerClient();
const { error } = await supabase.auth.signUp({
email,
password,
options: {
emailRedirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`,
},
});
if (error) {
return { error: error.message };
}
return { success: 'Check your email to confirm your account' };
}
/**
* Send magic link for passwordless login
*/
export async function signInWithMagicLink(formData: FormData) {
const email = formData.get('email') as string;
const supabase = await createServerClient();
const { error } = await supabase.auth.signInWithOtp({
email,
options: {
emailRedirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/callback`,
},
});
if (error) {
return { error: error.message };
}
return { success: 'Check your email for the magic link' };
}
/**
* Request password reset
*/
export async function resetPassword(formData: FormData) {
const email = formData.get('email') as string;
const supabase = await createServerClient();
const { error } = await supabase.auth.resetPasswordForEmail(email, {
redirectTo: `${process.env.NEXT_PUBLIC_SITE_URL}/auth/reset-password`,
});
if (error) {
return { error: error.message };
}
return { success: 'Check your email for the password reset link' };
}