UNPKG

apeman-react-icon

Version:
133 lines (111 loc) 2.73 kB
/** * apeman react package for icon components. * @class ApIcon */ 'use strict' import React, {PropTypes as types} from 'react' import {ApPureMixin} from 'apeman-react-mixins' import classnames from 'classnames' let assertCache = {} /** @lends ApIcon */ const ApIcon = React.createClass({ // -------------------- // Specs // -------------------- propTypes: {}, mixins: [ ApPureMixin ], statics: { /** * Check if has style. * @param className */ hasStyleWithClass (className) { let styleSheets = document.styleSheets || [] for (let i = 0; i < styleSheets.length; i++) { let styleSheet = styleSheets[ i ] let rules = styleSheet.rules || styleSheet.cssRules || [] for (let j = 0; j < rules.length; j++) { let rule = rules[ j ] let selectorText = rule.selectorText let hit = selectorText && new RegExp(`\.${className}`).test(selectorText) if (hit) { return true } } } return false } }, getInitialState () { return {} }, getDefaultProps () { return {} }, render () { const s = this let { props } = s return ( <i className={ classnames('ap-icon', props.className) } style={Object.assign({}, props.style)}> </i> ) }, // -------------------- // Lifecycle // -------------------- componentDidMount () { const s = this let { props } = s s.assertClassName(props.className) }, componentWillReceiveProps (nextProps) { const s = this if (nextProps.hasOwnProperty('className')) { s.assertClassName(nextProps.className) } }, componentWillUnmount () { const s = this clearTimeout(s._assertTimer) }, // ------------------ // Helper // ------------------ assertClassName (className) { if (!className) { return } const s = this clearTimeout(s._assertTimer) s._assertTimer = setTimeout(() => { let isMounted = s.isMounted() if (!isMounted) { return } className.split(/\s/g).forEach((className) => { if (!className) { return } if (assertCache.hasOwnProperty(className)) { return } if (/^ap/.test(className)) { return } let valid = ApIcon.hasStyleWithClass(className) if (!valid) { console.warn(`[ApIcon] No style found for class "${className}". You may misspell the name or miss some stylesheets.`) } assertCache[ className ] = valid }) }, 100) }, // ------------------ // Private // ------------------ _assertTimer: -1 }) export default ApIcon