feat: settings page now uses new session button
							parent
							
								
									64792689b8
								
							
						
					
					
						commit
						9876e8824c
					
				@ -0,0 +1,168 @@
 | 
			
		||||
import React, { ReactNode } from 'react';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import styled from 'styled-components';
 | 
			
		||||
 | 
			
		||||
export enum SessionButtonType {
 | 
			
		||||
  Outline = 'outline',
 | 
			
		||||
  Simple = 'simple',
 | 
			
		||||
  Solid = 'solid',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export enum SessionButtonShape {
 | 
			
		||||
  Round = 'round',
 | 
			
		||||
  Square = 'square',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NOTE References ts/themes/colors.tsx
 | 
			
		||||
export enum SessionButtonColor {
 | 
			
		||||
  Green = 'green',
 | 
			
		||||
  Blue = 'blue',
 | 
			
		||||
  Yellow = 'yellow',
 | 
			
		||||
  Pink = 'pink',
 | 
			
		||||
  Purple = 'purple',
 | 
			
		||||
  Orange = 'orange',
 | 
			
		||||
  Red = 'red',
 | 
			
		||||
  White = 'white',
 | 
			
		||||
  Primary = 'primary',
 | 
			
		||||
  Danger = 'danger',
 | 
			
		||||
  None = 'transparent',
 | 
			
		||||
  // Secondary
 | 
			
		||||
  // Success?
 | 
			
		||||
  // Warning
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const StyledButton = styled.div<{
 | 
			
		||||
  color: string | undefined;
 | 
			
		||||
  buttonType: SessionButtonType;
 | 
			
		||||
  buttonShape: SessionButtonShape;
 | 
			
		||||
}>`
 | 
			
		||||
  width: auto;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: center;
 | 
			
		||||
  align-items: center;
 | 
			
		||||
  font-size: var(--font-size-md);
 | 
			
		||||
  font-weight: 700;
 | 
			
		||||
  user-select: none;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  cursor: pointer;
 | 
			
		||||
  transition: var(--default-duration);
 | 
			
		||||
  background-repeat: no-repeat;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
  height: 34px;
 | 
			
		||||
  padding: 0px 18px;
 | 
			
		||||
  background-color: ${props =>
 | 
			
		||||
    props.buttonType === SessionButtonType.Solid && props.color
 | 
			
		||||
      ? `var(--${props.color}-color)`
 | 
			
		||||
      : `var(--button-${props.buttonType}-background-color)`};
 | 
			
		||||
  color: ${props =>
 | 
			
		||||
    props.color
 | 
			
		||||
      ? props.buttonType !== SessionButtonType.Solid
 | 
			
		||||
        ? `var(--${props.color}-color)`
 | 
			
		||||
        : 'var(--white-color)'
 | 
			
		||||
      : `var(--button-${props.buttonType}-text-color)`};
 | 
			
		||||
  ${props =>
 | 
			
		||||
    props.buttonType === SessionButtonType.Outline &&
 | 
			
		||||
    `outline: none; border: 1px solid ${
 | 
			
		||||
      props.color ? `var(--${props.color}-color)` : 'var(--button-outline-border-color)'
 | 
			
		||||
    }`};
 | 
			
		||||
  ${props =>
 | 
			
		||||
    props.buttonType === SessionButtonType.Solid &&
 | 
			
		||||
    'box-shadow: 0px 0px 6px var(--button-solid-shadow-color);'}
 | 
			
		||||
  border-radius: ${props => (props.buttonShape === SessionButtonShape.Round ? '17px' : '6px')};
 | 
			
		||||
 | 
			
		||||
  .session-icon {
 | 
			
		||||
    fill: var(--background-primary-color);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  & > *:hover:not(svg) {
 | 
			
		||||
    filter: brightness(80%);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.disabled {
 | 
			
		||||
    cursor: not-allowed;
 | 
			
		||||
    outline: none;
 | 
			
		||||
    ${props =>
 | 
			
		||||
      props.buttonType === SessionButtonType.Solid
 | 
			
		||||
        ? `background-color: var(--button-solid-disabled-color)`
 | 
			
		||||
        : props.buttonType === SessionButtonType.Outline
 | 
			
		||||
        ? 'border: 1px solid var(--button-outline-disabled-color)'
 | 
			
		||||
        : ''};
 | 
			
		||||
    color: ${props =>
 | 
			
		||||
      props.buttonType === SessionButtonType.Solid
 | 
			
		||||
        ? 'var(--button-solid-text-color)'
 | 
			
		||||
        : `var(--button-${props.buttonType}-disabled-color)`};
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &:not(.disabled) {
 | 
			
		||||
    &:hover {
 | 
			
		||||
      ${props =>
 | 
			
		||||
        props.buttonType &&
 | 
			
		||||
        `background-color: var(--button-${props.buttonType}-background-hover-color);`};
 | 
			
		||||
      ${props => props.color && `color: var(--button-${props.buttonType}-text-color);`}
 | 
			
		||||
      ${props =>
 | 
			
		||||
        props.buttonType === SessionButtonType.Outline &&
 | 
			
		||||
        `outline: none; border: 1px solid var(--button-outline-border-hover-color);`};
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
`;
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
  text?: string;
 | 
			
		||||
  disabled?: boolean;
 | 
			
		||||
  buttonType: SessionButtonType;
 | 
			
		||||
  buttonShape: SessionButtonShape;
 | 
			
		||||
  buttonColor?: SessionButtonColor; // will override theme
 | 
			
		||||
  onClick: any;
 | 
			
		||||
  children?: ReactNode;
 | 
			
		||||
  margin?: string;
 | 
			
		||||
  dataTestId?: string;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const SessionButton2 = (props: Props) => {
 | 
			
		||||
  const {
 | 
			
		||||
    buttonType,
 | 
			
		||||
    buttonShape,
 | 
			
		||||
    dataTestId,
 | 
			
		||||
    buttonColor,
 | 
			
		||||
    text,
 | 
			
		||||
    disabled,
 | 
			
		||||
    onClick,
 | 
			
		||||
    margin,
 | 
			
		||||
  } = props;
 | 
			
		||||
 | 
			
		||||
  const clickHandler = (e: any) => {
 | 
			
		||||
    if (onClick) {
 | 
			
		||||
      e.stopPropagation();
 | 
			
		||||
      onClick();
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  const onClickFn = disabled ? () => null : clickHandler;
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <StyledButton
 | 
			
		||||
      color={buttonColor}
 | 
			
		||||
      buttonShape={buttonShape}
 | 
			
		||||
      buttonType={buttonType}
 | 
			
		||||
      className={classNames(
 | 
			
		||||
        'session-button',
 | 
			
		||||
        buttonShape,
 | 
			
		||||
        buttonType,
 | 
			
		||||
        buttonColor ?? '',
 | 
			
		||||
        disabled && 'disabled'
 | 
			
		||||
      )}
 | 
			
		||||
      role="button"
 | 
			
		||||
      onClick={onClickFn}
 | 
			
		||||
      data-testid={dataTestId}
 | 
			
		||||
      style={{ margin }}
 | 
			
		||||
    >
 | 
			
		||||
      {props.children || text}
 | 
			
		||||
    </StyledButton>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
SessionButton2.defaultProps = {
 | 
			
		||||
  disabled: false,
 | 
			
		||||
  buttonShape: SessionButtonShape.Round,
 | 
			
		||||
  buttonType: SessionButtonType.Outline,
 | 
			
		||||
  onClick: null,
 | 
			
		||||
} as Partial<Props>;
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue