Fixes and tickets

This commit is contained in:
Thomas Demirdjian
2025-10-28 15:43:18 +01:00
parent 2599a25d77
commit d1be3c19a2
31 changed files with 6663 additions and 795 deletions
+124
View File
@@ -0,0 +1,124 @@
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;