import Button, { ButtonProps } from "@material-ui/core/Button"; import CircularProgress from "@material-ui/core/CircularProgress"; import { createStyles, Theme, WithStyles, withStyles } from "@material-ui/core/styles"; import CheckIcon from "@material-ui/icons/Check"; import { buttonMessages } from "@saleor/intl"; import classNames from "classnames"; import React from "react"; import { FormattedMessage } from "react-intl"; export type ConfirmButtonTransitionState = | "loading" | "success" | "error" | "default"; const styles = (theme: Theme) => createStyles({ error: { "&:hover": { backgroundColor: theme.palette.error.main }, backgroundColor: theme.palette.error.main, color: theme.palette.error.contrastText }, icon: { marginLeft: "0 !important", position: "absolute", transitionDuration: theme.transitions.duration.standard + "ms" }, invisible: { opacity: 0 }, label: { alignItems: "center", display: "flex", transitionDuration: theme.transitions.duration.standard + "ms" }, progress: { "& svg": { color: theme.palette.common.white, margin: 0 }, position: "absolute", transitionDuration: theme.transitions.duration.standard + "ms" }, success: { "&:hover": { backgroundColor: theme.palette.primary.main }, backgroundColor: theme.palette.primary.main, color: theme.palette.primary.contrastText } }); export interface ConfirmButtonProps extends Omit, WithStyles { transitionState: ConfirmButtonTransitionState; } interface ConfirmButtonState { displayCompletedActionState: boolean; } const ConfirmButton = withStyles(styles)( class ConfirmButtonComponent extends React.Component< ConfirmButtonProps & WithStyles< "error" | "icon" | "invisible" | "label" | "progress" | "success" >, ConfirmButtonState > { state: ConfirmButtonState = { displayCompletedActionState: false }; timeout = null; static getDerivedStateFromProps( nextProps: ConfirmButtonProps, prevState: ConfirmButtonState ): ConfirmButtonState { if (nextProps.transitionState === "loading") { return { displayCompletedActionState: true }; } return prevState; } componentDidUpdate(prevProps: ConfirmButtonProps) { const { transitionState } = this.props; if (prevProps.transitionState !== transitionState) { if ( (["error", "success"] as ConfirmButtonTransitionState[]).includes( transitionState ) ) { this.timeout = setTimeout( () => this.setState({ displayCompletedActionState: false }), 2000 ); } else if (transitionState === "loading") { clearTimeout(this.timeout); } } } componentWillUnmount() { clearTimeout(this.timeout); } render() { const { children, classes, className, disabled, transitionState, onClick, ...props } = this.props; const { displayCompletedActionState } = this.state; return ( ); } } ); ConfirmButton.displayName = "ConfirmButton"; export default ConfirmButton;