Home Reference Source

application/components/common/delete-button.js

import React from 'react';
import RaisedButton from 'material-ui/RaisedButton';
import LinearProgress from 'material-ui/LinearProgress';
import FontIcon from 'material-ui/FontIcon';
import BaseView from './../base-view';
import {language} from '../../lang/en/delete-button';

/**
 * Hold to delete button. Eschews traditional "Are you sure" box
 * by forcing the user to hold the button for about 10 seconds before deleteing.
 *
 * Parent component should provide onDelete property to handle when deletion is confirmed
 */
class DeleteButton extends BaseView {

    constructor(props) {
        super(props);

        this.state = {
            'active': false,
            'progress': 0,
            'interval': false,
            'counter': 0
        };

        this.handleDown = this.handleDown.bind(this);
        this.handleUp = this.handleUp.bind(this);
        this.handleInterval = this.handleInterval.bind(this);
    }

    componentWillMount() {
        this.setState({'label': this.props.label ? this.props.label : language.rest()});
    }

    handleInterval() {
        let counter = this.state.counter;
        counter++;

        this.setState({'progress': counter*4});

        if (counter === 30) {
            this.handleComplete();
        }

        this.setState({'counter': counter});
    }

    handleComplete() {

        clearInterval(this.state.interval);
        this.setState({'label': language.complete(), 'active': false, 'progress': 100, 'interval': false});

        const handler = (() => this.setState({'label': this.props.label ? this.props.label : language.rest(), 'counter': 0, 'progress': 0, 'active': false})).bind(this);
        setTimeout(() => {
            this.props.onDelete(handler);
        }, 1000);
    }

    handleDown(e) {

        if (this.props.disabled) {
            return;
        }

        this.setState({'label': language.active(), 'active': true});

        let interval = setInterval(this.handleInterval, 100)
        this.setState({'interval': interval});
    }

    handleUp(e) {
        if (!this.state.active) {
            return;
        }

        this.setState({'active': false, 'label': this.props.label ? this.props.label : language.rest()});

        clearInterval(this.state.interval);
        this.setState({'interval': false, 'counter': 0, 'progress': 0});
    }

    render() {
        return (
            <div className={'delete-button-root ' + this.props.className}>
                <RaisedButton
                    className='delete-button'
                    fullWidth={this.props.fullWidth}
                    onMouseDown={this.handleDown}
                    onMouseOut={this.handleUp}
                    onMouseUp={this.handleUp}
                    disabled={this.props.disabled}
                    backgroundColor='#B71C1C'
                    labelColor='#fff'
                    label={this.state.label ? this.state.label : language.rest()}
                    icon={this.props.icon ? <FontIcon className='mui-icons'>delete</FontIcon> : false}
                    />
                {this.props.disabled ? '' : <LinearProgress mode="determinate" value={this.state.progress} /> }
            </div>
        );
    }

}

export default DeleteButton;