|
import React from "react"; |
|
import { |
|
Box, |
|
Typography, |
|
Button, |
|
Chip, |
|
Stack, |
|
Paper, |
|
CircularProgress, |
|
} from "@mui/material"; |
|
import HFLogo from "../Logo/HFLogo"; |
|
import { useAuth } from "../../hooks/useAuth"; |
|
import LogoutIcon from "@mui/icons-material/Logout"; |
|
import { useNavigate } from "react-router-dom"; |
|
|
|
function AuthContainer({ actionText = "DO_ACTION" }) { |
|
const { isAuthenticated, user, login, logout, loading } = useAuth(); |
|
const navigate = useNavigate(); |
|
|
|
const handleLogout = () => { |
|
if (isAuthenticated && logout) { |
|
logout(); |
|
navigate("/", { replace: true }); |
|
window.location.reload(); |
|
} |
|
}; |
|
|
|
if (loading) { |
|
return ( |
|
<Paper |
|
elevation={0} |
|
sx={{ |
|
p: 3, |
|
mb: 4, |
|
border: "1px solid", |
|
borderColor: "grey.300", |
|
display: "flex", |
|
flexDirection: "column", |
|
alignItems: "center", |
|
gap: 2, |
|
}} |
|
> |
|
<CircularProgress size={24} /> |
|
</Paper> |
|
); |
|
} |
|
|
|
if (!isAuthenticated) { |
|
return ( |
|
<Paper |
|
elevation={0} |
|
sx={{ |
|
p: 3, |
|
mb: 4, |
|
border: "1px solid", |
|
borderColor: "grey.300", |
|
display: "flex", |
|
flexDirection: "column", |
|
alignItems: "center", |
|
gap: 2, |
|
}} |
|
> |
|
<Typography variant="h6" align="center"> |
|
Login to {actionText} |
|
</Typography> |
|
<Typography variant="body2" color="text.secondary" align="center"> |
|
You need to be logged in with your Hugging Face account to{" "} |
|
{actionText.toLowerCase()} |
|
</Typography> |
|
<Button |
|
variant="contained" |
|
onClick={login} |
|
startIcon={ |
|
<Box |
|
sx={{ |
|
width: 20, |
|
height: 20, |
|
display: "flex", |
|
alignItems: "center", |
|
}} |
|
> |
|
<HFLogo /> |
|
</Box> |
|
} |
|
sx={{ |
|
textTransform: "none", |
|
fontWeight: 600, |
|
py: 1, |
|
px: 2, |
|
}} |
|
> |
|
Sign in with Hugging Face |
|
</Button> |
|
</Paper> |
|
); |
|
} |
|
|
|
return ( |
|
<Paper |
|
elevation={0} |
|
sx={{ p: 2, border: "1px solid", borderColor: "grey.300", mb: 4 }} |
|
> |
|
<Stack |
|
direction="row" |
|
spacing={2} |
|
alignItems="center" |
|
justifyContent="space-between" |
|
> |
|
<Stack direction="row" spacing={1} alignItems="center"> |
|
<Typography variant="body1"> |
|
Connected as <strong>{user?.username}</strong> |
|
</Typography> |
|
<Chip |
|
label={`Ready to ${actionText}`} |
|
color="success" |
|
size="small" |
|
variant="outlined" |
|
/> |
|
</Stack> |
|
<Button |
|
variant="contained" |
|
onClick={handleLogout} |
|
endIcon={<LogoutIcon />} |
|
color="primary" |
|
sx={{ |
|
minWidth: 120, |
|
height: 36, |
|
textTransform: "none", |
|
fontSize: "0.9375rem", |
|
}} |
|
> |
|
Logout |
|
</Button> |
|
</Stack> |
|
</Paper> |
|
); |
|
} |
|
|
|
export default AuthContainer; |
|
|