Files
ThreadNet-Web/src/components/views/rooms/E2EIcon.tsx
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

109 lines
3.0 KiB
TypeScript
Raw Normal View History

/*
2024-09-09 14:57:16 +01:00
Copyright 2024 New Vector Ltd.
2020-01-23 14:38:17 +00:00
Copyright 2020 The Matrix.org Foundation C.I.C.
2024-09-09 14:57:16 +01:00
Copyright 2019 New Vector Ltd
2024-09-09 14:57:16 +01:00
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
import React, { ComponentProps, CSSProperties } from "react";
import classNames from "classnames";
import { Tooltip } from "@vector-im/compound-web";
2020-01-23 13:00:17 +00:00
import { _t, _td, TranslationKey } from "../../../languageHandler";
2020-01-24 10:13:03 +00:00
import AccessibleButton from "../elements/AccessibleButton";
2021-09-20 13:23:02 +02:00
import { E2EStatus } from "../../../utils/ShieldUtils";
import { XOR } from "../../../@types/common";
2021-09-21 08:18:49 +02:00
export enum E2EState {
2021-09-20 17:10:22 +02:00
Verified = "verified",
Warning = "warning",
Normal = "normal",
2021-09-20 13:23:02 +02:00
}
const crossSigningUserTitles: { [key in E2EState]?: TranslationKey } = {
[E2EState.Warning]: _td("encryption|cross_signing_user_warning"),
[E2EState.Normal]: _td("encryption|cross_signing_user_normal"),
[E2EState.Verified]: _td("encryption|cross_signing_user_verified"),
2020-01-23 13:00:17 +00:00
};
const crossSigningRoomTitles: { [key in E2EState]?: TranslationKey } = {
[E2EState.Warning]: _td("encryption|cross_signing_room_warning"),
[E2EState.Normal]: _td("encryption|cross_signing_room_normal"),
[E2EState.Verified]: _td("encryption|cross_signing_room_verified"),
2020-01-23 13:00:17 +00:00
};
2020-01-23 14:38:17 +00:00
interface Props {
2021-09-20 13:23:02 +02:00
className?: string;
size?: number;
onClick?: () => void;
hideTooltip?: boolean;
2024-04-12 14:56:23 +02:00
tooltipPlacement?: ComponentProps<typeof Tooltip>["placement"];
2021-09-20 13:23:02 +02:00
bordered?: boolean;
}
interface UserProps extends Props {
isUser: true;
status: E2EState | E2EStatus;
}
interface RoomProps extends Props {
isUser?: false;
status: E2EStatus;
}
const E2EIcon: React.FC<XOR<UserProps, RoomProps>> = ({
isUser,
status,
className,
size,
onClick,
hideTooltip,
2024-04-12 14:56:23 +02:00
tooltipPlacement,
bordered,
}) => {
2020-01-24 10:13:03 +00:00
const classes = classNames(
{
mx_E2EIcon: true,
mx_E2EIcon_bordered: bordered,
2021-09-21 08:18:49 +02:00
mx_E2EIcon_warning: status === E2EState.Warning,
mx_E2EIcon_normal: status === E2EState.Normal,
mx_E2EIcon_verified: status === E2EState.Verified,
},
className,
);
let e2eTitle: TranslationKey | undefined;
if (isUser) {
e2eTitle = crossSigningUserTitles[status];
} else {
e2eTitle = crossSigningRoomTitles[status];
}
2019-11-12 16:25:38 +01:00
let style: CSSProperties | undefined;
2020-01-23 13:00:17 +00:00
if (size) {
2021-06-29 13:11:58 +01:00
style = { width: `${size}px`, height: `${size}px` };
2019-11-12 16:25:38 +01:00
}
const label = e2eTitle ? _t(e2eTitle) : "";
let content: JSX.Element;
if (onClick) {
content = <AccessibleButton onClick={onClick} className={classes} style={style} />;
} else {
content = <div className={classes} style={style} />;
}
2020-01-24 10:13:03 +00:00
if (!e2eTitle || hideTooltip) {
return content;
2020-01-24 10:13:03 +00:00
}
return (
2024-04-12 14:56:23 +02:00
<Tooltip label={label} placement={tooltipPlacement} isTriggerInteractive={!!onClick}>
{content}
</Tooltip>
2020-01-24 10:13:03 +00:00
);
2020-01-23 13:00:17 +00:00
};
export default E2EIcon;