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, }); 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, }); }