'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',
'Хмм... Нещо се обърка.',
'Името ви не можа да бъде обновено.'
);
}
}