// 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 function LeftPaneDialog({ icon = 'warning', type, onClick, clickLabel, title, subtitle, children, hoverText, hasAction, containerWidthBreakpoint, hasXButton, onClose, closeLabel, }: PropsType): JSX.Element { 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 = (