// Copyright (C) 2017-2023 Smart code 203358507 import { createElement, forwardRef, useCallback } from 'react'; import classNames from 'classnames'; import { LongPressEventType, useLongPress } from 'use-long-press'; import styles from './Button.less'; type Props = { className?: string, href?: string, title?: string, disabled?: boolean, tabIndex?: number, children: React.ReactNode, onKeyDown?: (event: React.KeyboardEvent) => void, onMouseDown?: (event: React.MouseEvent) => void, onLongPress?: () => void, onClick?: (event: React.MouseEvent) => void, onDoubleClick?: () => void, }; const Button = forwardRef(({ className, href, disabled, children, onLongPress, onDoubleClick, ...props }: Props, ref) => { const longPress = useLongPress(onLongPress!, { detect: LongPressEventType.Pointer }); const onKeyDown = useCallback((event: React.KeyboardEvent) => { if (typeof props.onKeyDown === 'function') { props.onKeyDown(event); } if (event.key === 'Enter') { event.preventDefault(); // @ts-expect-error: Property 'buttonClickPrevented' does not exist on type 'KeyboardEvent'. if (!event.nativeEvent.buttonClickPrevented) { event.currentTarget.click(); } } }, [props.onKeyDown]); const onMouseDown = useCallback((event: React.MouseEvent) => { if (typeof props.onMouseDown === 'function') { props.onMouseDown(event); } // @ts-expect-error: Property 'buttonBlurPrevented' does not exist on type 'MouseEvent'. if (!event.nativeEvent.buttonBlurPrevented) { event.preventDefault(); if (document.activeElement instanceof HTMLElement) { document.activeElement.blur(); } } }, [props.onMouseDown]); return createElement( typeof href === 'string' && href.length > 0 ? 'a' : 'div', { tabIndex: 0, ...props, ref, className: classNames(className, styles['button-container'], { 'disabled': disabled }), href, onKeyDown, onMouseDown, onDoubleClick, ...longPress() }, children ); }); export default Button;