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.
		
		
		
		
		
			
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			TypeScript
		
	
import React, { KeyboardEvent } from 'react';
 | 
						|
import classNames from 'classnames';
 | 
						|
import _ from 'lodash';
 | 
						|
import styled from 'styled-components';
 | 
						|
 | 
						|
import { SessionIcon, SessionIconProps } from '.';
 | 
						|
import { SessionNotificationCount } from './SessionNotificationCount';
 | 
						|
 | 
						|
interface SProps extends SessionIconProps {
 | 
						|
  onClick?: (e?: React.MouseEvent<HTMLDivElement>) => void;
 | 
						|
  notificationCount?: number;
 | 
						|
  isSelected?: boolean;
 | 
						|
  isHidden?: boolean;
 | 
						|
  margin?: string;
 | 
						|
  dataTestId?: string;
 | 
						|
  dataTestIdIcon?: string;
 | 
						|
  id?: string;
 | 
						|
  style?: object;
 | 
						|
  tabIndex?: number;
 | 
						|
}
 | 
						|
 | 
						|
const StyledSessionIconButton = styled.div<{ 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)'
 | 
						|
        };`}
 | 
						|
  }
 | 
						|
 | 
						|
  &:hover svg path {
 | 
						|
    ${props => !props.color && 'fill: var(--button-icon-stroke-hover-color);'}
 | 
						|
  }
 | 
						|
`;
 | 
						|
 | 
						|
// eslint-disable-next-line react/display-name
 | 
						|
const SessionIconButtonInner = React.forwardRef<HTMLDivElement, SProps>((props, ref) => {
 | 
						|
  const {
 | 
						|
    iconType,
 | 
						|
    iconSize,
 | 
						|
    iconColor,
 | 
						|
    iconRotation,
 | 
						|
    isSelected,
 | 
						|
    notificationCount,
 | 
						|
    glowDuration,
 | 
						|
    glowStartDelay,
 | 
						|
    noScale,
 | 
						|
    isHidden,
 | 
						|
    backgroundColor,
 | 
						|
    borderRadius,
 | 
						|
    iconPadding,
 | 
						|
    margin,
 | 
						|
    id,
 | 
						|
    dataTestId,
 | 
						|
    dataTestIdIcon,
 | 
						|
    style,
 | 
						|
    tabIndex,
 | 
						|
  } = props;
 | 
						|
  const clickHandler = (e: React.MouseEvent<HTMLDivElement>) => {
 | 
						|
    if (props.onClick) {
 | 
						|
      e.stopPropagation();
 | 
						|
      props.onClick(e);
 | 
						|
    }
 | 
						|
  };
 | 
						|
  const keyPressHandler = (e: KeyboardEvent<HTMLDivElement>) => {
 | 
						|
    if (e.currentTarget.tabIndex > -1 && e.key === 'Enter' && props.onClick) {
 | 
						|
      e.stopPropagation();
 | 
						|
      props.onClick();
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  return (
 | 
						|
    <StyledSessionIconButton
 | 
						|
      color={iconColor}
 | 
						|
      isSelected={isSelected}
 | 
						|
      className={classNames('session-icon-button', iconSize)}
 | 
						|
      role="button"
 | 
						|
      ref={ref}
 | 
						|
      id={id}
 | 
						|
      onClick={clickHandler}
 | 
						|
      style={{ ...style, display: isHidden ? 'none' : 'flex', margin: margin || '' }}
 | 
						|
      tabIndex={tabIndex}
 | 
						|
      onKeyPress={keyPressHandler}
 | 
						|
      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}
 | 
						|
      />
 | 
						|
      {Boolean(notificationCount) && <SessionNotificationCount count={notificationCount} />}
 | 
						|
    </StyledSessionIconButton>
 | 
						|
  );
 | 
						|
});
 | 
						|
 | 
						|
export const SessionIconButton = React.memo(SessionIconButtonInner, _.isEqual);
 |