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.
session-desktop/ts/components/basic/SessionButton.tsx

158 lines
4.1 KiB
TypeScript

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',
}
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 {
color: ${props => `var(--button-${props.buttonType}-text-hover-color)`};
${props =>
props.buttonType &&
`background-color: var(--button-${props.buttonType}-background-hover-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 SessionButton = (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>
);
};
SessionButton.defaultProps = {
disabled: false,
buttonShape: SessionButtonShape.Round,
buttonType: SessionButtonType.Outline,
onClick: null,
} as Partial<Props>;