2023-01-03 19:55:46 +00:00
|
|
|
// Copyright 2020 Signal Messenger, LLC
|
2020-10-30 20:34:04 +00:00
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2021-08-17 21:45:18 +00:00
|
|
|
import React, { useMemo } from 'react';
|
2020-10-08 01:25:33 +00:00
|
|
|
import classNames from 'classnames';
|
2021-08-17 21:45:18 +00:00
|
|
|
import { v4 as uuid } from 'uuid';
|
2021-10-26 19:15:33 +00:00
|
|
|
import type { TooltipPlacement } from './Tooltip';
|
|
|
|
import { Tooltip } from './Tooltip';
|
2020-12-04 23:03:01 +00:00
|
|
|
import { Theme } from '../util/theme';
|
2021-10-26 19:15:33 +00:00
|
|
|
import type { LocalizerType } from '../types/Util';
|
2020-10-08 01:25:33 +00:00
|
|
|
|
|
|
|
export enum CallingButtonType {
|
2020-10-14 16:30:50 +00:00
|
|
|
AUDIO_DISABLED = 'AUDIO_DISABLED',
|
2020-10-08 01:25:33 +00:00
|
|
|
AUDIO_OFF = 'AUDIO_OFF',
|
|
|
|
AUDIO_ON = 'AUDIO_ON',
|
2021-05-20 21:54:03 +00:00
|
|
|
PRESENTING_DISABLED = 'PRESENTING_DISABLED',
|
|
|
|
PRESENTING_OFF = 'PRESENTING_OFF',
|
|
|
|
PRESENTING_ON = 'PRESENTING_ON',
|
2024-01-17 20:29:44 +00:00
|
|
|
RAISE_HAND_OFF = 'RAISE_HAND_OFF',
|
|
|
|
RAISE_HAND_ON = 'RAISE_HAND_ON',
|
|
|
|
REACT_OFF = 'REACT_OFF',
|
|
|
|
REACT_ON = 'REACT_ON',
|
2021-08-25 21:42:51 +00:00
|
|
|
RING_DISABLED = 'RING_DISABLED',
|
|
|
|
RING_OFF = 'RING_OFF',
|
|
|
|
RING_ON = 'RING_ON',
|
2020-10-14 16:30:50 +00:00
|
|
|
VIDEO_DISABLED = 'VIDEO_DISABLED',
|
2020-10-08 01:25:33 +00:00
|
|
|
VIDEO_OFF = 'VIDEO_OFF',
|
|
|
|
VIDEO_ON = 'VIDEO_ON',
|
2023-11-16 19:55:35 +00:00
|
|
|
MORE_OPTIONS = 'MORE_OPTIONS',
|
2020-10-08 01:25:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export type PropsType = {
|
|
|
|
buttonType: CallingButtonType;
|
|
|
|
i18n: LocalizerType;
|
2021-08-25 21:42:51 +00:00
|
|
|
isVisible?: boolean;
|
2020-10-08 01:25:33 +00:00
|
|
|
onClick: () => void;
|
2021-09-18 00:20:29 +00:00
|
|
|
onMouseEnter?: () => void;
|
|
|
|
onMouseLeave?: () => void;
|
2020-11-19 18:11:35 +00:00
|
|
|
tooltipDirection?: TooltipPlacement;
|
2020-10-08 01:25:33 +00:00
|
|
|
};
|
|
|
|
|
2022-11-18 00:45:19 +00:00
|
|
|
export function CallingButton({
|
2020-10-08 01:25:33 +00:00
|
|
|
buttonType,
|
|
|
|
i18n,
|
2021-08-25 21:42:51 +00:00
|
|
|
isVisible = true,
|
2020-10-08 01:25:33 +00:00
|
|
|
onClick,
|
2021-09-18 00:20:29 +00:00
|
|
|
onMouseEnter,
|
|
|
|
onMouseLeave,
|
2020-11-19 18:11:35 +00:00
|
|
|
tooltipDirection,
|
2022-11-18 00:45:19 +00:00
|
|
|
}: PropsType): JSX.Element {
|
2021-08-17 21:45:18 +00:00
|
|
|
const uniqueButtonId = useMemo(() => uuid(), []);
|
|
|
|
|
2020-10-08 01:25:33 +00:00
|
|
|
let classNameSuffix = '';
|
|
|
|
let tooltipContent = '';
|
2021-05-20 21:54:03 +00:00
|
|
|
let disabled = false;
|
2020-10-14 16:30:50 +00:00
|
|
|
if (buttonType === CallingButtonType.AUDIO_DISABLED) {
|
2020-10-08 01:25:33 +00:00
|
|
|
classNameSuffix = 'audio--disabled';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--audio-disabled');
|
2021-05-20 21:54:03 +00:00
|
|
|
disabled = true;
|
2020-10-14 16:30:50 +00:00
|
|
|
} else if (buttonType === CallingButtonType.AUDIO_OFF) {
|
|
|
|
classNameSuffix = 'audio--off';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--audio-on');
|
2020-10-08 01:25:33 +00:00
|
|
|
} else if (buttonType === CallingButtonType.AUDIO_ON) {
|
2020-10-14 16:30:50 +00:00
|
|
|
classNameSuffix = 'audio--on';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--audio-off');
|
2020-10-14 16:30:50 +00:00
|
|
|
} else if (buttonType === CallingButtonType.VIDEO_DISABLED) {
|
2020-10-08 01:25:33 +00:00
|
|
|
classNameSuffix = 'video--disabled';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--video-disabled');
|
2021-05-20 21:54:03 +00:00
|
|
|
disabled = true;
|
2020-10-14 16:30:50 +00:00
|
|
|
} else if (buttonType === CallingButtonType.VIDEO_OFF) {
|
|
|
|
classNameSuffix = 'video--off';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--video-on');
|
2020-10-08 01:25:33 +00:00
|
|
|
} else if (buttonType === CallingButtonType.VIDEO_ON) {
|
2020-10-14 16:30:50 +00:00
|
|
|
classNameSuffix = 'video--on';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--video-off');
|
2021-08-25 21:42:51 +00:00
|
|
|
} else if (buttonType === CallingButtonType.RING_DISABLED) {
|
|
|
|
classNameSuffix = 'ring--disabled';
|
|
|
|
disabled = true;
|
|
|
|
tooltipContent = i18n(
|
2023-03-30 00:03:25 +00:00
|
|
|
'icu:calling__button--ring__disabled-because-group-is-too-large'
|
2021-08-25 21:42:51 +00:00
|
|
|
);
|
2024-01-17 20:29:44 +00:00
|
|
|
} else if (buttonType === CallingButtonType.REACT_OFF) {
|
|
|
|
classNameSuffix = 'react--off';
|
|
|
|
tooltipContent = i18n('icu:calling__button--react');
|
|
|
|
} else if (buttonType === CallingButtonType.REACT_ON) {
|
|
|
|
classNameSuffix = 'react--on';
|
|
|
|
} else if (buttonType === CallingButtonType.RAISE_HAND_OFF) {
|
|
|
|
classNameSuffix = 'raise-hand--off';
|
|
|
|
tooltipContent = i18n('icu:CallControls__MenuItemRaiseHand');
|
|
|
|
} else if (buttonType === CallingButtonType.RAISE_HAND_ON) {
|
|
|
|
classNameSuffix = 'raise-hand--on';
|
|
|
|
tooltipContent = i18n('icu:CallControls__MenuItemRaiseHand--lower');
|
2021-08-25 21:42:51 +00:00
|
|
|
} else if (buttonType === CallingButtonType.RING_OFF) {
|
|
|
|
classNameSuffix = 'ring--off';
|
2023-10-25 13:40:22 +00:00
|
|
|
tooltipContent = i18n('icu:CallingButton--ring-on');
|
2021-08-25 21:42:51 +00:00
|
|
|
} else if (buttonType === CallingButtonType.RING_ON) {
|
|
|
|
classNameSuffix = 'ring--on';
|
2023-10-25 13:40:22 +00:00
|
|
|
tooltipContent = i18n('icu:CallingButton__ring-off');
|
2021-05-20 21:54:03 +00:00
|
|
|
} else if (buttonType === CallingButtonType.PRESENTING_DISABLED) {
|
|
|
|
classNameSuffix = 'presenting--disabled';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--presenting-disabled');
|
2021-05-20 21:54:03 +00:00
|
|
|
disabled = true;
|
|
|
|
} else if (buttonType === CallingButtonType.PRESENTING_ON) {
|
|
|
|
classNameSuffix = 'presenting--on';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--presenting-off');
|
2021-05-20 21:54:03 +00:00
|
|
|
} else if (buttonType === CallingButtonType.PRESENTING_OFF) {
|
|
|
|
classNameSuffix = 'presenting--off';
|
2023-03-30 00:03:25 +00:00
|
|
|
tooltipContent = i18n('icu:calling__button--presenting-on');
|
2023-11-16 19:55:35 +00:00
|
|
|
} else if (buttonType === CallingButtonType.MORE_OPTIONS) {
|
|
|
|
classNameSuffix = 'more-options';
|
|
|
|
tooltipContent = i18n('icu:CallingButton--more-options');
|
2020-10-08 01:25:33 +00:00
|
|
|
}
|
|
|
|
|
2024-04-29 19:16:12 +00:00
|
|
|
const buttonContent = (
|
|
|
|
<button
|
|
|
|
aria-label={tooltipContent}
|
|
|
|
className={classNames(
|
|
|
|
'CallingButton__icon',
|
|
|
|
`CallingButton__icon--${classNameSuffix}`
|
|
|
|
)}
|
|
|
|
disabled={disabled}
|
|
|
|
id={uniqueButtonId}
|
|
|
|
onClick={onClick}
|
|
|
|
onMouseEnter={onMouseEnter}
|
|
|
|
onMouseLeave={onMouseLeave}
|
|
|
|
type="button"
|
|
|
|
>
|
|
|
|
<div />
|
|
|
|
</button>
|
|
|
|
);
|
|
|
|
|
2020-10-08 01:25:33 +00:00
|
|
|
return (
|
2023-10-25 13:40:22 +00:00
|
|
|
<div className="CallingButton">
|
2024-04-29 19:16:12 +00:00
|
|
|
{tooltipContent === '' ? (
|
|
|
|
<div className="CallingButton__button-container">{buttonContent}</div>
|
|
|
|
) : (
|
|
|
|
<Tooltip
|
|
|
|
className="CallingButton__tooltip"
|
|
|
|
wrapperClassName={classNames(
|
|
|
|
'CallingButton__button-container',
|
|
|
|
!isVisible && 'CallingButton__button-container--hidden'
|
2023-10-25 13:40:22 +00:00
|
|
|
)}
|
2024-04-29 19:16:12 +00:00
|
|
|
content={tooltipContent}
|
|
|
|
direction={tooltipDirection}
|
|
|
|
theme={Theme.Dark}
|
2021-08-17 21:45:18 +00:00
|
|
|
>
|
2024-04-29 19:16:12 +00:00
|
|
|
{buttonContent}
|
|
|
|
</Tooltip>
|
|
|
|
)}
|
2023-10-25 13:40:22 +00:00
|
|
|
</div>
|
2020-10-08 01:25:33 +00:00
|
|
|
);
|
2022-11-18 00:45:19 +00:00
|
|
|
}
|