diff --git a/components/Action/Button/index.js b/components/Action/Button/index.js
index 8bd18de8a..02653ecbc 100644
--- a/components/Action/Button/index.js
+++ b/components/Action/Button/index.js
@@ -18,6 +18,7 @@ eslint css-modules/no-unused-class: [
}
]
*/
+
import styles from './styles.scss';
const propTypes = {
@@ -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,
@@ -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 (
-
- );
- /* 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 (
+
+ );
+ /* eslint-enable react/button-has-type */
}
+Button.propTypes = propTypes;
+Button.defaultProps = defaultProps;
+
export default FaramActionElement(Button);
diff --git a/components/Action/Button/styles.scss b/components/Action/Button/styles.scss
index f77698873..68b619ba6 100644
--- a/components/Action/Button/styles.scss
+++ b/components/Action/Button/styles.scss
@@ -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);
@@ -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 {