Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #18 Added Component API support to react-emoji #19

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 25 additions & 2 deletions example/main.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'babel-core/polyfill';
import React from 'react';
import ReactDOM from 'react-dom';
import ReactEmojiMixin from '../src/react-emoji';
import ReactEmoji, { ReactEmojiMixin, emojify } from '../src/react-emoji';

let App = React.createClass({
getDefaultProps() {
Expand All @@ -17,7 +17,30 @@ let App = React.createClass({
render() {
return (
<div>
<div>{ this.emojify(this.props.text) }</div>
<div>
<ReactEmoji>
{this.props.text}
</ReactEmoji>
</div>
<div>
<ReactEmoji>
{"Hello World"}
</ReactEmoji>
</div>
<div>
<ReactEmoji />
</div>
<div>
<ReactEmoji emojiType = 'emojione'>
<div>
<div>
{this.props.text}
</div>
{this.props.text}
</div>
</ReactEmoji>
</div>
<div>{ emojify(this.props.text) }</div>
<div>{ this.emojify(this.props.text, {emojiType: 'emojione'}) }</div>
<div>{ this.emojify(this.props.text, {useEmoticon: false}) }</div>
</div>
Expand Down
101 changes: 91 additions & 10 deletions src/react-emoji.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,75 @@ import assign from 'object-assign';
import compact from 'lodash.compact';

let ReactEmoji = () => {
const ReactEmojiPropTypes = {
useEmoticon: React.PropTypes.bool,
emojiType: React.PropTypes.string,
host: React.PropTypes.string,
path: React.PropTypes.string,
ext: React.PropTypes.string,
singleEmoji: React.PropTypes.bool,
strict: React.PropTypes.bool,
children: React.PropTypes.any,
};

const ReactEmojiComponent = React.createClass({
displayName: "ReactEmoji",

propTypes: ReactEmojiPropTypes,

render() {
let emojifiedChildren = this.emojifyChildrenText(this.props.children, this.getOptionsFromProps());

if (!emojifiedChildren) return null;

// support for a wrapper, instead of the span we provide
if (emojifiedChildren.length === 1 && React.isValidElement(emojifiedChildren[0])) {
return emojifiedChildren[0];
} else {
return (
<span>
{emojifiedChildren}
</span>
);
}
},

getOptionsFromProps() {
let options = {};
let attributes = assign({}, this.props);

for (let key in ReactEmojiPropTypes) {
options[key] = this.props[key];
delete attributes[key];
}

options.attributes = attributes;
return options;
},

cloneAndEmojifyChild(child, options) {
return React.cloneElement(child, {}, this.emojifyChildrenText(child.props.children, options));
},

// traverse and emojify the child nodes
emojifyChildrenText(children, options) {
return React.Children.map(children, (child) => {
if (isString(child)) {
return emojify(child, options);
} else if (React.isValidElement(child)) {
return this.cloneAndEmojifyChild(child, options);
} else {
return child;
}
});
}

});

let isString = (obj) => {
return toString.call(obj) === '[object String]';
};

let getEscapedKeys = (hash) => {
return Object.keys(hash)
.map(x => escapeStringRegexp(x))
Expand Down Expand Up @@ -96,17 +165,29 @@ let ReactEmoji = () => {
);
};

let emojify = (text, options = {}) => {
if (!text) return null;
options = buildOptions(options);
if (options.singleEmoji) {
return emojifyTextToSingleEmoji(text, options);
} else {
return emojifyText(text, options);
}
};

return {
emojify(text, options = {}) {
if (!text) return null;
options = buildOptions(options);
if (options.singleEmoji) {
return emojifyTextToSingleEmoji(text, options);
} else {
return emojifyText(text, options);
}
},
ReactEmojiComponent: ReactEmojiComponent,

emojify: emojify,
};
};

export default ReactEmoji();
let { ReactEmojiComponent, emojify } = ReactEmoji();

export { emojify }

export var ReactEmojiMixin = {
emojify: emojify
};

export { ReactEmojiComponent as default }
2 changes: 1 addition & 1 deletion test/react-emoji-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import ReactDOM from "react-dom";
import assert from 'power-assert';
import TestUtils from 'react-addons-test-utils';

import ReactEmojiMixin from "../src/react-emoji";
import {ReactEmojiMixin} from "../src/react-emoji";

let SampleComponent = React.createClass({
getDefaultProps() {
Expand Down