emoji-mart-lazyload/src/components/emoji.js

109 lines
2.5 KiB
JavaScript
Raw Normal View History

2016-05-31 14:36:52 +00:00
import React from 'react'
import data from '../../data'
2016-10-27 03:27:55 +00:00
import { getData, getSanitizedData } from '../utils'
2016-07-19 16:27:24 +00:00
const SHEET_COLUMNS = 41
2016-05-31 14:36:52 +00:00
export default class Emoji extends React.Component {
2016-05-31 23:36:50 +00:00
constructor(props) {
super(props)
2016-07-19 16:27:24 +00:00
this.hasSkinVariations = !!this.getData().skin_variations
2016-05-31 23:36:50 +00:00
}
2016-05-31 19:16:48 +00:00
shouldComponentUpdate(nextProps) {
return (
2016-05-31 23:36:50 +00:00
this.hasSkinVariations && nextProps.skin != this.props.skin ||
2016-05-31 19:16:48 +00:00
nextProps.size != this.props.size ||
nextProps.set != this.props.set
2016-05-31 19:16:48 +00:00
)
2016-05-31 14:36:52 +00:00
}
2016-07-19 16:27:24 +00:00
getPosition() {
var { sheet_x, sheet_y } = this.getData(),
multiply = 100 / (SHEET_COLUMNS - 1)
2016-05-31 23:36:50 +00:00
2016-07-19 16:27:24 +00:00
return `${multiply * sheet_x}% ${multiply * sheet_y}%`
}
2016-06-01 00:29:37 +00:00
2016-07-19 16:27:24 +00:00
getData() {
var { emoji, skin, set } = this.props
return getData(emoji, skin, set)
2016-07-19 16:27:24 +00:00
}
2016-05-31 23:36:50 +00:00
2016-07-19 16:27:24 +00:00
getSanitizedData() {
var { emoji, skin, set } = this.props
return getSanitizedData(emoji, skin, set)
}
2016-07-21 19:10:33 +00:00
handleClick(e) {
2016-07-19 16:27:24 +00:00
var { onClick } = this.props,
emoji = this.getSanitizedData()
2016-05-31 14:36:52 +00:00
2016-07-21 19:10:33 +00:00
onClick(emoji, e)
2016-05-31 14:36:52 +00:00
}
2016-07-21 19:10:33 +00:00
handleOver(e) {
2016-07-19 16:27:24 +00:00
var { onOver } = this.props,
emoji = this.getSanitizedData()
2016-06-01 00:29:37 +00:00
2016-07-21 19:10:33 +00:00
onOver(emoji, e)
2016-06-01 00:29:37 +00:00
}
2016-07-21 19:10:33 +00:00
handleLeave(e) {
2016-07-19 16:27:24 +00:00
var { onLeave } = this.props,
emoji = this.getSanitizedData()
2016-07-21 19:10:33 +00:00
onLeave(emoji, e)
2016-06-01 00:29:37 +00:00
}
2016-05-31 14:36:52 +00:00
render() {
var { set, size, sheetSize, onOver, onLeave } = this.props,
2016-10-13 00:26:10 +00:00
{ unified } = this.getData()
if (!unified) {
return null
}
2016-05-31 14:36:52 +00:00
return <span
2016-07-19 16:27:24 +00:00
onClick={this.handleClick.bind(this)}
onMouseEnter={this.handleOver.bind(this)}
onMouseLeave={this.handleLeave.bind(this)}
2016-07-27 15:35:12 +00:00
className='emoji-mart-emoji'>
2016-05-31 14:36:52 +00:00
<span style={{
width: size,
height: size,
display: 'inline-block',
backgroundImage: `url(https://unpkg.com/emoji-datasource@2.4.4/sheet_${set}_${sheetSize}.png)`,
backgroundSize: `${100 * SHEET_COLUMNS}%`,
2016-07-19 16:27:24 +00:00
backgroundPosition: this.getPosition(),
2016-05-31 14:36:52 +00:00
}}>
</span>
</span>
}
}
Emoji.propTypes = {
onOver: React.PropTypes.func,
onLeave: React.PropTypes.func,
2016-05-31 14:36:52 +00:00
onClick: React.PropTypes.func,
2016-10-27 01:04:05 +00:00
skin: React.PropTypes.oneOf([1, 2, 3, 4, 5, 6]),
sheetSize: React.PropTypes.oneOf([16, 20, 32, 64]),
2016-10-27 00:55:44 +00:00
set: React.PropTypes.oneOf(['apple', 'google', 'twitter', 'emojione']),
2016-05-31 14:36:52 +00:00
size: React.PropTypes.number.isRequired,
emoji: React.PropTypes.oneOfType([
React.PropTypes.string,
React.PropTypes.object,
]).isRequired,
2016-05-31 14:36:52 +00:00
}
Emoji.defaultProps = {
2016-05-31 23:36:50 +00:00
skin: 1,
set: 'apple',
sheetSize: 64,
2016-05-31 14:36:52 +00:00
onOver: (() => {}),
onLeave: (() => {}),
2016-05-31 14:36:52 +00:00
onClick: (() => {}),
}