// Copyright 2021 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import type { ReactChild, ReactNode } from 'react'; import React from 'react'; import classNames from 'classnames'; import { Tooltip, TooltipPlacement } from './Tooltip'; import { WidthBreakpoint } from './_util'; const BASE_CLASS_NAME = 'LeftPaneDialog'; const TOOLTIP_CLASS_NAME = `${BASE_CLASS_NAME}__tooltip`; export type PropsType = { type?: 'warning' | 'error'; icon?: 'update' | 'relink' | 'network' | 'warning' | ReactChild; title?: string; subtitle?: string; children?: ReactNode; hoverText?: string; containerWidthBreakpoint: WidthBreakpoint; } & ( | { onClick?: undefined; clickLabel?: undefined; hasAction?: false; } | { onClick: () => void; clickLabel: string; hasAction: true; } ) & ( | { onClose?: undefined; closeLabel?: undefined; hasXButton?: false; } | { onClose: () => void; closeLabel: string; hasXButton: true; } ); export const LeftPaneDialog: React.FC = ({ icon = 'warning', type, onClick, clickLabel, title, subtitle, children, hoverText, hasAction, containerWidthBreakpoint, hasXButton, onClose, closeLabel, }) => { const onClickWrap = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); onClick?.(); }; const onKeyDownWrap = (e: React.KeyboardEvent) => { if (e.key !== 'Enter' && e.key !== ' ') { return; } e.preventDefault(); e.stopPropagation(); onClick?.(); }; const onCloseWrap = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); onClose?.(); }; const iconClassName = typeof icon === 'string' ? classNames([ `${BASE_CLASS_NAME}__icon`, `${BASE_CLASS_NAME}__icon--${icon}`, ]) : undefined; let action: ReactNode; if (hasAction) { action = ( ); } let xButton: ReactNode; if (hasXButton) { xButton = (
); } const className = classNames([ BASE_CLASS_NAME, type === undefined ? undefined : `${BASE_CLASS_NAME}--${type}`, onClick === undefined ? undefined : `${BASE_CLASS_NAME}--clickable`, ]); const message = ( <> {title === undefined ? undefined :

{title}

} {subtitle === undefined ? undefined :
{subtitle}
} {children} {action} ); const content = ( <>
{typeof icon === 'string' ?
: icon}
{message}
{xButton} ); let dialogNode: ReactChild; if (onClick) { dialogNode = (
{content}
); } else { dialogNode = (
{content}
); } if (containerWidthBreakpoint === WidthBreakpoint.Narrow) { return ( {dialogNode} ); } return dialogNode; };