Files
vf_react/boilerplate-chakra-pro-main/utils/auth-helpers/server.ts
2025-11-22 11:41:56 +08:00

341 lines
8.5 KiB
TypeScript

'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 '/dashboard/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(
'/dashboard/signin/email_signin',
'Invalid email address.',
'Please try again.'
);
}
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(
'/dashboard/signin/email_signin',
'You could not be signed in.',
error.message
);
} else if (data) {
cookieStore.set('preferredSignInView', 'email_signin', { path: '/' });
redirectPath = getStatusRedirect(
'/dashboard/signin/email_signin',
'Success!',
'Please check your email for a magic link. You may now close this tab.',
true
);
} else {
redirectPath = getErrorRedirect(
'/dashboard/signin/email_signin',
'Hmm... Something went wrong.',
'You could not be signed in.'
);
}
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(
'/dashboard/signin/forgot_password',
'Invalid email address.',
'Please try again.'
);
}
const supabase = createClient();
const { data, error } = await supabase.auth.resetPasswordForEmail(email, {
redirectTo: callbackURL
});
if (error) {
redirectPath = getErrorRedirect(
'/dashboard/signin/forgot_password',
error.message,
'Please try again.'
);
} else if (data) {
redirectPath = getStatusRedirect(
'/dashboard/signin/forgot_password',
'Success!',
'Please check your email for a password reset link. You may now close this tab.',
true
);
} else {
redirectPath = getErrorRedirect(
'/dashboard/signin/forgot_password',
'Hmm... Something went wrong.',
'Password reset email could not be sent.'
);
}
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(
'/dashboard/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(
'/dashboard/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(
'/dashboard/signin/signup',
'Invalid email address.',
'Please try again.'
);
}
const supabase = createClient();
const { error, data } = await supabase.auth.signUp({
email,
password,
options: {
emailRedirectTo: callbackURL
}
});
if (error) {
redirectPath = getErrorRedirect(
'/dashboard/signin/signup',
'Sign up failed.',
error.message
);
} else if (data.session) {
redirectPath = getStatusRedirect('/', 'Success!', 'You are now signed in.');
} else if (
data.user &&
data.user.identities &&
data.user.identities.length == 0
) {
redirectPath = getErrorRedirect(
'/dashboard/signin/signup',
'Sign up failed.',
'There is already an account associated with this email address. Try resetting your password.'
);
} else if (data.user) {
redirectPath = getStatusRedirect(
'/',
'Success!',
'Please check your email for a confirmation link. You may now close this tab.'
);
} else {
redirectPath = getErrorRedirect(
'/dashboard/signin/signup',
'Hmm... Something went wrong.',
'You could not be signed up.'
);
}
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(
'/dashboard/signin/update_password',
'Your password could not be updated.',
'Passwords do not match.'
);
}
const supabase = createClient();
const { error, data } = await supabase.auth.updateUser({
password
});
if (error) {
redirectPath = getErrorRedirect(
'/dashboard/signin/update_password',
'Your password could not be updated.',
error.message
);
} else if (data.user) {
redirectPath = getStatusRedirect(
'/',
'Success!',
'Your password has been updated.'
);
} else {
redirectPath = getErrorRedirect(
'/dashboard/signin/update_password',
'Hmm... Something went wrong.',
'Your password could not be updated.'
);
}
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(
'/dashboard/settings',
'Your email could not be updated.',
'Invalid email address.'
);
}
const supabase = createClient();
const callbackUrl = getURL(
getStatusRedirect(
'/dashboard/settings',
'Success!',
`Your email has been updated.`
)
);
const { error } = await supabase.auth.updateUser(
{ email: newEmail },
{
emailRedirectTo: callbackUrl
}
);
if (error) {
return getErrorRedirect(
'/dashboard/settings',
'Your email could not be updated.',
error.message
);
} else {
return getStatusRedirect(
'/dashboard/settings',
'Confirmation emails sent.',
`You will need to confirm the update by clicking the links sent to both the old and new email addresses.`
);
}
}
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(
'/dashboard/settings',
'Your name could not be updated.',
error.message
);
} else if (data.user) {
return getStatusRedirect(
'/dashboard/settings',
'Success!',
'Your name has been updated.'
);
} else {
return getErrorRedirect(
'/dashboard/settings',
'Hmm... Something went wrong.',
'Your name could not be updated.'
);
}
}