'use server'; import { createClient } from '@/utils/supabase/server'; import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; import { getURL, getErrorRedirect, getStatusRedirect } from 'utils/helpers'; import { getAuthTypes } from 'utils/auth-helpers/settings'; function isValidEmail(email: string) { var regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/; return regex.test(email); } export async function redirectToPath(path: string) { return redirect(path); } export async function SignOut(formData: FormData) { const pathName = String(formData.get('pathName')).trim(); const supabase = createClient(); const { error } = await supabase.auth.signOut(); if (error) { return getErrorRedirect( pathName, 'Hmm... Something went wrong.', 'You could not be signed out.' ); } return '/signin'; } export async function signInWithEmail(formData: FormData) { const cookieStore = cookies(); const callbackURL = getURL('/auth/callback'); const email = String(formData.get('email')).trim(); let redirectPath: string; if (!isValidEmail(email)) { redirectPath = getErrorRedirect( '/signin/email_signin', 'Невалиден имейл адрес.', 'Моля, опитайте отново.' ); } const supabase = createClient(); let options = { emailRedirectTo: callbackURL, shouldCreateUser: true }; // If allowPassword is false, do not create a new user const { allowPassword } = getAuthTypes(); if (allowPassword) options.shouldCreateUser = false; const { data, error } = await supabase.auth.signInWithOtp({ email, options: options }); if (error) { redirectPath = getErrorRedirect( '/signin/email_signin', 'Не можахме да ви впишем в системата.', error.message ); } else if (data) { cookieStore.set('preferredSignInView', 'email_signin', { path: '/' }); redirectPath = getStatusRedirect( '/signin/email_signin', 'Успех!', 'Моля, проверете имейла си за магически линк. Можете да затворите този прозорец.', true ); } else { redirectPath = getErrorRedirect( '/signin/email_signin', 'Хмм... Нещо се обърка.', 'Не можахме да ви впишем в системата.' ); } return redirectPath; } export async function requestPasswordUpdate(formData: FormData) { const callbackURL = getURL('/auth/reset_password'); // Get form data const email = String(formData.get('email')).trim(); let redirectPath: string; if (!isValidEmail(email)) { redirectPath = getErrorRedirect( '/signin/forgot_password', 'Невалиден имейл адрес.', 'Моля, опитайте отново.' ); } const supabase = createClient(); const { data, error } = await supabase.auth.resetPasswordForEmail(email, { redirectTo: callbackURL }); if (error) { redirectPath = getErrorRedirect( '/signin/forgot_password', error.message, 'Моля, опитайте отново.' ); } else if (data) { redirectPath = getStatusRedirect( '/signin/forgot_password', 'Успех!', 'Моля, проверете имейла си за линк за възстановяване на паролата. Можете да затворите този прозорец.', true ); } else { redirectPath = getErrorRedirect( '/signin/forgot_password', 'Хмм... Нещо се обърка.', 'Имейлът за възстановяване на паролата не можа да бъде изпратен.' ); } return redirectPath; } export async function signInWithPassword(formData: FormData) { const cookieStore = cookies(); const email = String(formData.get('email')).trim(); const password = String(formData.get('password')).trim(); let redirectPath: string; const supabase = createClient(); const { error, data } = await supabase.auth.signInWithPassword({ email, password }); if (error) { redirectPath = getErrorRedirect( '/signin/password_signin', 'Sign in failed.', error.message ); } else if (data.user) { cookieStore.set('preferredSignInView', 'password_signin', { path: '/' }); redirectPath = getStatusRedirect('/', 'Success!', 'You are now signed in.'); } else { redirectPath = getErrorRedirect( '/signin/password_signin', 'Hmm... Something went wrong.', 'You could not be signed in.' ); } return redirectPath; } export async function signUp(formData: FormData) { const callbackURL = getURL('/auth/callback'); const email = String(formData.get('email')).trim(); const password = String(formData.get('password')).trim(); let redirectPath: string; if (!isValidEmail(email)) { redirectPath = getErrorRedirect( '/signin/signup', 'Невалиден имейл адрес.', 'Моля, опитайте отново.' ); } const supabase = createClient(); const { error, data } = await supabase.auth.signUp({ email, password, options: { emailRedirectTo: callbackURL } }); if (error) { redirectPath = getErrorRedirect( '/signin/signup', 'Регистрацията не беше успешна.', error.message ); } else if (data.session) { redirectPath = getStatusRedirect('/', 'Успех!', 'Вие сте вписани в системата.'); } else if ( data.user && data.user.identities && data.user.identities.length == 0 ) { redirectPath = getErrorRedirect( '/signin/signup', 'Регистрацията не беше успешна.', 'Вече има акаунт с този имейл адрес. Опитайте да възстановите паролата си.' ); } else if (data.user) { redirectPath = getStatusRedirect( '/', 'Успех!', 'Моля, проверете имейла си за линк за потвърждение. Можете да затворите този прозорец.' ); } else { redirectPath = getErrorRedirect( '/signin/signup', 'Хмм... Нещо се обърка.', 'Не можахме да ви регистрираме.' ); } return redirectPath; } export async function updatePassword(formData: FormData) { const password = String(formData.get('password')).trim(); const passwordConfirm = String(formData.get('passwordConfirm')).trim(); let redirectPath: string; // Check that the password and confirmation match if (password !== passwordConfirm) { redirectPath = getErrorRedirect( '/signin/update_password', 'Паролата ви не можа да бъде обновена.', 'Паролите не съвпадат.' ); } const supabase = createClient(); const { error, data } = await supabase.auth.updateUser({ password }); if (error) { redirectPath = getErrorRedirect( '/signin/update_password', 'Паролата ви не можа да бъде обновена.', error.message ); } else if (data.user) { redirectPath = getStatusRedirect( '/', 'Успех!', 'Вашата парола беше обновена.' ); } else { redirectPath = getErrorRedirect( '/signin/update_password', 'Хмм... Нещо се обърка.', 'Паролата ви не можа да бъде обновена.' ); } return redirectPath; } export async function updateEmail(formData: FormData) { // Get form data const newEmail = String(formData.get('newEmail')).trim(); // Check that the email is valid if (!isValidEmail(newEmail)) { return getErrorRedirect( '/account', 'Имейлът ви не можа да бъде обновен.', 'Невалиден имейл адрес.' ); } const supabase = createClient(); const callbackUrl = getURL( getStatusRedirect('/account', 'Успех!', `Вашият имейл беше обновен.`) ); const { error } = await supabase.auth.updateUser( { email: newEmail }, { emailRedirectTo: callbackUrl } ); if (error) { return getErrorRedirect( '/account', 'Имейлът ви не можа да бъде обновен.', error.message ); } else { return getStatusRedirect( '/account', 'Изпратени са имейли за потвърждение.', `Трябва да потвърдите промяната като кликнете върху линковете, изпратени на стария и новия имейл адрес.` ); } } export async function updateName(formData: FormData) { // Get form data const fullName = String(formData.get('fullName')).trim(); const supabase = createClient(); const { error, data } = await supabase.auth.updateUser({ data: { full_name: fullName } }); if (error) { return getErrorRedirect( '/account', 'Името ви не можа да бъде обновено.', error.message ); } else if (data.user) { return getStatusRedirect( '/account', 'Успех!', 'Вашето име беше обновено.' ); } else { return getErrorRedirect( '/account', 'Хмм... Нещо се обърка.', 'Името ви не можа да бъде обновено.' ); } }