2016-05-31 14:36:52 +00:00
|
|
|
import React from 'react'
|
|
|
|
import data from '../../data'
|
|
|
|
|
|
|
|
const SHEET_SIZE = 2624
|
|
|
|
const EMOJI_SIZE = 64
|
2016-05-31 23:36:50 +00:00
|
|
|
const SKINS = [
|
|
|
|
'1F3FA', '1F3FB', '1F3FC',
|
|
|
|
'1F3FD', '1F3FE', '1F3FF',
|
|
|
|
]
|
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)
|
|
|
|
|
|
|
|
var emojiData = this.getEmojiData()
|
|
|
|
this.hasSkinVariations = !!emojiData.skin_variations
|
|
|
|
}
|
|
|
|
|
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.sheetURL != this.props.sheetURL
|
|
|
|
)
|
2016-05-31 14:36:52 +00:00
|
|
|
}
|
|
|
|
|
2016-05-31 23:35:46 +00:00
|
|
|
getEmojiData() {
|
2016-05-31 23:36:50 +00:00
|
|
|
var { emoji, skin, sheetURL } = this.props,
|
2016-05-31 23:35:46 +00:00
|
|
|
emojiData = emoji
|
|
|
|
|
|
|
|
if (typeof emoji == 'string') {
|
|
|
|
emojiData = data.emojis[emoji]
|
|
|
|
}
|
|
|
|
|
2016-05-31 23:36:50 +00:00
|
|
|
if (this.hasSkinVariations && skin > 1) {
|
|
|
|
emojiData = JSON.parse(JSON.stringify(data.emojis[emoji]))
|
|
|
|
|
|
|
|
var skinKey = SKINS[skin - 1],
|
|
|
|
variationKey = `${emojiData.unified}-${skinKey}`,
|
|
|
|
variationData = emojiData.skin_variations[variationKey],
|
|
|
|
kitMatches = sheetURL.match(/(apple|google|twitter|emojione)/),
|
|
|
|
kit = kitMatches[0]
|
|
|
|
|
|
|
|
if (variationData[`has_img_${kit}`]) {
|
|
|
|
for (let k in variationData) {
|
|
|
|
let v = variationData[k]
|
|
|
|
emojiData[k] = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-31 23:35:46 +00:00
|
|
|
return emojiData
|
|
|
|
}
|
|
|
|
|
2016-05-31 14:36:52 +00:00
|
|
|
getSheetSize() {
|
|
|
|
var { size } = this.props,
|
|
|
|
sheetSize = SHEET_SIZE * size / EMOJI_SIZE
|
|
|
|
|
|
|
|
return `${sheetSize}px ${sheetSize}px`
|
|
|
|
}
|
|
|
|
|
2016-05-31 23:35:46 +00:00
|
|
|
getPosition(emojiData) {
|
2016-05-31 14:36:52 +00:00
|
|
|
var { size } = this.props,
|
2016-05-31 23:35:46 +00:00
|
|
|
{ sheet_x, sheet_y } = emojiData,
|
2016-05-31 14:36:52 +00:00
|
|
|
x = sheet_x * size,
|
|
|
|
y = sheet_y * size
|
|
|
|
|
|
|
|
return `-${x}px -${y}px`
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
2016-05-31 23:35:46 +00:00
|
|
|
var { sheetURL, size, onOver, onLeave, onClick } = this.props,
|
|
|
|
emojiData = this.getEmojiData()
|
2016-05-31 14:36:52 +00:00
|
|
|
|
|
|
|
return <span
|
2016-05-31 23:35:46 +00:00
|
|
|
onClick={() => onClick(emojiData)}
|
|
|
|
onMouseEnter={() => onOver(emojiData)}
|
|
|
|
onMouseLeave={() => onLeave(emojiData)}
|
2016-05-31 14:36:52 +00:00
|
|
|
className='emoji-picker-emoji'>
|
|
|
|
<span style={{
|
|
|
|
width: size,
|
|
|
|
height: size,
|
|
|
|
display: 'inline-block',
|
|
|
|
backgroundImage: `url(${sheetURL})`,
|
|
|
|
backgroundSize: this.getSheetSize(),
|
2016-05-31 23:35:46 +00:00
|
|
|
backgroundPosition: this.getPosition(emojiData),
|
2016-05-31 14:36:52 +00:00
|
|
|
}}>
|
|
|
|
</span>
|
|
|
|
</span>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Emoji.propTypes = {
|
2016-05-31 23:36:50 +00:00
|
|
|
skin: React.PropTypes.number,
|
2016-05-31 14:36:52 +00:00
|
|
|
onOver: React.PropTypes.func,
|
2016-05-31 20:53:06 +00:00
|
|
|
onLeave: React.PropTypes.func,
|
2016-05-31 14:36:52 +00:00
|
|
|
onClick: React.PropTypes.func,
|
|
|
|
size: React.PropTypes.number.isRequired,
|
|
|
|
sheetURL: React.PropTypes.string.isRequired,
|
2016-05-31 23:35:46 +00:00
|
|
|
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,
|
2016-05-31 14:36:52 +00:00
|
|
|
onOver: (() => {}),
|
2016-05-31 20:53:06 +00:00
|
|
|
onLeave: (() => {}),
|
2016-05-31 14:36:52 +00:00
|
|
|
onClick: (() => {}),
|
|
|
|
}
|