import { useRouter, usePathname } from 'expo-router' import { useCallback, useMemo, useState } from 'react' import { Platform } from 'react-native' import useSocialAuth from './useSocialAuth' import { useAuth } from '../providers/auth-context' import { useLoading } from '../providers/loading-context' import { useTooltip } from '../providers/tooltip-context' const normalizeEmail = (rawEmail) => typeof rawEmail === 'string' ? rawEmail.trim().toLowerCase() : '' const normalizePassword = (rawPassword) => typeof rawPassword === 'string' ? rawPassword.trim() : '' const MIN_PASSWORD_LENGTH = 6 const useRegisterForm = () => { const router = useRouter() const pathname = usePathname() const { registerWithEmail, redirectUser } = useAuth() const { withLoading, isLoading } = useLoading() const { showTooltip } = useTooltip() const defaultEmail = __DEV__ ? `test@${Platform.OS}.com` : '' const defaultPassword = __DEV__ ? 'Minuit33' : '' const [email, setEmail] = useState(defaultEmail) const [password, setPassword] = useState(defaultPassword) const [confirmPassword, setConfirmPassword] = useState(defaultPassword) const { signInWithGoogle, signInWithApple, isAppleSignInAvailable } = useSocialAuth({ defaultAction: 'register', }) const handleSubmit = useCallback(async () => { if (isLoading) { return } const trimmedEmail = normalizeEmail(email) const trimmedPassword = normalizePassword(password) const trimmedConfirm = normalizePassword(confirmPassword) if (!trimmedEmail || !trimmedPassword || !trimmedConfirm) { showTooltip({ message: 'Merci de renseigner tous les champs requis.', type: 'error', }) return } if (trimmedPassword.length < MIN_PASSWORD_LENGTH) { showTooltip({ message: `Le mot de passe doit contenir au moins ${MIN_PASSWORD_LENGTH} caractères.`, type: 'error', }) return } if (trimmedPassword !== trimmedConfirm) { showTooltip({ message: 'Les mots de passe ne correspondent pas.', type: 'error', }) return } try { await withLoading(async () => { await registerWithEmail(trimmedEmail, trimmedPassword) }) await redirectUser({ router, pathname, isInitial: false }) showTooltip({ message: 'Compte créé ! Bienvenue chez Minuit.', type: 'success', }) } catch (error) { showTooltip({ message: error?.message || 'Impossible de créer votre compte pour le moment.', type: 'error', }) } }, [ confirmPassword, email, isLoading, password, redirectUser, registerWithEmail, router, pathname, showTooltip, withLoading, ]) const submitDisabled = useMemo(() => { const trimmedEmail = normalizeEmail(email) const trimmedPassword = normalizePassword(password) const trimmedConfirm = normalizePassword(confirmPassword) return ( !trimmedEmail || !trimmedPassword || !trimmedConfirm || trimmedPassword.length < MIN_PASSWORD_LENGTH || isLoading ) }, [confirmPassword, email, isLoading, password]) return { email, setEmail, password, setPassword, confirmPassword, setConfirmPassword, isLoading, submitDisabled, handleSubmit, signInWithGoogle, signInWithApple, isAppleSignInAvailable, } } export default useRegisterForm