'use server'; import 'server-only'; import { createServerClient } from '@/utils/supabase'; import { headers } from 'next/headers'; import type { User, Result } from '@/utils/supabase'; export const signUp = async ( formData: FormData, ): Promise> => { const name = formData.get('name') as string; const email = formData.get('email') as string; const password = formData.get('password') as string; const supabase = await createServerClient(); const origin = (await headers()).get('origin'); if (!email || !password) { return { success: false, error: 'Email and password are required' }; } const { error } = await supabase.auth.signUp({ email, password, options: { emailRedirectTo: `${origin}/auth/callback`, data: { full_name: name, email, provider: 'email', }, }, }); if (error) { return { success: false, error: error.message }; } else { return { success: true, data: 'Thanks for signing up! Please check your email for a verification link.', }; } }; export const signIn = async (formData: FormData): Promise> => { 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 { success: false, error: error.message }; } else { return { success: true, data: null }; } }; type OAuthReturn = { provider: string; url: string; }; export const signInWithMicrosoft = async (): Promise> => { const supabase = await createServerClient(); const origin = (await headers()).get('origin'); const { data, error } = await supabase.auth.signInWithOAuth({ provider: 'azure', options: { scopes: 'openid profile email offline_access', redirectTo: `${origin}/auth/callback?redirect_to=/auth/success`, }, }); if (error) return { success: false, error: error.message }; return { success: true, data }; }; export const signInWithApple = async (): Promise> => { const supabase = await createServerClient(); const origin = process.env.BASE_URL!; const { data, error } = await supabase.auth.signInWithOAuth({ provider: 'apple', options: { scopes: 'openid profile email offline_access', redirectTo: `${origin}/auth/callback?redirect_to=/auth/success`, }, }); if (error) return { success: false, error: error.message }; return { success: true, data }; }; export const forgotPassword = async ( formData: FormData, ): Promise> => { const email = formData.get('email') as string; const supabase = await createServerClient(); const origin = (await headers()).get('origin'); if (!email) { return { success: false, error: 'Email is required' }; } const { error } = await supabase.auth.resetPasswordForEmail(email, { redirectTo: `${origin}/auth/callback?redirect_to=/profile`, }); if (error) { return { success: false, error: 'Could not reset password' }; } return { success: true, data: 'Check your email for a link to reset your password.', }; }; export const resetPassword = async ( formData: FormData, ): Promise> => { const password = formData.get('password') as string; const confirmPassword = formData.get('confirmPassword') as string; if (!password || !confirmPassword) { return { success: false, error: 'Password and confirm password are required!', }; } const supabase = await createServerClient(); if (password !== confirmPassword) { return { success: false, error: 'Passwords do not match!' }; } const { error } = await supabase.auth.updateUser({ password, }); if (error) { return { success: false, error: `Password update failed: ${error.message}`, }; } return { success: true, data: null }; }; export const signOut = async (): Promise> => { const supabase = await createServerClient(); const { error } = await supabase.auth.signOut(); if (error) return { success: false, error: error.message }; return { success: true, data: null }; }; export const getUser = async (): Promise> => { try { const supabase = await createServerClient(); const { data, error } = await supabase.auth.getUser(); if (error) throw error; return { success: true, data: data.user }; } catch { return { success: false, error: `Could not get user!` }; } };