From bf2dfbc65e1f702c64fd7d76356339b9b37ef5f7 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Wed, 20 Apr 2022 01:17:32 +0200 Subject: feat(renderer): Insecure connection warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Show a more prominent warning for insecure connections with a button to try connecting over HTTPS if possible. Signed-off-by: Kristóf Marussy --- .../src/components/banner/NotificationBanner.tsx | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 packages/renderer/src/components/banner/NotificationBanner.tsx (limited to 'packages/renderer/src/components/banner/NotificationBanner.tsx') diff --git a/packages/renderer/src/components/banner/NotificationBanner.tsx b/packages/renderer/src/components/banner/NotificationBanner.tsx new file mode 100644 index 0000000..818f498 --- /dev/null +++ b/packages/renderer/src/components/banner/NotificationBanner.tsx @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2022 Kristóf Marussy + * + * This file is part of Sophie. + * + * Sophie is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Typography } from '@mui/material'; +import Alert, { AlertColor } from '@mui/material/Alert'; +import Box from '@mui/material/Box'; +import { styled } from '@mui/material/styles'; +import React, { ReactNode } from 'react'; +import { useTranslation } from 'react-i18next'; + +const NotificationBannerRoot = styled(Alert)(({ theme }) => ({ + padding: `7px ${theme.spacing(1)} 6px ${theme.spacing(2)}`, + // Match the height of the location bar. + minHeight: 53, + borderRadius: 0, + borderBottom: `1px solid ${theme.palette.divider}`, + '.MuiAlert-message': { + flexGrow: 1, + paddingTop: 0, + paddingBottom: 4, + display: 'flex', + flexWrap: 'wrap', + justifyContent: 'center', + }, + '.MuiAlert-action': { + paddingLeft: 0, + paddingRight: theme.spacing(1), + }, +})); + +const NotificationBannerText = styled(Typography)(({ theme }) => ({ + fontSize: 'inherit', + paddingTop: theme.spacing(1), + paddingRight: theme.spacing(2), + flexGrow: 9999, +})); + +const NotificationBannerButtons = styled(Box, { + shouldForwardProp: (prop) => prop !== 'hasCloseButton', +})<{ hasCloseButton: boolean }>(({ theme, hasCloseButton }) => ({ + fontSize: 'inherit', + paddingTop: theme.spacing(0.5), + paddingRight: hasCloseButton ? theme.spacing(0.5) : 0, + display: 'flex', + flexWrap: 'wrap', + flexGrow: 1, + gap: theme.spacing(1), + '.MuiButton-root': { + flexGrow: 1, + }, +})); + +export default function NotificationBanner({ + severity, + icon, + onClose, + buttons, + children, +}: { + severity?: AlertColor; + icon?: ReactNode; + onClose?: () => void; + buttons?: ReactNode; + children?: ReactNode; +}): JSX.Element { + const { t } = useTranslation(); + + return ( + /* eslint-disable react/jsx-props-no-spreading -- Conditionally set the onClose prop. */ + ('banner.close')} + > + {/* eslint-enable react/jsx-props-no-spreading */} + {children} + {buttons && ( + + {buttons} + + )} + + ); +} + +NotificationBanner.defaultProps = { + severity: 'success', + icon: false, + onClose: undefined, + buttons: undefined, + children: undefined, +}; -- cgit v1.2.3-54-g00ecf