You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			128 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			TypeScript
		
	
import classNames from 'classnames';
 | 
						|
import _ from 'lodash';
 | 
						|
import { KeyboardEvent, MouseEvent, ReactNode, forwardRef, memo } from 'react';
 | 
						|
import styled from 'styled-components';
 | 
						|
import { SessionIcon, SessionIconProps } from './SessionIcon';
 | 
						|
 | 
						|
export type SessionIconButtonProps = SessionIconProps & {
 | 
						|
  onClick?: (e?: MouseEvent<HTMLButtonElement>) => void;
 | 
						|
  isSelected?: boolean;
 | 
						|
  isHidden?: boolean;
 | 
						|
  margin?: string;
 | 
						|
  padding?: string;
 | 
						|
  dataTestIdIcon?: string;
 | 
						|
  id?: string;
 | 
						|
  title?: string;
 | 
						|
  ariaLabel?: string;
 | 
						|
  tabIndex?: number;
 | 
						|
  className?: string;
 | 
						|
  children?: ReactNode;
 | 
						|
  disabled?: boolean;
 | 
						|
};
 | 
						|
 | 
						|
const StyledSessionIconButton = styled.button<{ color?: string; isSelected?: boolean }>`
 | 
						|
  background-color: var(--button-icon-background-color);
 | 
						|
 | 
						|
  svg path {
 | 
						|
    transition: var(--default-duration);
 | 
						|
    ${props =>
 | 
						|
      !props.color &&
 | 
						|
      `fill:
 | 
						|
        ${
 | 
						|
          props.isSelected
 | 
						|
            ? 'var(--button-icon-stroke-selected-color)'
 | 
						|
            : 'var(--button-icon-stroke-color)'
 | 
						|
        };`}
 | 
						|
  }
 | 
						|
 | 
						|
  ${props => props.disabled && 'cursor: not-allowed;'}
 | 
						|
 | 
						|
  &:hover svg path {
 | 
						|
    ${props => !props.disabled && !props.color && 'fill: var(--button-icon-stroke-hover-color);'}
 | 
						|
  }
 | 
						|
`;
 | 
						|
 | 
						|
// eslint-disable-next-line react/display-name
 | 
						|
const SessionIconButtonInner = forwardRef<HTMLButtonElement, SessionIconButtonProps>(
 | 
						|
  (props, ref) => {
 | 
						|
    const {
 | 
						|
      iconType,
 | 
						|
      iconSize,
 | 
						|
      iconColor,
 | 
						|
      iconRotation,
 | 
						|
      isSelected,
 | 
						|
      glowDuration,
 | 
						|
      glowStartDelay,
 | 
						|
      noScale,
 | 
						|
      isHidden,
 | 
						|
      backgroundColor,
 | 
						|
      borderRadius,
 | 
						|
      iconPadding,
 | 
						|
      margin,
 | 
						|
      padding,
 | 
						|
      id,
 | 
						|
      ariaLabel,
 | 
						|
      title,
 | 
						|
      dataTestId,
 | 
						|
      dataTestIdIcon,
 | 
						|
      style,
 | 
						|
      tabIndex,
 | 
						|
      className,
 | 
						|
      children,
 | 
						|
      disabled,
 | 
						|
    } = props;
 | 
						|
    const clickHandler = (e: MouseEvent<HTMLButtonElement>) => {
 | 
						|
      if (!disabled && props.onClick) {
 | 
						|
        e.stopPropagation();
 | 
						|
        props.onClick(e);
 | 
						|
      }
 | 
						|
    };
 | 
						|
    const keyPressHandler = (e: KeyboardEvent<HTMLButtonElement>) => {
 | 
						|
      if (e.currentTarget.tabIndex > -1 && e.key === 'Enter' && !disabled && props.onClick) {
 | 
						|
        e.stopPropagation();
 | 
						|
        props.onClick();
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    return (
 | 
						|
      <StyledSessionIconButton
 | 
						|
        color={iconColor}
 | 
						|
        isSelected={isSelected}
 | 
						|
        className={classNames('session-icon-button', iconSize, className)}
 | 
						|
        ref={ref}
 | 
						|
        id={id}
 | 
						|
        title={title}
 | 
						|
        aria-label={ariaLabel}
 | 
						|
        onClick={clickHandler}
 | 
						|
        style={{
 | 
						|
          ...style,
 | 
						|
          display: style?.display ? style.display : isHidden ? 'none' : 'flex',
 | 
						|
          margin: margin || '',
 | 
						|
          padding: padding || '',
 | 
						|
        }}
 | 
						|
        tabIndex={tabIndex}
 | 
						|
        onKeyDown={keyPressHandler}
 | 
						|
        disabled={disabled}
 | 
						|
        data-testid={dataTestId}
 | 
						|
      >
 | 
						|
        <SessionIcon
 | 
						|
          iconType={iconType}
 | 
						|
          iconSize={iconSize}
 | 
						|
          iconColor={iconColor}
 | 
						|
          iconRotation={iconRotation}
 | 
						|
          glowDuration={glowDuration}
 | 
						|
          glowStartDelay={glowStartDelay}
 | 
						|
          noScale={noScale}
 | 
						|
          backgroundColor={backgroundColor}
 | 
						|
          borderRadius={borderRadius}
 | 
						|
          iconPadding={iconPadding}
 | 
						|
          dataTestId={dataTestIdIcon}
 | 
						|
        />
 | 
						|
        {children}
 | 
						|
      </StyledSessionIconButton>
 | 
						|
    );
 | 
						|
  }
 | 
						|
);
 | 
						|
 | 
						|
export const SessionIconButton = memo(SessionIconButtonInner, _.isEqual);
 |