react-input-emoji 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js +106 -56
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +315 -265
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
package/dist/index.es.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useRef, useCallback, useImperativeHandle, useEffect, forwardRef,
|
1
|
+
import React, { useRef, useCallback, useImperativeHandle, useEffect, forwardRef, useMemo, memo, useState } from 'react';
|
2
2
|
import PropTypes from 'prop-types';
|
3
3
|
|
4
4
|
function styleInject(css, ref) {
|
@@ -156,6 +156,7 @@ function handlePasteHtmlAtCaret(html) {
|
|
156
156
|
if (window.getSelection) {
|
157
157
|
// IE9 and non-IE
|
158
158
|
sel = window.getSelection();
|
159
|
+
if (sel === null) return;
|
159
160
|
|
160
161
|
if (sel.getRangeAt && sel.rangeCount) {
|
161
162
|
range = sel.getRangeAt(0);
|
@@ -251,7 +252,7 @@ function replaceAllHtmlToString(html) {
|
|
251
252
|
/**
|
252
253
|
* @typedef {Object} Props
|
253
254
|
* @property {React.Ref<any>} ref
|
254
|
-
* @property {React.MutableRefObject<import('../text-input').Ref>} textInputRef
|
255
|
+
* @property {React.MutableRefObject<import('../text-input').Ref | null>} textInputRef
|
255
256
|
* @property {(value: string) => void} setValue
|
256
257
|
* @property {() => void} emitChange
|
257
258
|
*/
|
@@ -281,10 +282,14 @@ function useExpose({
|
|
281
282
|
},
|
282
283
|
|
283
284
|
focus: () => {
|
285
|
+
if (textInputRef.current === null) return;
|
284
286
|
textInputRef.current.focus();
|
285
287
|
},
|
286
288
|
blur: () => {
|
287
|
-
|
289
|
+
if (textInputRef.current !== null) {
|
290
|
+
sanitize(textInputRef.current.html);
|
291
|
+
}
|
292
|
+
|
288
293
|
emitChange();
|
289
294
|
}
|
290
295
|
}));
|
@@ -294,16 +299,17 @@ function useExpose({
|
|
294
299
|
|
295
300
|
/**
|
296
301
|
* useEmit
|
297
|
-
* @param {React.MutableRefObject<import('../text-input').Ref>} textInputRef
|
302
|
+
* @param {React.MutableRefObject<import('../text-input').Ref | null>} textInputRef
|
298
303
|
* @param {(size: {width: number, height: number}) => void} onResize
|
299
304
|
* @param {(text: string) => void} onChange
|
300
305
|
*/
|
301
306
|
|
302
307
|
function useEmit(textInputRef, onResize, onChange) {
|
308
|
+
/** @type {React.MutableRefObject<{width: number; height: number} | null>} */
|
303
309
|
const currentSizeRef = useRef(null);
|
304
310
|
const onChangeFn = useRef(onChange);
|
305
311
|
const checkAndEmitResize = useCallback(() => {
|
306
|
-
if (textInputRef.current) {
|
312
|
+
if (textInputRef.current !== null) {
|
307
313
|
const currentSize = currentSizeRef.current;
|
308
314
|
const nextSize = textInputRef.current.size;
|
309
315
|
|
@@ -337,7 +343,7 @@ function useEmit(textInputRef, onResize, onChange) {
|
|
337
343
|
* @property {(event: React.KeyboardEvent) => void} onKeyDown
|
338
344
|
* @property {(event: React.KeyboardEvent) => void} onKeyUp
|
339
345
|
* @property {() => void} onFocus
|
340
|
-
* @property {() => void
|
346
|
+
* @property {() => void} onBlur
|
341
347
|
* @property {(sanitizedText: string) => void=} onChange
|
342
348
|
* @property {(event: React.KeyboardEvent) => void} onArrowUp
|
343
349
|
* @property {(event: React.KeyboardEvent) => void} onArrowDown
|
@@ -374,40 +380,63 @@ const TextInput = ({
|
|
374
380
|
}, ref) => {
|
375
381
|
useImperativeHandle(ref, () => ({
|
376
382
|
appendContent: html => {
|
377
|
-
textInputRef.current
|
383
|
+
if (textInputRef.current) {
|
384
|
+
textInputRef.current.focus();
|
385
|
+
}
|
386
|
+
|
378
387
|
handlePasteHtmlAtCaret(html);
|
379
|
-
textInputRef.current.focus();
|
380
388
|
|
381
|
-
if (textInputRef.current
|
389
|
+
if (textInputRef.current) {
|
390
|
+
textInputRef.current.focus();
|
391
|
+
}
|
392
|
+
|
393
|
+
if (textInputRef.current && placeholderRef.current && textInputRef.current.innerHTML.trim() === "") {
|
382
394
|
placeholderRef.current.style.visibility = "visible";
|
383
|
-
} else {
|
395
|
+
} else if (placeholderRef.current) {
|
384
396
|
placeholderRef.current.style.visibility = "hidden";
|
385
397
|
}
|
386
398
|
|
387
|
-
|
399
|
+
if (textInputRef.current && typeof onChange === 'function') {
|
400
|
+
onChange(textInputRef.current.innerHTML);
|
401
|
+
}
|
388
402
|
},
|
389
403
|
|
390
404
|
set html(value) {
|
391
|
-
textInputRef.current
|
405
|
+
if (textInputRef.current) {
|
406
|
+
textInputRef.current.innerHTML = value;
|
407
|
+
}
|
392
408
|
|
393
|
-
if (
|
394
|
-
|
395
|
-
|
396
|
-
|
409
|
+
if (placeholderRef.current) {
|
410
|
+
if (value.trim() === "") {
|
411
|
+
placeholderRef.current.style.visibility = "visible";
|
412
|
+
} else {
|
413
|
+
placeholderRef.current.style.visibility = "hidden";
|
414
|
+
}
|
397
415
|
}
|
398
416
|
|
399
|
-
onChange
|
417
|
+
if (typeof onChange === 'function' && textInputRef.current) {
|
418
|
+
onChange(textInputRef.current.innerHTML);
|
419
|
+
}
|
400
420
|
},
|
401
421
|
|
402
422
|
get html() {
|
423
|
+
if (!textInputRef.current) return '';
|
403
424
|
return textInputRef.current.innerHTML;
|
404
425
|
},
|
405
426
|
|
406
427
|
get text() {
|
428
|
+
if (!textInputRef.current) return '';
|
407
429
|
return textInputRef.current.innerText;
|
408
430
|
},
|
409
431
|
|
410
432
|
get size() {
|
433
|
+
if (!textInputRef.current) {
|
434
|
+
return {
|
435
|
+
width: 0,
|
436
|
+
height: 0
|
437
|
+
};
|
438
|
+
}
|
439
|
+
|
411
440
|
return {
|
412
441
|
width: textInputRef.current.offsetWidth,
|
413
442
|
height: textInputRef.current.offsetHeight
|
@@ -415,14 +444,15 @@ const TextInput = ({
|
|
415
444
|
},
|
416
445
|
|
417
446
|
focus() {
|
447
|
+
if (!textInputRef.current) return;
|
418
448
|
textInputRef.current.focus();
|
419
449
|
}
|
420
450
|
|
421
451
|
}));
|
422
|
-
/** @type {React.MutableRefObject<HTMLDivElement>} */
|
452
|
+
/** @type {React.MutableRefObject<HTMLDivElement | null>} */
|
423
453
|
|
424
454
|
const placeholderRef = useRef(null);
|
425
|
-
/** @type {React.MutableRefObject<HTMLDivElement>} */
|
455
|
+
/** @type {React.MutableRefObject<HTMLDivElement | null>} */
|
426
456
|
|
427
457
|
const textInputRef = useRef(null);
|
428
458
|
/**
|
@@ -438,7 +468,7 @@ const TextInput = ({
|
|
438
468
|
} else if (event.key === "ArrowDown") {
|
439
469
|
props.onArrowDown(event);
|
440
470
|
} else {
|
441
|
-
if (event.key.length === 1) {
|
471
|
+
if (event.key.length === 1 && placeholderRef.current) {
|
442
472
|
placeholderRef.current.style.visibility = "hidden";
|
443
473
|
}
|
444
474
|
}
|
@@ -458,18 +488,20 @@ const TextInput = ({
|
|
458
488
|
|
459
489
|
|
460
490
|
function handleKeyUp(event) {
|
461
|
-
var _input$innerText;
|
462
|
-
|
463
491
|
props.onKeyUp(event);
|
464
492
|
const input = textInputRef.current;
|
465
493
|
|
466
|
-
if (
|
467
|
-
|
468
|
-
|
469
|
-
|
494
|
+
if (placeholderRef.current) {
|
495
|
+
if (input?.innerText?.trim() === "") {
|
496
|
+
placeholderRef.current.style.visibility = "visible";
|
497
|
+
} else {
|
498
|
+
placeholderRef.current.style.visibility = "hidden";
|
499
|
+
}
|
470
500
|
}
|
471
501
|
|
472
|
-
onChange
|
502
|
+
if (typeof onChange === 'function' && textInputRef.current) {
|
503
|
+
onChange(textInputRef.current.innerHTML);
|
504
|
+
}
|
473
505
|
}
|
474
506
|
|
475
507
|
return /*#__PURE__*/React.createElement("div", {
|
@@ -49301,23 +49333,20 @@ function _defineProperties(target, props) {
|
|
49301
49333
|
function _createClass(Constructor, protoProps, staticProps) {
|
49302
49334
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
49303
49335
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
49336
|
+
Object.defineProperty(Constructor, "prototype", {
|
49337
|
+
writable: false
|
49338
|
+
});
|
49304
49339
|
return Constructor;
|
49305
49340
|
}
|
49306
49341
|
|
49307
49342
|
function _typeof(obj) {
|
49308
49343
|
"@babel/helpers - typeof";
|
49309
49344
|
|
49310
|
-
|
49311
|
-
|
49312
|
-
|
49313
|
-
|
49314
|
-
}
|
49315
|
-
_typeof = function _typeof(obj) {
|
49316
|
-
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
49317
|
-
};
|
49318
|
-
}
|
49319
|
-
|
49320
|
-
return _typeof(obj);
|
49345
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
49346
|
+
return typeof obj;
|
49347
|
+
} : function (obj) {
|
49348
|
+
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
49349
|
+
}, _typeof(obj);
|
49321
49350
|
}
|
49322
49351
|
|
49323
49352
|
var mapping = {
|
@@ -49407,8 +49436,8 @@ var stringFromCodePoint = _String.fromCodePoint || function stringFromCodePoint(
|
|
49407
49436
|
codePoint > 0x10ffff || // not a valid Unicode code point
|
49408
49437
|
Math.floor(codePoint) != codePoint // not an integer
|
49409
49438
|
) {
|
49410
|
-
|
49411
|
-
|
49439
|
+
throw RangeError('Invalid code point: ' + codePoint);
|
49440
|
+
}
|
49412
49441
|
|
49413
49442
|
if (codePoint <= 0xffff) {
|
49414
49443
|
// BMP code point
|
@@ -50011,7 +50040,7 @@ function _defineProperty(obj, key, value) {
|
|
50011
50040
|
}
|
50012
50041
|
|
50013
50042
|
function _extends() {
|
50014
|
-
_extends = Object.assign
|
50043
|
+
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
50015
50044
|
for (var i = 1; i < arguments.length; i++) {
|
50016
50045
|
var source = arguments[i];
|
50017
50046
|
|
@@ -50024,7 +50053,6 @@ function _extends() {
|
|
50024
50053
|
|
50025
50054
|
return target;
|
50026
50055
|
};
|
50027
|
-
|
50028
50056
|
return _extends.apply(this, arguments);
|
50029
50057
|
}
|
50030
50058
|
|
@@ -50039,24 +50067,25 @@ function _assertThisInitialized(self) {
|
|
50039
50067
|
function _possibleConstructorReturn(self, call) {
|
50040
50068
|
if (call && (_typeof(call) === "object" || typeof call === "function")) {
|
50041
50069
|
return call;
|
50070
|
+
} else if (call !== void 0) {
|
50071
|
+
throw new TypeError("Derived constructors may only return object or undefined");
|
50042
50072
|
}
|
50043
50073
|
|
50044
50074
|
return _assertThisInitialized(self);
|
50045
50075
|
}
|
50046
50076
|
|
50047
50077
|
function _getPrototypeOf(o) {
|
50048
|
-
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
|
50078
|
+
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
|
50049
50079
|
return o.__proto__ || Object.getPrototypeOf(o);
|
50050
50080
|
};
|
50051
50081
|
return _getPrototypeOf(o);
|
50052
50082
|
}
|
50053
50083
|
|
50054
50084
|
function _setPrototypeOf(o, p) {
|
50055
|
-
_setPrototypeOf = Object.setPrototypeOf
|
50085
|
+
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
50056
50086
|
o.__proto__ = p;
|
50057
50087
|
return o;
|
50058
50088
|
};
|
50059
|
-
|
50060
50089
|
return _setPrototypeOf(o, p);
|
50061
50090
|
}
|
50062
50091
|
|
@@ -50072,6 +50101,9 @@ function _inherits(subClass, superClass) {
|
|
50072
50101
|
configurable: true
|
50073
50102
|
}
|
50074
50103
|
});
|
50104
|
+
Object.defineProperty(subClass, "prototype", {
|
50105
|
+
writable: false
|
50106
|
+
});
|
50075
50107
|
if (superClass) _setPrototypeOf(subClass, superClass);
|
50076
50108
|
}
|
50077
50109
|
|
@@ -52606,7 +52638,7 @@ function getElementWithFocus() {
|
|
52606
52638
|
|
52607
52639
|
function getSelectionStart() {
|
52608
52640
|
const node = document.getSelection().anchorNode;
|
52609
|
-
return
|
52641
|
+
return node?.nodeType == 3 ? node : null;
|
52610
52642
|
}
|
52611
52643
|
|
52612
52644
|
// @ts-check
|
@@ -52651,11 +52683,9 @@ function useMention(searchMention) {
|
|
52651
52683
|
/** @type {(event: React.KeyboardEvent) => void} */
|
52652
52684
|
|
52653
52685
|
const onKeyUp = useCallback(async event => {
|
52654
|
-
var _getElementWithFocus;
|
52655
|
-
|
52656
52686
|
if (typeof searchMention !== "function") return;
|
52657
52687
|
|
52658
|
-
if (event.key === "Backspace" &&
|
52688
|
+
if (event.key === "Backspace" && getElementWithFocus()?.element.parentElement.hasAttribute("data-mention-id")) {
|
52659
52689
|
const elementWithFocus = getElementWithFocus();
|
52660
52690
|
elementWithFocus.element.parentElement.remove();
|
52661
52691
|
} else if (!["ArrowUp", "ArrowDown", "Esc", "Escape"].includes(event.key)) {
|
@@ -53006,7 +53036,8 @@ function useEventListeners() {
|
|
53006
53036
|
arrowUp: createObserver(),
|
53007
53037
|
arrowDown: createObserver(),
|
53008
53038
|
enter: createObserver(),
|
53009
|
-
focus: createObserver()
|
53039
|
+
focus: createObserver(),
|
53040
|
+
blur: createObserver()
|
53010
53041
|
}), []);
|
53011
53042
|
/**
|
53012
53043
|
* @template {keyof TextInputListeners} T, K
|
@@ -53072,6 +53103,7 @@ function usePollute() {
|
|
53072
53103
|
* @property {(size: {width: number, height: number}) => void} onResize
|
53073
53104
|
* @property {() => void} onClick
|
53074
53105
|
* @property {() => void} onFocus
|
53106
|
+
* @property {() => void=} onBlur
|
53075
53107
|
* @property {number} maxLength
|
53076
53108
|
* @property {boolean} keepOpened
|
53077
53109
|
* @property {(event: KeyboardEvent) => void} onKeyDown
|
@@ -53101,6 +53133,7 @@ function InputEmoji(props, ref) {
|
|
53101
53133
|
onResize,
|
53102
53134
|
onClick,
|
53103
53135
|
onFocus,
|
53136
|
+
onBlur,
|
53104
53137
|
onKeyDown,
|
53105
53138
|
theme,
|
53106
53139
|
cleanOnEnter,
|
@@ -53119,7 +53152,7 @@ function InputEmoji(props, ref) {
|
|
53119
53152
|
fontSize,
|
53120
53153
|
fontFamily
|
53121
53154
|
} = props;
|
53122
|
-
/** @type {React.MutableRefObject<import('./text-input').Ref>} */
|
53155
|
+
/** @type {React.MutableRefObject<import('./text-input').Ref | null>} */
|
53123
53156
|
|
53124
53157
|
const textInputRef = useRef(null);
|
53125
53158
|
const {
|
@@ -53136,6 +53169,7 @@ function InputEmoji(props, ref) {
|
|
53136
53169
|
pollute
|
53137
53170
|
} = usePollute();
|
53138
53171
|
const updateHTML = useCallback((nextValue = "") => {
|
53172
|
+
if (textInputRef.current === null) return;
|
53139
53173
|
textInputRef.current.html = replaceAllTextEmojis(nextValue);
|
53140
53174
|
sanitizedTextRef.current = nextValue;
|
53141
53175
|
}, [sanitizedTextRef]);
|
@@ -53164,11 +53198,11 @@ function InputEmoji(props, ref) {
|
|
53164
53198
|
* @return {boolean}
|
53165
53199
|
*/
|
53166
53200
|
function handleKeydown(event) {
|
53167
|
-
if (typeof maxLength !== "undefined" && event.key !== "Backspace" && totalCharacters(textInputRef.current) >= maxLength) {
|
53201
|
+
if (typeof maxLength !== "undefined" && event.key !== "Backspace" && textInputRef.current !== null && totalCharacters(textInputRef.current) >= maxLength) {
|
53168
53202
|
event.preventDefault();
|
53169
53203
|
}
|
53170
53204
|
|
53171
|
-
if (event.key === "Enter") {
|
53205
|
+
if (event.key === "Enter" && textInputRef.current) {
|
53172
53206
|
event.preventDefault();
|
53173
53207
|
const text = sanitize(textInputRef.current.html);
|
53174
53208
|
emitChange(sanitizedTextRef.current);
|
@@ -53217,6 +53251,19 @@ function InputEmoji(props, ref) {
|
|
53217
53251
|
unsubscribe();
|
53218
53252
|
};
|
53219
53253
|
}, [addEventListener, onClick, onFocus]);
|
53254
|
+
useEffect(() => {
|
53255
|
+
/** */
|
53256
|
+
function handleBlur() {
|
53257
|
+
if (typeof onBlur === 'function') {
|
53258
|
+
onBlur();
|
53259
|
+
}
|
53260
|
+
}
|
53261
|
+
|
53262
|
+
const unsubscribe = addEventListener('blur', handleBlur);
|
53263
|
+
return () => {
|
53264
|
+
unsubscribe();
|
53265
|
+
};
|
53266
|
+
}, [addEventListener, onBlur]);
|
53220
53267
|
/**
|
53221
53268
|
*
|
53222
53269
|
* @param {string} html
|
@@ -53233,11 +53280,13 @@ function InputEmoji(props, ref) {
|
|
53233
53280
|
|
53234
53281
|
|
53235
53282
|
function appendContent(html) {
|
53236
|
-
if (typeof maxLength !== "undefined" && totalCharacters(textInputRef.current) >= maxLength) {
|
53283
|
+
if (typeof maxLength !== "undefined" && textInputRef.current !== null && totalCharacters(textInputRef.current) >= maxLength) {
|
53237
53284
|
return;
|
53238
53285
|
}
|
53239
53286
|
|
53240
|
-
textInputRef.current
|
53287
|
+
if (textInputRef.current !== null) {
|
53288
|
+
textInputRef.current.appendContent(html);
|
53289
|
+
}
|
53241
53290
|
}
|
53242
53291
|
/**
|
53243
53292
|
* Handle copy of current selected text
|
@@ -53277,6 +53326,7 @@ function InputEmoji(props, ref) {
|
|
53277
53326
|
ref: textInputRef,
|
53278
53327
|
onCopy: handleCopy,
|
53279
53328
|
onPaste: handlePaste,
|
53329
|
+
onBlur: listeners.blur.publish,
|
53280
53330
|
onFocus: listeners.focus.publish,
|
53281
53331
|
onArrowUp: listeners.arrowUp.publish,
|
53282
53332
|
onArrowDown: listeners.arrowDown.publish,
|
@@ -53319,5 +53369,5 @@ InputEmojiWithRef.defaultProps = {
|
|
53319
53369
|
customEmojis: []
|
53320
53370
|
};
|
53321
53371
|
|
53322
|
-
export default
|
53372
|
+
export { InputEmojiWithRef as default };
|
53323
53373
|
//# sourceMappingURL=index.es.js.map
|