341 lines
8.5 KiB
TypeScript
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.'
|
|
);
|
|
}
|
|
}
|