@state-less/leap-frontend
Version:
A collection of open source fullstack services powered by React Server
56 lines (55 loc) • 3.07 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
import { Avatar, Button, useMediaQuery, useTheme, IconButton, } from '@mui/material';
import { authContext } from '@state-less/react-client';
import { useContext, useState } from 'react';
import GoogleLogin from 'react-google-login';
import { Google as GoogleIcon } from '@mui/icons-material';
import { stateContext } from '../provider/StateProvider.js';
import { Menu, MenuItem } from '@mui/material';
const logError = () => { };
const isGoogleLoginResponse = (val) => {
return val?.tokenId !== undefined && val.accessToken !== undefined;
};
export const LoggedInGoogleButton = () => {
const { session, logout } = useContext(authContext);
const { state } = useContext(stateContext);
const [anchorEl, setAnchorEl] = useState(null);
const open = Boolean(anchorEl);
const handleClick = (event) => {
setAnchorEl(event.currentTarget);
};
const handleClose = () => {
setAnchorEl(null);
};
if (session.strategy !== 'google') {
return null;
}
const decoded = session.strategies?.google?.decoded;
const theme = useTheme();
const lessThanSmall = useMediaQuery(theme.breakpoints.down('sm'));
const MDButton = lessThanSmall ? IconButton : Button;
return (_jsxs(_Fragment, { children: [_jsxs(MDButton, { id: "basic-button", "aria-controls": open ? 'basic-menu' : undefined, "aria-haspopup": "true", "aria-expanded": open ? 'true' : undefined, onClick: handleClick, color: state.animatedBackground ? 'info' : 'info', children: [_jsx(Avatar, { src: decoded?.picture, sx: { width: 24, height: 24, mr: 1 } }), !lessThanSmall && decoded?.name] }), _jsx(Menu, { id: "basic-menu", anchorEl: anchorEl, open: open, onClose: handleClose, MenuListProps: {
'aria-labelledby': 'basic-button',
}, children: _jsx(MenuItem, { onClick: logout, children: "Logout" }) })] }));
};
export const GoogleLoginButton = ({ clientId }) => {
const { session, authenticate } = useContext(authContext);
const { state } = useContext(stateContext);
return session?.strategy === 'google' ? (_jsx(LoggedInGoogleButton, {})) : (_jsx(GoogleLogin, { clientId: clientId, buttonText: "Login", onSuccess: (response) => {
if (!isGoogleLoginResponse(response)) {
return;
}
const { tokenId, accessToken } = response;
authenticate({
strategy: 'google',
data: { accessToken, idToken: tokenId },
});
}, render: (props) => {
return (_jsxs(Button, { color: state.animatedBackground ? 'info' : 'info', style: {
backgroundColor: '#001f3f',
backgroundImage: 'linear-gradient(to bottom, #001f3f, #0F9D58)',
color: '#fff',
fontSize: '14px',
}, ...props, children: [_jsx(GoogleIcon, { sx: { mr: 1 } }), "Login"] }));
}, onFailure: logError, cookiePolicy: 'single_host_origin' }));
};