Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 81 additions & 90 deletions components/Action/Button/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ eslint css-modules/no-unused-class: [
}
]
*/

import styles from './styles.scss';

const propTypes = {
Expand Down Expand Up @@ -99,34 +100,42 @@ const defaultProps = {
onClickParams: undefined,
};

/**
* Basic button component
*/
class Button extends React.PureComponent {
static propTypes = propTypes;

static defaultProps = defaultProps;

componentWillUnmount() {
if (this.changeTimeout) {
clearTimeout(this.changeTimeout);
function Button(props) {
const {
onClick,
onClickParams,
changeDelay,
iconName,
children,
disabled,
pending,
type,
buttonType,
className: classNameFromProps,
smallHorizontalPadding,
smallVerticalPadding,
transparent,

...otherProps
} = props;

const changeTimeoutRef = React.useRef(null);

React.useEffect(() => (
() => {
window.clearTimeout(changeTimeoutRef.current);
}
}
), []);

handleClick = (e) => {
clearTimeout(this.changeTimeout);
const {
onClick,
onClickParams,
changeDelay,
} = this.props;
const handleClick = React.useCallback((e) => {
clearTimeout(changeTimeoutRef.current);

if (!onClick) {
return;
}


this.changeTimeout = setTimeout(
changeTimeoutRef.current = window.setTimeout(
() => {
onClick({
event: e,
Expand All @@ -135,76 +144,58 @@ class Button extends React.PureComponent {
},
changeDelay,
);
}

render() {
const {
iconName,
children,
disabled,
pending,
type,
buttonType,
className: classNameFromProps,
smallHorizontalPadding,
smallVerticalPadding,
transparent,

onClick, // eslint-disable-line no-unused-vars, @typescript-eslint/no-unused-vars
onClickParams, // eslint-disable-line no-unused-vars, @typescript-eslint/no-unused-vars
changeDelay, // eslint-disable-line no-unused-vars, @typescript-eslint/no-unused-vars
...otherProps
} = this.props;

const buttonClassName = _cs(
classNameFromProps,
'button',
styles.button,
buttonType,
buttonType && styles[buttonType],
iconName && children && 'with-icon-and-children',
iconName && children && styles.withIconAndChildren,

smallHorizontalPadding && 'small-horizontal-padding',
smallHorizontalPadding && styles.smallHorizontalPadding,
smallVerticalPadding && 'small-vertical-padding',
smallVerticalPadding && styles.smallVerticalPadding,

transparent && 'transparent',
transparent && styles.transparent,
);

const iconClassName = _cs(
'icon',
styles.icon,
// pending && styles.pendingIcon,
);

/* eslint-disable react/button-has-type */
return (
<button
className={buttonClassName}
disabled={disabled || pending}
onClick={this.handleClick}
type={type}
{...otherProps}
>
{pending ? (
<Spinner
className={styles.spinner}
size="small"
/>
) : (
<Icon
name={iconName}
className={iconClassName}
/>
)}
{ children }
</button>
);
/* eslint-enable react/button-has-type */
}
}, [onClick, changeDelay, onClickParams]);

const buttonClassName = _cs(
classNameFromProps,
'button',
styles.button,
buttonType,
buttonType && styles[buttonType],
iconName && children && 'with-icon-and-children',
iconName && children && styles.withIconAndChildren,

smallHorizontalPadding && 'small-horizontal-padding',
smallHorizontalPadding && styles.smallHorizontalPadding,
smallVerticalPadding && 'small-vertical-padding',
smallVerticalPadding && styles.smallVerticalPadding,

transparent && 'transparent',
transparent && styles.transparent,
);

const iconClassName = _cs(
'icon',
styles.icon,
);

/* eslint-disable react/button-has-type */
return (
<button
className={buttonClassName}
disabled={disabled || pending}
onClick={handleClick}
type={type}
{...otherProps}
>
{pending ? (
<Spinner
className={styles.spinner}
size="small"
/>
) : (
<Icon
name={iconName}
className={iconClassName}
/>
)}
{ children }
</button>
);
/* eslint-enable react/button-has-type */
}

Button.propTypes = propTypes;
Button.defaultProps = defaultProps;

export default FaramActionElement(Button);
120 changes: 51 additions & 69 deletions components/Action/Button/styles.scss
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
@import '../../../stylesheets/utils';

:root {
--radius-button-border: 2px;
}

@mixin button-props($base-color) {
// border: var(--width-separator-thin) solid var(--color-separator-light);
// color: var(--color-text);
Expand Down Expand Up @@ -35,113 +31,99 @@
}

.button {
border: var(--width-separator-thin) solid var(--color-separator-light);
--background-color: transparent;
--color: var(--color-text);
--border-color: transparent;

border: var(--width-separator-thin) solid var(--border-color);
border-radius: var(--radius-button-border);
background-color: transparent;
background-color: var(--background-color);
padding: var(--spacing-small) var(--spacing-small-alt);
text-transform: uppercase;
color: var(--color);
font-family: inherit;
font-size: var(--font-size-small);
font-weight: var(--font-weight-bold);

&:not(:disabled) {
cursor: pointer;
&:disabled {
--background-color: var(--color-background-disabled);
--color: var(--color-text-disabled);
--border-color: var(--color-separator-light);
}

&:not(:disabled) {
&:active {
// @include shadow-button-active;
transform: translateY(1px);
}
}

&:not(.transparent) {
&:not(:disabled) {
// @include shadow-button;
}
cursor: pointer;

&.button-default {
background-color: var(--color-foreground);
color: var(--color-text);

&:focus {
// @include outline-button(var(--color-separator-alt));
}

&:not(:disabled) {
border: var(--width-separator-thin) solid var(--color-separator-alt);

&:hover {
background-color: var(--color-background-hover);
// color: var(--color-text);
// background-color: get-hover-color($base-color);
}
}
// @include button-props(var(--color-foreground-alt));
--color: var(--color-text);
}

&.button-accent {
@include button-props(var(--color-accent));
--color: var(--color-accent);
}

&.button-primary {
@include button-props(var(--color-primary));
--color: var(--color-primary);
}

&.button-danger {
@include button-props(var(--color-danger));
--color: var(--color-danger);
}

&.button-success {
@include button-props(var(--color-success));
--color: var(--color-success);
}

&.button-warning {
@include button-props(var(--color-warning));
--color: var(--color-warning);
}

&:disabled {
background-color: var(--color-background-disabled);
color: var(--color-text-disabled);
&:active {
transform: translateY(1px);
}
}

&.transparent {
border: 0;
&:not(.transparent) {
--background-color: var(--color-foreground);

&:focus {
border-bottom: 0;
}
&.button-default {
--border-color: var(--color-separator);
}

&.button-default {
@include transparent-button-props(var(--color-text));
}
&.button-accent {
--border-color: var(--color-accent);
}

&.button-accent {
@include transparent-button-props(var(--color-accent));
}
&.button-primary {
--border-color: var(--color-primary);
}

&.button-primary {
@include transparent-button-props(var(--color-primary));
}
&.button-danger {
--border-color: var(--color-danger);
}

&.button-danger {
@include transparent-button-props(var(--color-danger));
}
&.button-success {
--border-color: var(--color-success);
}

&.button-success {
@include transparent-button-props(var(--color-success));
}
&.button-warning {
--border-color: var(--color-warning);
}

&.button-warning {
@include transparent-button-props(var(--color-warning));
&:hover {
--background-color: var(--color-background-hover);
}
}

}


&.transparent {
--background-color: transparent;
--border-color: transparent;

&:disabled {
cursor: default;
color: var(--color-text-disabled);
--color: var(--color-text-disabled);
}

}

.spinner {
Expand Down