161 lines
4.5 KiB
TypeScript
161 lines
4.5 KiB
TypeScript
'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<Result<string | null>> => {
|
|
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<Result<null>> => {
|
|
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<Result<OAuthReturn>> => {
|
|
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<Result<OAuthReturn>> => {
|
|
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<Result<string | null>> => {
|
|
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<Result<null>> => {
|
|
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<Result<null>> => {
|
|
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<Result<User>> => {
|
|
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!` };
|
|
}
|
|
};
|