From bf2dfbc65e1f702c64fd7d76356339b9b37ef5f7 Mon Sep 17 00:00:00 2001
From: Kristóf Marussy <kristof@marussy.com>
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 <kristof@marussy.com>
---
 .../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 <kristof@marussy.com>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ *
+ * 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. */
+    <NotificationBannerRoot
+      severity={severity ?? 'success'}
+      icon={icon ?? false}
+      {...(onClose === undefined ? {} : { onClose })}
+      closeText={t<string>('banner.close')}
+    >
+      {/* eslint-enable react/jsx-props-no-spreading */}
+      <NotificationBannerText>{children}</NotificationBannerText>
+      {buttons && (
+        <NotificationBannerButtons hasCloseButton={onClose !== undefined}>
+          {buttons}
+        </NotificationBannerButtons>
+      )}
+    </NotificationBannerRoot>
+  );
+}
+
+NotificationBanner.defaultProps = {
+  severity: 'success',
+  icon: false,
+  onClose: undefined,
+  buttons: undefined,
+  children: undefined,
+};
-- 
cgit v1.2.3-54-g00ecf

