2016-05-31 14:36:52 +00:00
|
|
|
import React from 'react'
|
|
|
|
import data from '../../data'
|
|
|
|
|
2016-11-01 15:54:25 +00:00
|
|
|
import { getData, getSanitizedData, unifiedToNative } from '../utils'
|
2016-07-19 16:27:24 +00:00
|
|
|
|
2016-07-06 15:25:13 +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 ||
|
2017-02-17 15:48:57 +00:00
|
|
|
nextProps.native != this.props.native ||
|
2017-01-18 05:58:43 +00:00
|
|
|
nextProps.set != this.props.set ||
|
|
|
|
nextProps.emoji != this.props.emoji
|
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() {
|
2016-10-19 01:21:10 +00:00
|
|
|
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() {
|
2016-10-19 01:21:10 +00:00
|
|
|
var { emoji, skin, set } = this.props
|
|
|
|
return getSanitizedData(emoji, skin, set)
|
2016-05-31 23:35:46 +00:00
|
|
|
}
|
|
|
|
|
2016-07-21 19:10:33 +00:00
|
|
|
handleClick(e) {
|
2017-04-18 15:07:43 +00:00
|
|
|
if (!this.props.onClick) { return }
|
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) {
|
2017-04-18 15:07:43 +00:00
|
|
|
if (!this.props.onOver) { return }
|
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) {
|
2017-04-18 15:07:43 +00:00
|
|
|
if (!this.props.onLeave) { return }
|
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() {
|
2017-02-17 15:36:50 +00:00
|
|
|
var { set, size, sheetSize, native, forceSize, onOver, onLeave, backgroundImageFn } = this.props,
|
2016-11-01 15:54:25 +00:00
|
|
|
{ unified } = this.getData(),
|
|
|
|
style = {},
|
2016-12-07 20:04:39 +00:00
|
|
|
children = this.props.children
|
2016-10-13 00:26:10 +00:00
|
|
|
|
|
|
|
if (!unified) {
|
|
|
|
return null
|
|
|
|
}
|
2016-05-31 14:36:52 +00:00
|
|
|
|
2016-11-01 15:54:25 +00:00
|
|
|
if (native && unified) {
|
|
|
|
style = { fontSize: size }
|
|
|
|
children = unifiedToNative(unified)
|
2017-02-17 15:36:50 +00:00
|
|
|
|
|
|
|
if (forceSize) {
|
|
|
|
style.display = 'inline-block'
|
|
|
|
style.width = size
|
|
|
|
style.height = size
|
|
|
|
}
|
2016-11-01 15:54:25 +00:00
|
|
|
} else {
|
|
|
|
style = {
|
2016-05-31 14:36:52 +00:00
|
|
|
width: size,
|
|
|
|
height: size,
|
|
|
|
display: 'inline-block',
|
2016-11-30 19:21:40 +00:00
|
|
|
backgroundImage: `url(${backgroundImageFn(set, sheetSize)})`,
|
2016-07-06 15:25:13 +00:00
|
|
|
backgroundSize: `${100 * SHEET_COLUMNS}%`,
|
2016-07-19 16:27:24 +00:00
|
|
|
backgroundPosition: this.getPosition(),
|
2016-11-01 15:54:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return <span
|
|
|
|
onClick={this.handleClick.bind(this)}
|
|
|
|
onMouseEnter={this.handleOver.bind(this)}
|
|
|
|
onMouseLeave={this.handleLeave.bind(this)}
|
|
|
|
className='emoji-mart-emoji'>
|
|
|
|
<span style={style}>{children}</span>
|
2016-05-31 14:36:52 +00:00
|
|
|
</span>
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Emoji.propTypes = {
|
|
|
|
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,
|
2016-11-30 19:21:40 +00:00
|
|
|
backgroundImageFn: React.PropTypes.func,
|
2016-11-01 15:54:25 +00:00
|
|
|
native: React.PropTypes.bool,
|
2017-02-17 15:36:50 +00:00
|
|
|
forceSize: React.PropTypes.bool,
|
2016-10-27 01:04:05 +00:00
|
|
|
skin: React.PropTypes.oneOf([1, 2, 3, 4, 5, 6]),
|
2016-10-27 01:31:56 +00:00
|
|
|
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,
|
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-10-19 01:21:10 +00:00
|
|
|
set: 'apple',
|
2016-10-27 01:31:56 +00:00
|
|
|
sheetSize: 64,
|
2016-11-01 15:54:25 +00:00
|
|
|
native: false,
|
2017-02-17 15:36:50 +00:00
|
|
|
forceSize: false,
|
2016-12-01 01:59:56 +00:00
|
|
|
backgroundImageFn: ((set, sheetSize) => `https://unpkg.com/emoji-datasource@${EMOJI_DATASOURCE_VERSION}/sheet_${set}_${sheetSize}.png`),
|
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: (() => {}),
|
|
|
|
}
|