UNPKG

mirador

Version:

An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.

157 lines (145 loc) 4.81 kB
import { useState } from 'react'; import PropTypes from 'prop-types'; import { alpha, styled } from '@mui/material/styles'; import Button from '@mui/material/Button'; import Paper from '@mui/material/Paper'; import Collapse from '@mui/material/Collapse'; import DialogActions from '@mui/material/DialogActions'; import Typography from '@mui/material/Typography'; import LockIcon from '@mui/icons-material/LockSharp'; import { useTranslation } from 'react-i18next'; import SanitizedHtml from '../containers/SanitizedHtml'; import { PluginHook } from './PluginHook'; const StyledTopBar = styled('div')(({ theme }) => ({ backgroundColor: theme.palette.secondary.main, color: theme.palette.secondary.contrastText, alignItems: 'center', display: 'flex', padding: theme.spacing(1), })); const StyledFauxButton = styled('span')(({ theme }) => ({ marginLeft: theme.spacing(2.5), })); /** */ export function WindowAuthenticationBar({ confirmButton = undefined, continueLabel = undefined, header = undefined, description = undefined, icon = undefined, label, ruleSet = 'iiif', hasLogoutService = true, status = undefined, ConfirmProps = {}, onConfirm, }) { const { t } = useTranslation(); const pluginProps = arguments[0]; // eslint-disable-line prefer-rest-params const [open, setOpen] = useState(false); /** */ const onSubmit = () => { setOpen(false); onConfirm(); }; if (status === 'ok' && !hasLogoutService) return null; const button = ( <Button onClick={onSubmit} color="secondary" sx={(theme) => ({ backgroundColor: theme.palette.secondary.contrastText, lineHeight: '1.5rem', })} {...ConfirmProps} > {confirmButton || t('login')} </Button> ); if (!description && !header) { return ( <Paper square elevation={4} color="secondary" > <StyledTopBar> { icon || ( <LockIcon sx={{ marginInlineEnd: 5 }} /> ) } <Typography component="h3" variant="body1" color="inherit"> { ruleSet ? <SanitizedHtml htmlString={label} ruleSet={ruleSet} /> : label } </Typography> <PluginHook targetName="WindowAuthenticationBar" {...pluginProps} /> { button } </StyledTopBar> </Paper> ); } return ( <Paper square elevation={4} color="secondary" > <Button fullWidth onClick={() => setOpen(true)} component="div" color="inherit" sx={(theme) => ({ '&:hover': { backgroundColor: theme.palette.secondary.main, }, backgroundColor: theme.palette.secondary.main, borderRadius: 0, color: theme.palette.secondary.contrastText, justifyContent: 'start', textTransform: 'none', })} > { icon || ( <LockIcon sx={{ marginInlineEnd: 1.5 }} /> ) } <Typography sx={{ paddingBlockEnd: 1, paddingBlockStart: 1 }} component="h3" variant="body1" color="inherit"> { ruleSet ? <SanitizedHtml htmlString={label} ruleSet={ruleSet} /> : label } </Typography> <PluginHook targetName="WindowAuthenticationBar" {...pluginProps} /> <StyledFauxButton> { !open && ( <Typography variant="button" color="inherit"> { continueLabel || t('continue') } </Typography> )} </StyledFauxButton> </Button> <Collapse sx={(theme) => ({ backgroundColor: theme.palette.secondary.main, color: theme.palette.secondary.contrastText, paddingInlineEnd: theme.spacing(1), paddingInlineStart: theme.spacing(1), })} in={open} onClose={() => setOpen(false)} > <Typography variant="body1" color="inherit"> { ruleSet ? <SanitizedHtml htmlString={header} ruleSet={ruleSet} /> : header } { header && description ? ': ' : '' } { ruleSet ? <SanitizedHtml htmlString={description} ruleSet={ruleSet} /> : description } </Typography> <DialogActions> <Button onClick={() => setOpen(false)} color="inherit"> { t('cancel') } </Button> { button } </DialogActions> </Collapse> </Paper> ); } WindowAuthenticationBar.propTypes = { confirmButton: PropTypes.string, ConfirmProps: PropTypes.object, // eslint-disable-line react/forbid-prop-types continueLabel: PropTypes.string, description: PropTypes.node, hasLogoutService: PropTypes.bool, header: PropTypes.node, icon: PropTypes.node, label: PropTypes.node.isRequired, onConfirm: PropTypes.func.isRequired, ruleSet: PropTypes.string, status: PropTypes.string, };