'use client'; import { login, register, refreshLoggedIn } from '@/api/auth'; import { User } from '@/api/auth.types'; import { Modal, Container, Title, Anchor, Paper, TextInput, Button, PasswordInput, Group, Checkbox, Text } from '@mantine/core'; import { useForm } from '@mantine/form'; import { notifications } from '@mantine/notifications'; interface LoginModalProps { type?: string; toggle: any; setUser: (user: User) => void; setRefreshId: (id: NodeJS.Timeout) => void; } export function LoginModal({ type, toggle, setUser, setRefreshId }: LoginModalProps) { function passwordValidator(value: string) { if (value.trim().length < 10) { return 'Password must be at least 10 characters'; } if (value.trim().length >= 128) { return 'Password must be at most 128 characters'; } if (!/(\d)/.test(value)) { return 'Password must contain at least one number'; } if (!/[a-z]/.test(value)) { return 'Password must contain at least one lowercase letter'; } if (!/[A-Z]/.test(value)) { return 'Password must contain at least one uppercase letter'; } if (!/[!@#$%^&*]/.test(value)) { return 'Password must contain at least one special character'; } return null; } function emailValidator(value: string) { if (value.trim().length == 0) { return 'Email is required'; } if (!/^\S+@\S+$/.test(value)) { return 'Invalid email'; } return null; } const registerForm = useForm({ initialValues: { firstName: '', lastName: '', email: '', password: '' }, validate: { firstName: (value) => (value.trim().length > 0 ? null : 'First name is required'), lastName: (value) => (value.trim().length > 0 ? null : 'Last name is required'), email: emailValidator, password: passwordValidator } }); const loginForm = useForm({ initialValues: { email: '', password: '', remember: false } }); const resetForm = useForm({ initialValues: { email: '' } }); function onClose() { toggle(undefined); registerForm.reset(); resetForm.reset(); if (!loginForm.values.remember) { loginForm.reset(); } } return ( {type == 'reset' ? ( Reset password Enter your email and we will send you a link to reset your password.{' '} toggle('login')}> Go Back
console.log(values))}>
) : type == 'register' ? ( Create account Already have an account?{' '} toggle('login')}> Sign in
{ const id = notifications.show({ loading: true, title: `Creating account`, message: `Please wait...`, autoClose: false, withCloseButton: false }); const registerResponse = await register({ first_name: values.firstName, last_name: values.lastName, email: values.email, password: values.password }); if (registerResponse) { const loginResponse = await login(values.email, values.password); if (loginResponse) { setUser(loginResponse.user); setRefreshId(refreshLoggedIn()); onClose(); notifications.update({ id, title: `Account created`, message: `Welcome ${loginResponse.user.first_name}!`, color: 'green', autoClose: 2000, loading: false }); } else { notifications.update({ id, title: `Unable to Login`, message: `Please try again.`, color: 'red', autoClose: 2000, loading: false }); } } else { notifications.update({ id, title: `Unable to Register`, message: `Please try again.`, color: 'error', autoClose: 2000, loading: false }); } })} >
) : ( Welcome back! Do not have an account yet?{' '} toggle('register')}> Create account
{ const response = await login(values.email, values.password); if (response) { setUser(response.user); setRefreshId(refreshLoggedIn()); onClose(); } else { notifications.show({ title: `Unable to Login`, message: `Please try again.`, color: 'red', autoClose: 2000 }); } })} > toggle('reset')}> Forgot password?
)}
); }