You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
4.9 KiB
171 lines
4.9 KiB
import {
|
|
Flex,
|
|
Box,
|
|
FormControl,
|
|
FormLabel,
|
|
Input,
|
|
InputGroup,
|
|
InputRightElement,
|
|
Stack,
|
|
Button,
|
|
Heading,
|
|
Text,
|
|
useColorModeValue,
|
|
useToast,
|
|
} from '@chakra-ui/react'
|
|
import Link from 'next/link'
|
|
import { useState } from 'react'
|
|
import { ViewIcon, ViewOffIcon } from '@chakra-ui/icons'
|
|
import {
|
|
loginWithGoogle,
|
|
register,
|
|
selectAuthUser,
|
|
selectAuthLoading,
|
|
} from '../store/authSlice'
|
|
import { useSelector } from 'react-redux'
|
|
import { RegisterRequestPayload } from '../services/types'
|
|
import { GoogleLogin } from '@react-oauth/google'
|
|
import { useAppDispatch } from '../store/hooks'
|
|
|
|
export default function RegisterPage() {
|
|
const [showPassword, setShowPassword] = useState(false)
|
|
const [credentials, setCredentials] = useState<RegisterRequestPayload>({
|
|
name: '',
|
|
email: '',
|
|
password: '',
|
|
})
|
|
const toast = useToast()
|
|
const dispatch = useAppDispatch()
|
|
const authUser = useSelector(selectAuthUser)
|
|
const loading = useSelector(selectAuthLoading)
|
|
|
|
const handleSubmit = async (e) => {
|
|
e.preventDefault()
|
|
if (!credentials.name || !credentials.email || !credentials.password) {
|
|
toast({
|
|
title: 'Error',
|
|
description: 'Please fill in all fields',
|
|
status: 'warning',
|
|
})
|
|
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(credentials.email)) {
|
|
toast({
|
|
title: 'Error',
|
|
description: 'Invalid email address',
|
|
status: 'warning',
|
|
})
|
|
} else if (credentials.password.length < 6) {
|
|
toast({
|
|
title: 'Error',
|
|
description: 'Password must be at least 6 characters',
|
|
status: 'warning',
|
|
})
|
|
} else {
|
|
dispatch(register(credentials))
|
|
}
|
|
}
|
|
const onChange = (e) => {
|
|
setCredentials({
|
|
...credentials,
|
|
[e.target.name]: e.target.value,
|
|
})
|
|
}
|
|
|
|
return (
|
|
<Flex
|
|
minH={'90vh'}
|
|
align={'center'}
|
|
justify={'center'}
|
|
bg={useColorModeValue('gray.50', 'gray.800')}
|
|
>
|
|
<Stack spacing={8} mx={'auto'} maxW={'lg'} py={12} px={6}>
|
|
<Stack align={'center'}>
|
|
<Heading fontSize={'2xl'} textAlign={'center'}>
|
|
Register now and start using your android device as an SMS Gateway
|
|
</Heading>
|
|
</Stack>
|
|
<Box
|
|
rounded={'lg'}
|
|
bg={useColorModeValue('white', 'gray.700')}
|
|
boxShadow={'lg'}
|
|
p={8}
|
|
>
|
|
<Stack spacing={4}>
|
|
<FormControl id='name' isRequired>
|
|
<FormLabel>Name</FormLabel>
|
|
<Input type='text' name='name' onChange={onChange} />
|
|
</FormControl>
|
|
<FormControl id='email' isRequired>
|
|
<FormLabel>Email</FormLabel>
|
|
<Input type='email' name='email' onChange={onChange} />
|
|
</FormControl>
|
|
<FormControl id='password' isRequired>
|
|
<FormLabel>Password</FormLabel>
|
|
<InputGroup>
|
|
<Input
|
|
type={showPassword ? 'text' : 'password'}
|
|
name='password'
|
|
onChange={onChange}
|
|
/>
|
|
<InputRightElement h={'full'}>
|
|
<Button
|
|
variant={'ghost'}
|
|
onClick={() =>
|
|
setShowPassword((showPassword) => !showPassword)
|
|
}
|
|
>
|
|
{showPassword ? <ViewIcon /> : <ViewOffIcon />}
|
|
</Button>
|
|
</InputRightElement>
|
|
</InputGroup>
|
|
</FormControl>
|
|
<Stack spacing={10} pt={2}>
|
|
<Button
|
|
loadingText='Submitting'
|
|
size='lg'
|
|
bg={'blue.400'}
|
|
color={'white'}
|
|
_hover={{
|
|
bg: 'blue.500',
|
|
}}
|
|
onClick={handleSubmit}
|
|
disabled={loading}
|
|
>
|
|
{loading ? 'Please wait...' : 'Register'}
|
|
</Button>
|
|
</Stack>
|
|
|
|
<Heading fontSize={'md'} textAlign={'center'}>
|
|
OR
|
|
</Heading>
|
|
<Box display='flex' justifyContent='center'>
|
|
<GoogleLogin
|
|
onSuccess={({ credential: idToken }) => {
|
|
dispatch(loginWithGoogle({ idToken }))
|
|
}}
|
|
onError={() => {
|
|
toast({
|
|
title: 'Error',
|
|
description: 'Something went wrong',
|
|
status: 'error',
|
|
})
|
|
}}
|
|
useOneTap={!authUser}
|
|
width={300}
|
|
size='large'
|
|
shape='pill'
|
|
locale='en'
|
|
theme='outline'
|
|
text='continue_with'
|
|
/>
|
|
</Box>
|
|
<Stack pt={6}>
|
|
<Text align={'center'}>
|
|
Already a user? <Link href='/login'>Login</Link>
|
|
</Text>
|
|
</Stack>
|
|
</Stack>
|
|
</Box>
|
|
</Stack>
|
|
</Flex>
|
|
)
|
|
}
|