2022-01-15 15:45:46 +00:00
|
|
|
import {
|
2022-01-17 07:33:28 +00:00
|
|
|
Button,
|
|
|
|
FormControl,
|
|
|
|
FormLabel,
|
|
|
|
Input,
|
|
|
|
useToast,
|
|
|
|
VStack,
|
|
|
|
} from '@chakra-ui/react';
|
|
|
|
import React, { useEffect } from 'react';
|
|
|
|
import { useMutation } from 'urql';
|
|
|
|
|
|
|
|
import { AuthLayout } from '../layouts/AuthLayout';
|
|
|
|
import { AdminLogin, AdminSignup } from '../graphql/mutation';
|
|
|
|
import { useNavigate } from 'react-router-dom';
|
|
|
|
import { useAuthContext } from '../contexts/AuthContext';
|
|
|
|
import { capitalizeFirstLetter, hasAdminSecret } from '../utils';
|
2022-01-15 15:45:46 +00:00
|
|
|
|
|
|
|
export const Auth = () => {
|
2022-01-17 07:33:28 +00:00
|
|
|
const [loginResult, login] = useMutation(AdminLogin);
|
|
|
|
const [signUpResult, signup] = useMutation(AdminSignup);
|
|
|
|
const { setIsLoggedIn } = useAuthContext();
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
const toast = useToast();
|
|
|
|
const navigate = useNavigate();
|
|
|
|
const isLogin = hasAdminSecret();
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
const handleSubmit = (e: any) => {
|
|
|
|
e.preventDefault();
|
|
|
|
const formValues = [...e.target.elements].reduce((agg: any, elem: any) => {
|
|
|
|
if (elem.id) {
|
|
|
|
return {
|
|
|
|
...agg,
|
|
|
|
[elem.id]: elem.value,
|
|
|
|
};
|
|
|
|
}
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
return agg;
|
|
|
|
}, {});
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
(isLogin ? login : signup)({
|
|
|
|
secret: formValues['admin-secret'],
|
|
|
|
}).then((res) => {
|
|
|
|
setIsLoggedIn(true);
|
|
|
|
if (res.data) {
|
|
|
|
navigate('/', { replace: true });
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
const errors = isLogin ? loginResult.error : signUpResult.error;
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
useEffect(() => {
|
|
|
|
if (errors?.graphQLErrors) {
|
|
|
|
(errors?.graphQLErrors || []).map((error: any) => {
|
|
|
|
toast({
|
|
|
|
title: capitalizeFirstLetter(error.message),
|
|
|
|
isClosable: true,
|
|
|
|
status: 'error',
|
|
|
|
position: 'bottom-right',
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}, [errors]);
|
2022-01-15 15:45:46 +00:00
|
|
|
|
2022-01-17 07:33:28 +00:00
|
|
|
return (
|
|
|
|
<AuthLayout>
|
|
|
|
<form onSubmit={handleSubmit}>
|
|
|
|
<VStack spacing="2.5" justify="space-between">
|
|
|
|
<FormControl isRequired>
|
|
|
|
<FormLabel htmlFor="admin-secret">
|
|
|
|
{isLogin ? 'Enter' : 'Setup'} Admin Secret
|
|
|
|
</FormLabel>
|
|
|
|
<Input
|
|
|
|
size="lg"
|
|
|
|
id="admin-secret"
|
|
|
|
placeholder="Admin secret"
|
|
|
|
type="password"
|
|
|
|
minLength={!isLogin ? 6 : 1}
|
|
|
|
/>
|
|
|
|
</FormControl>
|
|
|
|
<Button
|
|
|
|
isLoading={signUpResult.fetching || loginResult.fetching}
|
|
|
|
colorScheme="blue"
|
|
|
|
size="lg"
|
|
|
|
w="100%"
|
|
|
|
d="block"
|
|
|
|
type="submit"
|
|
|
|
>
|
|
|
|
{isLogin ? 'Login' : 'Sign up'}
|
|
|
|
</Button>
|
|
|
|
</VStack>
|
|
|
|
</form>
|
|
|
|
</AuthLayout>
|
|
|
|
);
|
2022-01-15 15:45:46 +00:00
|
|
|
};
|