Home Reference Source Repository

src/components/ScrollTopButton/ScrollTopButton.js

/*!
 * Codefolio
 * Copyright(c) 2016 MSMFSD
 * MIT Licensed
 */
import React, { Component, PropTypes } from 'react'
import CssModules from 'react-css-modules'
import styles from './ScrollTopButton.css'

/**
 * @class ScrollTopButton
 * @extends {Component}
 */
class ScrollTopButton extends Component {

  constructor (props) {
    super(props)
    this.scrollToTop = this.scrollToTop.bind(this)
  }

  componentWillUpdate () {
    if(this.scrollTopTimer !== null) {
      clearInterval(this.scrollTopTimer)
      this.scrollTopTimer = null
    }
  }

  componentWillUnmount () {
    if(this.scrollTopTimer !== null) {
      clearInterval(this.scrollTopTimer)
      this.scrollTopTimer = null
    }
  }

  /**
   * Back to top btn click
   * @param {object} e - event object
   */
  scrollToTop (e) {
    e.preventDefault()
    const doc = document.documentElement
    let top = null
    this.scrollTopTimer = setInterval(() => {
      top = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)
      if (top > 0) {
        window.scrollTo(0, top - 30)
      } else {
        clearInterval(this.scrollTopTimer)
        this.scrollTopTimer = null
      }
    }, this.props.scrollSpeed)
  }

  render () {
    return (
      <a onClick={(e) => this.scrollToTop(e)} styleName="projects-back-to-top" className="btn"><i className="material-icons left">arrow_upward</i>Top</a>
    )
  }

}

ScrollTopButton.propTypes = {
  scrollSpeed: PropTypes.number
}

ScrollTopButton.defaultProps = {
  scrollSpeed: 10
}

ScrollTopButton = CssModules(ScrollTopButton, styles)
export default ScrollTopButton