apeman-react-icon
Version:
apeman react package for icon components.
133 lines (111 loc) • 2.73 kB
JSX
/**
* apeman react package for icon components.
* @class ApIcon
*/
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