Files
myeasycms-v2/packages/supabase/src/hooks/use-sign-up-with-email-password.ts
Giancarlo Buomprisco 7ebff31475 Next.js Supabase V3 (#463)
Version 3 of the kit:
- Radix UI replaced with Base UI (using the Shadcn UI patterns)
- next-intl replaces react-i18next
- enhanceAction deprecated; usage moved to next-safe-action
- main layout now wrapped with [locale] path segment
- Teams only mode
- Layout updates
- Zod v4
- Next.js 16.2
- Typescript 6
- All other dependencies updated
- Removed deprecated Edge CSRF
- Dynamic Github Action runner
2026-03-24 13:40:38 +08:00

71 lines
1.7 KiB
TypeScript

import { useMutation } from '@tanstack/react-query';
import { useSupabase } from './use-supabase';
interface Credentials {
email: string;
password: string;
emailRedirectTo: string;
captchaToken?: string;
}
const _WeakPasswordReasons = ['length', 'characters', 'pwned'] as const;
export type WeakPasswordReason = (typeof _WeakPasswordReasons)[number];
export class WeakPasswordError extends Error {
readonly code = 'weak_password';
readonly reasons: WeakPasswordReason[];
constructor(reasons: WeakPasswordReason[]) {
super('weak_password');
this.name = 'WeakPasswordError';
this.reasons = reasons;
}
}
export function useSignUpWithEmailAndPassword() {
const client = useSupabase();
const mutationKey = ['auth', 'sign-up-with-email-password'];
const mutationFn = async (params: Credentials) => {
const { emailRedirectTo, captchaToken, ...credentials } = params;
const response = await client.auth.signUp({
...credentials,
options: {
emailRedirectTo,
captchaToken,
},
});
if (response.error) {
// Handle weak password errors specially (AuthWeakPasswordError from Supabase)
if (response.error.code === 'weak_password') {
const errorObj = response.error as unknown as {
reasons?: WeakPasswordReason[];
};
throw new WeakPasswordError(errorObj.reasons ?? []);
}
throw response.error;
}
const user = response.data?.user;
const identities = user?.identities ?? [];
// if the user has no identities, it means that the email is taken
if (identities.length === 0) {
throw new Error('User already registered');
}
return response.data;
};
return useMutation({
mutationKey,
mutationFn,
});
}