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