react-input-emoji 5.6.4 → 5.6.6
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.es.js +117 -43
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +117 -43
- package/dist/index.js.map +1 -1
- package/dist/src/types/types.d.ts +32 -0
- package/dist/src/utils/input-event-utils.d.ts +19 -1
- package/package.json +1 -1
package/dist/index.es.js
CHANGED
@@ -600,6 +600,24 @@ function replaceAllTextEmojiToString(html) {
|
|
600
600
|
|
601
601
|
// @ts-check
|
602
602
|
|
603
|
+
/**
|
604
|
+
* Handle copy of current selected text
|
605
|
+
* @param {React.ClipboardEvent} event
|
606
|
+
*/
|
607
|
+
function handleCopy(event) {
|
608
|
+
var selectedText = window.getSelection();
|
609
|
+
if (selectedText === null) {
|
610
|
+
return;
|
611
|
+
}
|
612
|
+
var container = document.createElement("div");
|
613
|
+
for (var i = 0, len = selectedText.rangeCount; i < len; ++i) {
|
614
|
+
container.appendChild(selectedText.getRangeAt(i).cloneContents());
|
615
|
+
}
|
616
|
+
container = replaceEmojiToString(container);
|
617
|
+
event.clipboardData.setData("text", container.innerText);
|
618
|
+
event.preventDefault();
|
619
|
+
}
|
620
|
+
|
603
621
|
/**
|
604
622
|
*
|
605
623
|
* @param {string} html
|
@@ -639,6 +657,19 @@ function handlePasteHtmlAtCaret(html) {
|
|
639
657
|
}
|
640
658
|
}
|
641
659
|
|
660
|
+
/**
|
661
|
+
* Replace emoji img to its string value
|
662
|
+
* @param {HTMLDivElement} container
|
663
|
+
* @return {HTMLDivElement}
|
664
|
+
*/
|
665
|
+
function replaceEmojiToString(container) {
|
666
|
+
var images = Array.prototype.slice.call(container.querySelectorAll("img"));
|
667
|
+
images.forEach(function (image) {
|
668
|
+
image.outerHTML = image.dataset.emoji;
|
669
|
+
});
|
670
|
+
return container;
|
671
|
+
}
|
672
|
+
|
642
673
|
/**
|
643
674
|
*
|
644
675
|
* @param {{text: string, html: string}} props
|
@@ -651,35 +682,100 @@ function totalCharacters(_ref2) {
|
|
651
682
|
var emojisCount = (html.match(/<img/g) || []).length;
|
652
683
|
return textCount + emojisCount;
|
653
684
|
}
|
685
|
+
/**
|
686
|
+
*
|
687
|
+
* @param {HTMLDivElement} inputDiv
|
688
|
+
* @return {string}
|
689
|
+
*/
|
690
|
+
function removeHtmlExceptBr(inputDiv) {
|
691
|
+
var temp = inputDiv.innerHTML.replace(/<br\s*\/?>/gi, "[BR]"); // temporarily replace <br> with placeholder
|
692
|
+
var stripped = temp.replace(/<[^>]+>/g, ""); // strip all html tags
|
693
|
+
var _final = stripped.replace(/\[BR\]/gi, "</br>"); // replace placeholders with <br>
|
694
|
+
return _final;
|
695
|
+
}
|
654
696
|
|
655
697
|
/**
|
656
|
-
*
|
657
|
-
* @param {
|
698
|
+
*
|
699
|
+
* @param {*} range
|
700
|
+
* @returns
|
658
701
|
*/
|
659
|
-
function
|
660
|
-
var range;
|
661
|
-
var
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
selection.removeAllRanges();
|
669
|
-
selection.addRange(range);
|
702
|
+
function getSelectionStart$1(range) {
|
703
|
+
var node = range.startContainer;
|
704
|
+
var offset = range.startOffset;
|
705
|
+
|
706
|
+
// Handle cases where the selection start node is not a text node
|
707
|
+
if (node.nodeType !== Node.TEXT_NODE) {
|
708
|
+
while (node.nodeType !== Node.TEXT_NODE) {
|
709
|
+
node = node.nextSibling;
|
710
|
+
if (!node) break;
|
670
711
|
}
|
712
|
+
if (!node) {
|
713
|
+
node = range.commonAncestorContainer;
|
714
|
+
while (node.nodeType !== Node.TEXT_NODE) {
|
715
|
+
node = node.firstChild;
|
716
|
+
}
|
717
|
+
}
|
718
|
+
offset = 0;
|
671
719
|
}
|
720
|
+
return {
|
721
|
+
node: node,
|
722
|
+
offset: offset
|
723
|
+
};
|
672
724
|
}
|
725
|
+
|
673
726
|
/**
|
674
727
|
*
|
675
|
-
* @
|
676
|
-
* @return {string}
|
728
|
+
* @returns {Object} cursor
|
677
729
|
*/
|
678
|
-
function
|
679
|
-
var
|
680
|
-
var
|
681
|
-
var
|
682
|
-
return
|
730
|
+
function getCursor() {
|
731
|
+
var selection = window.getSelection();
|
732
|
+
var range = selection.getRangeAt(0);
|
733
|
+
var selectionStart = getSelectionStart$1(range);
|
734
|
+
return {
|
735
|
+
selection: selection,
|
736
|
+
range: range,
|
737
|
+
selectionStart: selectionStart
|
738
|
+
};
|
739
|
+
}
|
740
|
+
|
741
|
+
/**
|
742
|
+
*
|
743
|
+
*/
|
744
|
+
function addLineBreak() {
|
745
|
+
var _getCursor = getCursor(),
|
746
|
+
selection = _getCursor.selection,
|
747
|
+
range = _getCursor.range,
|
748
|
+
selectionStart = _getCursor.selectionStart;
|
749
|
+
|
750
|
+
// If cursor is at the end of the text content, add one more line break
|
751
|
+
if (selection.isCollapsed && selectionStart.offset === selectionStart.node.textContent.length) {
|
752
|
+
var br = document.createElement("br");
|
753
|
+
range.insertNode(br);
|
754
|
+
range.setStartAfter(br);
|
755
|
+
range.setEndAfter(br);
|
756
|
+
selection.removeAllRanges();
|
757
|
+
selection.addRange(range);
|
758
|
+
var br2 = document.createElement("br");
|
759
|
+
range.insertNode(br2);
|
760
|
+
range.setStartAfter(br2);
|
761
|
+
range.setEndAfter(br2);
|
762
|
+
selection.removeAllRanges();
|
763
|
+
selection.addRange(range);
|
764
|
+
} else {
|
765
|
+
var _br = document.createElement("br");
|
766
|
+
range.insertNode(_br);
|
767
|
+
range.setStartAfter(_br);
|
768
|
+
range.setEndAfter(_br);
|
769
|
+
selection.removeAllRanges();
|
770
|
+
selection.addRange(range);
|
771
|
+
// Set cursor position right before the first letter after the line break
|
772
|
+
if (selectionStart.node.nextSibling && selectionStart.node.nextSibling.nodeType === Node.TEXT_NODE) {
|
773
|
+
range.setStart(selectionStart.node.nextSibling, 1);
|
774
|
+
range.setEnd(selectionStart.node.nextSibling, 1);
|
775
|
+
}
|
776
|
+
selection.removeAllRanges();
|
777
|
+
selection.addRange(range);
|
778
|
+
}
|
683
779
|
}
|
684
780
|
|
685
781
|
// @ts-check
|
@@ -938,8 +1034,7 @@ var TextInput = function TextInput(_ref, ref) {
|
|
938
1034
|
if (event.key === "Enter" && (event.shiftKey === true || event.ctrlKey === true) && props.shouldReturn) {
|
939
1035
|
event.preventDefault();
|
940
1036
|
if (textInputRef.current) {
|
941
|
-
|
942
|
-
moveCaretToEnd(textInputRef);
|
1037
|
+
addLineBreak();
|
943
1038
|
return;
|
944
1039
|
}
|
945
1040
|
}
|
@@ -4515,27 +4610,6 @@ function InputEmoji(props, ref) {
|
|
4515
4610
|
}
|
4516
4611
|
}
|
4517
4612
|
|
4518
|
-
/**
|
4519
|
-
* Handle copy of current selected text
|
4520
|
-
* @param {React.ClipboardEvent} event
|
4521
|
-
*/
|
4522
|
-
function handleCopy(event) {
|
4523
|
-
var selection = window.getSelection();
|
4524
|
-
if (selection !== null) {
|
4525
|
-
var selectedText = '';
|
4526
|
-
if (selection.anchorNode && selection.anchorNode.nodeType === Node.ELEMENT_NODE) {
|
4527
|
-
// @ts-ignore
|
4528
|
-
selectedText = selection.anchorNode.innerHTML;
|
4529
|
-
} else if (selection.anchorNode && selection.anchorNode.nodeType === Node.TEXT_NODE) {
|
4530
|
-
var _selection$anchorNode;
|
4531
|
-
selectedText = (_selection$anchorNode = selection.anchorNode.textContent) !== null && _selection$anchorNode !== void 0 ? _selection$anchorNode : '';
|
4532
|
-
}
|
4533
|
-
var text = replaceAllTextEmojiToString(selectedText);
|
4534
|
-
event.clipboardData.setData("text", text);
|
4535
|
-
event.preventDefault();
|
4536
|
-
}
|
4537
|
-
}
|
4538
|
-
|
4539
4613
|
/**
|
4540
4614
|
* Handle past on input
|
4541
4615
|
* @param {React.ClipboardEvent} event
|