UNPKG

apeman-react-spinner

Version:
105 lines (92 loc) 2.16 kB
/** * apeman react package for spinner. * @class ApSpinner */ 'use strict' import React, {Component, PropTypes as types} from 'react' import classnames from 'classnames' import {shallowEqual} from 'asobj' const SpinnerThemes = { a: [ 'fa', 'fa-spin', 'fa-spinner' ], b: [ 'fa', 'fa-spin', 'fa-circle-o-notch' ], c: [ 'fa', 'fa-spin', 'fa-refresh' ], d: [ 'fa', 'fa-spin', 'fa-gear' ], e: [ 'fa', 'fa-spin', 'fa-pulse' ] } const SpinnerSizes = [ 'medium', 'xx-small', 'x-small', 'small', 'large', 'x-large', 'xx-large', 'smaller', 'larger' ] const DEFAULT_THEME = 'c' const DEFAULT_SIZE = 'large' /** @lends ApSpinner */ class ApSpinner extends Component { render () { const s = this let { props } = s let className = classnames('ap-spinner', props.className, { 'ap-spinner-cover': !!props.cover, 'ap-spinner-enabled': !!props.enabled }) return ( <div className={ className } style={ Object.assign({}, props.style) }> <span className={ classnames('ap-spinner-icon', SpinnerThemes[ props.theme ]) } style={ { fontSize: props.size } } > </span> </div> ) } // -------------------- // Lifecycle // -------------------- shouldComponentUpdate (nextProps, nextState) { const s = this let { props, state } = s return !shallowEqual(props, nextProps) || shallowEqual(state, nextState) } componentDidMount () { const s = this s.setState({ iconVisible: true }) } componentWillUnmount () { const s = this } // -------------------- // Custom // -------------------- } Object.assign(ApSpinner, { // -------------------- // Specs // -------------------- propTypes: { /** Shows spin */ enabled: types.bool, /** Theme of the spinner */ theme: types.oneOf( Object.keys(SpinnerThemes) ), /** Size of spinner icon */ size: types.oneOf(SpinnerSizes), /** show as cover */ cover: types.bool }, defaultProps: { enabled: false, theme: DEFAULT_THEME, size: DEFAULT_SIZE }, DEFAULT_THEME }) export default ApSpinner