React component to manipulate the favicon for loading or progress

react-loadcon

React component to manipulate the favicon, as a loading or progress indicator, for now. The idea of "Favicon as DOM" is under construction.

Why bother?

When it comes to a huge file loading or download in a tab, a tiny progress indicator on favicon could be an interesting but also considerate UX experience. The idea comes from a long time ago and has been realized by so many open-source developers, and it comes back to me when try to solve this good first issue for the Mozilla Send.

So here is React-LoadCon for React community, now this tiny project can only use canvas to draw dynamic images and replace the tag, which is extremely tedious, but it plans to be a more general tool to offer Favicon as DOM. dom-to-img could be introduced to simplify the covert process.

? Installation

npm install --save react-loadcon

or

yarn add react-loadcon

Usage

Put <LoadCon /> anywhere, even in your SSR components (LoadCon would only trigger after componentDidMount).

  <LoadCon percentage={this.state.percentage} />

Full example with async function, and show Success or Exception afterwards.

  import React, { Component } from 'react'
  import LoadCon from 'react-loadcon'

  export default class ExampleComponent extends Component {
    state = {
      percentage: 0,    // isRequired
      status: 'normal', // oneOf(['normal', 'active', 'exception', 'success'])
      type: 'pie',      // oneOf(['pie', 'donut'])
    }

    componentDidMount () {
      this.apiCall()
    }

    apiCall = () => {
      this.setState({ status: 'active' })
      fetch(url)
        .then(res => return res.json())
        .then(data => {
          // normal loading
          this.setState({ status: 'normal' })

          // loading with success
          this.setState({ status: 'success' })
          setTimeout(() => {
            this.setState({ status: 'normal' })
          }, 1500)
        })
        .catch(e => {
          this.setState({ status: 'exception' })
          setTimeout(() => {
            this.setState({ status: 'normal' })
          }, 1500)
        })
    }

    render () {
      return (
        <LoadCon
          percentage={this.state.percentage}
          status={this.state.status}
          type={this.state.type}
        />
      )
    }
  }

Props

OPTION TYPE DEFAULT DESCRIPTION
percentage number 0 the percentage of loading progress for LoadCon
type oneOf(['pie', 'donut']) pie the theme of LoadCon, now has PieCon and DonutCon, and more themes will be added soon
status oneOf(['normal', 'active', 'exception', 'success']) normal load status of LoadCon, normal reset to default favicon, active set LoadCon according to the type prop, exception set ErrorCon and success set SuccessCon.
color string #25c639 color of loading indicator in hash format.
background string #eee color of background in hash format.
shadow string #fff color of 2 pixals border in hash format
donutWidth number 8 width of DonutCon indicator.

GitHub