SUSI.AI web chat sometimes, renders responses which contains emojis. We cannot rely on browser’s capability to render these emojis. The Problem is, that the default support for emojis of browsers does not offer a great variety of emojis to be rendered. The solution we implemented in the SUSI.AI web chat is to make use of a npm package to support our need for displaying emojis.
There were many options to choose from. For example :
Comparison between emoji packages :
Property | Twemoji | React-easy-emoji | React-twemoji | React-emojione |
Built by | Appfigures | ZxMYS | Pladaria | |
Usage | Can be used as an object with function parse: twemoji.parse() | Can be used as function: emoji() | It is a simple wrapper for Twemoji.Can be used as component: <Twemoji> | Can be used as function: emojify() or component: <Emojify> |
Conversion compatibility | Provides standard Unicode emoji support across all platforms | Parse only basic emojis.Doesn’t parse emoji names like 🙂 and emoticons like 🙂 | Convert emoji characters to Twemoji images | Converts shortnames, unicode and ASCII smileys into renderable emojis |
Dependencies | None | loot-web-kit | lodash, prop-types, twemoji | None |
After detailed analysis of the above mentioned packages, we decided to go with React-emojione.
The major reasons are :
- It is very easy to use.
- It has no dependencies.
- It can convert shortnames, unicode and ASCII symbols properly.
- It can be used as both function and component, which diversifies its usage.
Installation:
npm install -S react-emojione
Basic usage (as function)
import {emojify} from 'react-emojione'; ReactDOM.render( <div> {emojify(':p')} </div>, document.body );
Basic usage (as component)
import Emojify from 'react-emojione'; ReactDOM.render( <Emojify> <span>:p</span> </Emojify>, document.body );
Some notes about the <Emojify> component:
- If it has a single child, it won’t be wrapped
- Otherwise it will be wrapped with a <span>
Difference between component and function?
Functional Stateless Components are just a ‘dumb’ function that takes props as an input. They do not have any state or methods. Just (props) => { return <span>content</span>; }
Class components can have state, variables, methods etc.
Now we needed our react app to render emojis. Our component named MessageListItem.react renders all the text and images of response.
There is a function called imageParse in this component. We use this function to parse our emojis.
Screenshot of SUSI Web Chat
Emoji’s like (:p) are now rendered properly
The implementation is as follows :
function imageParse(stringWithLinks){ let replacePattern = new RegExp([ '((?:https?:\\/\\/)(?:[a-zA-Z]{1}', '(?:[\\w-]+\\.)+(?:[\\w]{2,5}))', '(?::[\\d]{1,5})?\\/(?:[^\\s/]+\\/)', '*(?:[^\\s]+\\.(?:jpe?g|gif|png))', '(?:\\?\\w+=\\w+(?:&\\w+=\\w+)*)?)' ].join(''),'gim'); let splits = stringWithLinks.split(replacePattern); let result = []; splits.forEach((item,key)=>{ let checkmatch = item.match(replacePattern); if(checkmatch){ result.push( <img key={key} src={checkmatch} style={{width:'95%',height:'auto'}} alt=''/>) } else{ result.push(<Emojify key={key}>{item}</Emojify>); } }); return result; }
Here we put {item} inside <Emojify> tag to render all the emoji’s present inside {item}.
This parses all emojis regardless of browser support. This package fulfills all our needs in this case.
Resources:
react-emojione package: https://www.npmjs.com/package/react-emojione
Testing link: SUSI.AI (Web Chat): http://chat.susi.ai/