JSFiddle - React, Tailwind, and code Playground

HTML

<script src="//code.jquery.com/jquery-2.2.3.min.js"></script>
<div id="editText" contenteditable="true" placeholder="type message here or add some emojis"></div>
<div class="faces">
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/263a.svg" data-src="263a" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60a.svg" data-src="1f60a" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/2639.svg" data-src="2639" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60b.svg" data-src="1f60b" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60c.svg" data-src="1f60c" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60d.svg" data-src="1f60d" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60e.svg" data-src="1f60e" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f60f.svg" data-src="1f60f" />
  <img src="http://cdn.jsdelivr.net/emojione/assets/svg/1f61a.svg" data-src="1f61a" />
</div>
<div style="clear:both"></div>

CSS

[contenteditable]{
  width:100%;
  height:2em;
  background:#FFF;
  line-height:1em;
  font-size:0.8em;
  -webkit-appearance: textfield;
  appearance: textfield
}
input{
  width:100%;
  margin-top:1em;
  margin-bottom:1em;
}
.faces{
  margin-bottom:2em;
}
.faces{
  width:100%;
  height:auto;
}
.faces img{
  float:left;
  width:8vw;
  margin:1vw;
}
#val, #html{
  border:solid 1px red;
  margin-bottom:2em;
  padding:1em;
}

JavaScript

function getCaret(obj) {
	var caretPos = 0,
    sel, range;
	sel = window.getSelection();
    if (sel.rangeCount) {
      range = sel.getRangeAt(0);
      if (range.commonAncestorContainer.parentNode == obj) {
        caretPos = range.endOffset;
      }
    }
  return caretPos;
};
function setCaret(id, pos) {
    var el = document.getElementById(id);
    var range = document.createRange();
    var sel = window.getSelection();
    range.setStart(el.childNodes[0], pos);
    range.collapse(true);
    sel.removeAllRanges();
    sel.addRange(range);
    el.focus();
}
$(function () {
	$('img').click(function () {
		var org =  $('#editText').html();
		var txt = '&#x' + $(this).data('src') + ';';
		var div = document.getElementById('editText');
		var caret = getCaret(div);
	   $('#editText').focus();
	   var caret_end = "";
		if (typeof window.getSelection != "undefined") {
			var sel = window.getSelection();
			if (sel.rangeCount) {
				var container = document.createElement("div");
				for (var i = 0, len = sel.rangeCount; i < len; ++i) {
					container.appendChild(sel.getRangeAt(i).cloneContents());
				}
				caret_end = container.innerHTML;
			}
		} else if (typeof document.selection != "undefined") {
			if (document.selection.type == "Text") {
				caret_end = document.selection.createRange().htmlText;
			}
		}
		if(caret_end.length == 0){
			if(caret == 0){
				$('#editText').html(txt + org);
				setCaret('editText', (caret + 1));
		   } else if(caret == $('#editText').text().length){
				$('#editText').html(org + txt);
				setCaret('editText', $('#editText').text().length);
		   } else {
				//insert in place
				var p1 = $('#editText').text().substring(0, caret);
				var p2 = $('#editText').text().substring(caret, $('#editText').text().length);
				$('#editText').html(p1 + txt + p2);
				setCaret('editText', (caret + 1));
		   }
		} else {
			//replace highlighted text
			var p1 = $('#editText').text().substring(0, caret);
			var p2 =...