mirror of
https://github.com/TurTaskProject/TurTaskWeb.git
synced 2025-12-20 06:24:07 +01:00
214 lines
6.9 KiB
JavaScript
214 lines
6.9 KiB
JavaScript
import React, { useState } from 'react';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import { useGoogleLogin } from '@react-oauth/google';
|
|
|
|
import Avatar from '@mui/material/Avatar';
|
|
import Button from '@mui/material/Button';
|
|
import CssBaseline from '@mui/material/CssBaseline';
|
|
import TextField from '@mui/material/TextField';
|
|
import FormControlLabel from '@mui/material/FormControlLabel';
|
|
import Checkbox from '@mui/material/Checkbox';
|
|
import Link from '@mui/material/Link';
|
|
import Divider from '@mui/material/Divider';
|
|
import Paper from '@mui/material/Paper';
|
|
import Box from '@mui/material/Box';
|
|
import Grid from '@mui/material/Grid';
|
|
import LockOutlinedIcon from '@mui/icons-material/LockOutlined';
|
|
import Typography from '@mui/material/Typography';
|
|
import { createTheme, ThemeProvider } from '@mui/material/styles';
|
|
|
|
import axiosapi from '../../api/axiosapi';
|
|
|
|
|
|
function Copyright(props) {
|
|
return (
|
|
<Typography variant="body2" color="text.secondary" align="center" {...props}>
|
|
{'Copyright © '}
|
|
<Link color="inherit" href="https://mui.com/">
|
|
Your Website
|
|
</Link>{' '}
|
|
{new Date().getFullYear()}
|
|
{'.'}
|
|
</Typography>
|
|
);
|
|
}
|
|
|
|
|
|
const defaultTheme = createTheme();
|
|
|
|
export default function SignInSide() {
|
|
|
|
const Navigate = useNavigate();
|
|
|
|
const [email, setEmail] = useState("");
|
|
const [username, setUsername] = useState("");
|
|
const [password, setPassword] = useState("");
|
|
|
|
const handleUsernameChange = (event) => {
|
|
setUsername(event.target.value);
|
|
}
|
|
|
|
const handleEmailChange = (event) => {
|
|
setEmail(event.target.value);
|
|
}
|
|
|
|
const handlePasswordChange = (event) => {
|
|
setPassword(event.target.value);
|
|
}
|
|
|
|
const handleSubmit = (event) => {
|
|
event.preventDefault();
|
|
|
|
// Send a POST request to the authentication API
|
|
axiosapi.apiUserLogin({
|
|
email: email,
|
|
username: username,
|
|
password: password
|
|
}).then(res => {
|
|
// On successful login, store tokens and set the authorization header
|
|
localStorage.setItem('access_token', res.data.access);
|
|
localStorage.setItem('refresh_token', res.data.refresh);
|
|
axiosapi.axiosInstance.defaults.headers['Authorization'] = "Bearer " + res.data.access;
|
|
Navigate('/testAuth');
|
|
}).catch(err => {
|
|
console.log('Login failed'); // Handle login failure
|
|
console.log(err)
|
|
});
|
|
}
|
|
|
|
const responseGoogle = async (response) => {
|
|
// Handle Google login response
|
|
let googleResponse = await axiosapi.googleLogin(response.access_token);
|
|
console.log('Google Response:\n', googleResponse);
|
|
|
|
if (googleResponse.status === 200) {
|
|
// Store Google login tokens and set the authorization header on success
|
|
localStorage.setItem('access_token', googleResponse.data.access_token);
|
|
localStorage.setItem('refresh_token', googleResponse.data.refresh_token);
|
|
axiosapi.axiosInstance.defaults.headers['Authorization'] = "Bearer " + googleResponse.data.access_token;
|
|
Navigate('/testAuth');
|
|
}
|
|
}
|
|
|
|
const googleLoginImplicit = useGoogleLogin({
|
|
// flow: 'auth-code',
|
|
onSuccess: async (response) => {
|
|
console.log(response);
|
|
|
|
try {
|
|
const loginResponse = await axiosapi.googleLogin(response.access_token);
|
|
if (loginResponse && loginResponse.data) {
|
|
const { access_token, refresh_token } = loginResponse.data;
|
|
|
|
// Save the tokens in localStorage
|
|
localStorage.setItem('access_token', access_token);
|
|
localStorage.setItem('refresh_token', refresh_token);
|
|
}
|
|
} catch (error) {
|
|
console.error('Error with the POST request:', error);
|
|
}
|
|
},
|
|
onError: errorResponse => console.log(errorResponse),
|
|
});
|
|
|
|
|
|
return (
|
|
<ThemeProvider theme={defaultTheme}>
|
|
<Grid container component="main" sx={{ height: '100vh' }}>
|
|
<CssBaseline />
|
|
<Grid
|
|
item
|
|
xs={false}
|
|
sm={4}
|
|
md={7}
|
|
sx={{
|
|
backgroundImage: 'url(https://source.unsplash.com/random?wallpapers)',
|
|
backgroundRepeat: 'no-repeat',
|
|
backgroundColor: (t) =>
|
|
t.palette.mode === 'light' ? t.palette.grey[50] : t.palette.grey[900],
|
|
backgroundSize: 'cover',
|
|
backgroundPosition: 'center',
|
|
}}
|
|
/>
|
|
<Grid item xs={12} sm={8} md={5} component={Paper} elevation={6} square>
|
|
<Box
|
|
sx={{
|
|
my: 8,
|
|
mx: 4,
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
alignItems: 'center',
|
|
}}
|
|
>
|
|
<Avatar sx={{ m: 1, bgcolor: 'secondary.main' }}>
|
|
<LockOutlinedIcon />
|
|
</Avatar>
|
|
<Typography component="h1" variant="h5">
|
|
Sign in
|
|
</Typography>
|
|
<Box component="form" noValidate onSubmit={handleSubmit} sx={{ mt: 1 }}>
|
|
<TextField
|
|
margin="normal"
|
|
required
|
|
fullWidth
|
|
id="email"
|
|
label="Email Address"
|
|
name="email"
|
|
autoComplete="email"
|
|
autoFocus
|
|
onChange={handleEmailChange}
|
|
/>
|
|
<TextField
|
|
margin="normal"
|
|
required
|
|
fullWidth
|
|
name="password"
|
|
label="Password"
|
|
type="password"
|
|
id="password"
|
|
autoComplete="current-password"
|
|
onChange={handlePasswordChange}
|
|
/>
|
|
<FormControlLabel
|
|
control={<Checkbox value="remember" color="primary" />}
|
|
label="Remember me"
|
|
/>
|
|
<Button
|
|
type="submit"
|
|
fullWidth
|
|
variant="contained"
|
|
sx={{ mt: 3, mb: 2 }}
|
|
>
|
|
Sign In
|
|
</Button>
|
|
<Divider>OR</Divider>
|
|
<Box py={2}>
|
|
<Button
|
|
fullWidth
|
|
variant="outlined"
|
|
color="secondary"
|
|
onClick={() => googleLoginImplicit()}
|
|
>
|
|
Sign in with Google 🚀
|
|
</Button>
|
|
</Box>
|
|
<Grid container>
|
|
<Grid item xs>
|
|
<Link href="#" variant="body2">
|
|
Forgot password?
|
|
</Link>
|
|
</Grid>
|
|
<Grid item>
|
|
<Link href="#" variant="body2">
|
|
{"Don't have an account? Sign Up"}
|
|
</Link>
|
|
</Grid>
|
|
</Grid>
|
|
<Copyright sx={{ mt: 5 }} />
|
|
</Box>
|
|
</Box>
|
|
</Grid>
|
|
</Grid>
|
|
</ThemeProvider>
|
|
);
|
|
} |