68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
import { useMutation } from '@tanstack/react-query';
|
|
|
|
import { medusaLoginOrRegister } from '../../../features/medusa-storefront/src/lib/data/customer';
|
|
import { useSupabase } from './use-supabase';
|
|
|
|
interface Credentials {
|
|
email: string;
|
|
password: string;
|
|
emailRedirectTo: string;
|
|
captchaToken?: string;
|
|
}
|
|
|
|
export function useSignUpWithEmailAndPassword() {
|
|
const client = useSupabase();
|
|
const mutationKey = ['auth', 'sign-up-with-email-password'];
|
|
|
|
const mutationFn = async (params: Credentials) => {
|
|
const { emailRedirectTo, captchaToken, ...credentials } = params;
|
|
|
|
// TODO?: should be a validation of unique personal code before registration
|
|
const response = await client.auth.signUp({
|
|
...credentials,
|
|
options: {
|
|
emailRedirectTo,
|
|
captchaToken,
|
|
},
|
|
});
|
|
|
|
if (response.error) {
|
|
throw response.error.message;
|
|
}
|
|
|
|
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');
|
|
}
|
|
|
|
if ('email' in credentials) {
|
|
try {
|
|
const medusaAccountId = await medusaLoginOrRegister({
|
|
email: credentials.email,
|
|
password: credentials.password,
|
|
isDevPasswordLogin: true,
|
|
});
|
|
await client
|
|
.schema('medreport')
|
|
.from('accounts')
|
|
.update({ medusa_account_id: medusaAccountId })
|
|
.eq('primary_owner_user_id', user!.id)
|
|
.eq('is_personal_account', true);
|
|
} catch (error) {
|
|
await client.auth.signOut();
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
return response.data;
|
|
};
|
|
|
|
return useMutation({
|
|
mutationKey,
|
|
mutationFn,
|
|
});
|
|
}
|