/* * 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 IconHttps from '@mui/icons-material/HttpsOutlined'; import IconHttp from '@mui/icons-material/NoEncryption'; import IconGlobe from '@mui/icons-material/Public'; import IconWarning from '@mui/icons-material/Warning'; import { styled } from '@mui/material/styles'; import React from 'react'; import { useTranslation } from 'react-i18next'; import LocationInputAdornment from './LocationInputAdornment'; import getAlertColor from './getAlertColor'; import type { SplitResult } from './splitUrl'; const SecurityLabelRoot = styled(LocationInputAdornment, { name: 'SecurityLabel', slot: 'Root', shouldForwardProp: (prop) => prop !== 'alert', })<{ alert: boolean }>(({ theme, alert }) => ({ padding: 6, color: getAlertColor(theme, alert), // Clicking on the security label should focus the text field instead. pointerEvents: 'none', })); const SecurityLabelText = styled('span', { name: 'SecurityLabel', slot: 'Text', })(({ theme }) => ({ marginInlineStart: theme.spacing(1), // Keep the same baseline as the input box text. paddingBottom: 1, fontWeight: theme.typography.fontWeightMedium, userSelect: 'none', })); export default function SecurityLabel({ splitResult, changed, position, }: { splitResult: SplitResult; changed: boolean; position: 'start' | 'end'; }): JSX.Element { const { t } = useTranslation(undefined, { keyPrefix: 'securityLabel', }); const { type } = splitResult; if (changed || type === 'empty') { return ( ); } switch (type) { case 'valid': { const { secure } = splitResult; return secure ? ( ) : ( {t('notSecureConnection')} ); } case 'invalid': return ( {t('unknownSite')} ); default: /* eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- Error handling for impossible case. */ throw new Error(`Unexpected SplitResult: ${type}`); } }