react-input-emoji 4.0.8 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +2 -1
- package/dist/index.es.js +168 -99
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +376 -307
- package/dist/index.js.map +1 -1
- package/package.json +1 -2
package/README.md
CHANGED
@@ -46,7 +46,7 @@ export default function Example() {
|
|
46
46
|
## Props
|
47
47
|
|
48
48
|
| Prop | Type | Default | Description |
|
49
|
-
|
49
|
+
|----------------|----------|------------------|--------------------------------------------------------------------------------------------------------------------------|
|
50
50
|
| `value` | string | "" | The input value. |
|
51
51
|
| `onChange` | function | - | This function is called when the value of the input changes. The first argument is the current value. |
|
52
52
|
| `onResize` | function | - | This function is called when the width or the height of the input changes. The first argument is the current size value. |
|
@@ -57,6 +57,7 @@ export default function Example() {
|
|
57
57
|
| `placeholder` | string | "Type a message" | Set the placeholder of the input. |
|
58
58
|
| `height` | number | 40 | The total height of the area in which the element is rendered. |
|
59
59
|
| `maxLength` | number | - | The maximum number of characters allowed in the element. |
|
60
|
+
| `theme` | string | - | Set theme for emoji popup. Available values "light", "dark", "auto" |
|
60
61
|
| `borderRadius` | number | 21 | The border radius of the input container. |
|
61
62
|
| `borderColor` | string | "#EAEAEA" | The border color of the input container. |
|
62
63
|
| `fontSize` | number | 15 | The font size of the placeholder and input container. |
|
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
|
|
@@ -52346,6 +52378,7 @@ styleInject(css_248z);
|
|
52346
52378
|
// vendors
|
52347
52379
|
/**
|
52348
52380
|
* @typedef {object} Props
|
52381
|
+
* @property {'light' | 'dark' | 'auto'} theme
|
52349
52382
|
* @property {function(import("../types/types").EmojiMartItem): void} onSelectEmoji
|
52350
52383
|
* @property {boolean} disableRecent
|
52351
52384
|
* @property {object[]} customEmojis
|
@@ -52357,12 +52390,14 @@ styleInject(css_248z);
|
|
52357
52390
|
* @return {React.FC}
|
52358
52391
|
*/
|
52359
52392
|
|
52360
|
-
function EmojiPicker({
|
52361
|
-
|
52362
|
-
|
52363
|
-
|
52364
|
-
|
52365
|
-
|
52393
|
+
function EmojiPicker(props) {
|
52394
|
+
const {
|
52395
|
+
theme,
|
52396
|
+
onSelectEmoji,
|
52397
|
+
disableRecent,
|
52398
|
+
customEmojis
|
52399
|
+
} = props;
|
52400
|
+
const excludePicker = useMemo(() => {
|
52366
52401
|
/** @type import("emoji-mart").CategoryName[] */
|
52367
52402
|
const exclude = [];
|
52368
52403
|
|
@@ -52373,16 +52408,18 @@ function EmojiPicker({
|
|
52373
52408
|
return exclude;
|
52374
52409
|
}, [disableRecent]);
|
52375
52410
|
return /*#__PURE__*/React.createElement(Picker, {
|
52411
|
+
theme: theme,
|
52412
|
+
set: "apple",
|
52376
52413
|
showPreview: false,
|
52377
52414
|
showSkinTones: false,
|
52378
|
-
set: "apple",
|
52379
52415
|
onSelect: onSelectEmoji,
|
52380
|
-
exclude:
|
52416
|
+
exclude: excludePicker,
|
52381
52417
|
custom: customEmojis
|
52382
52418
|
});
|
52383
52419
|
}
|
52384
52420
|
|
52385
52421
|
EmojiPicker.propTypes = {
|
52422
|
+
theme: PropTypes.oneOf(['light', 'dark', 'auto']),
|
52386
52423
|
onSelectEmoji: PropTypes.func,
|
52387
52424
|
disableRecent: PropTypes.bool,
|
52388
52425
|
customEmojis: PropTypes.array
|
@@ -52400,7 +52437,8 @@ var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
|
|
52400
52437
|
|
52401
52438
|
/**
|
52402
52439
|
* @typedef {Object} Props
|
52403
|
-
* @property {
|
52440
|
+
* @property {'light' | 'dark' | 'auto'} theme
|
52441
|
+
* @property {boolean} keepOpened
|
52404
52442
|
* @property {boolean} disableRecent
|
52405
52443
|
* @property {object[]=} customEmojis
|
52406
52444
|
* @property {(fn: SanitizeFn) => void} addSanitizeFn
|
@@ -52411,14 +52449,16 @@ var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
|
|
52411
52449
|
|
52412
52450
|
/** @type {React.FC<Props>} */
|
52413
52451
|
|
52414
|
-
const EmojiPickerWrapper =
|
52415
|
-
|
52416
|
-
|
52417
|
-
|
52418
|
-
|
52419
|
-
|
52420
|
-
|
52421
|
-
|
52452
|
+
const EmojiPickerWrapper = props => {
|
52453
|
+
const {
|
52454
|
+
theme,
|
52455
|
+
keepOpened,
|
52456
|
+
disableRecent,
|
52457
|
+
customEmojis,
|
52458
|
+
addSanitizeFn,
|
52459
|
+
addPolluteFn,
|
52460
|
+
appendContent
|
52461
|
+
} = props;
|
52422
52462
|
const [showPicker, setShowPicker] = useState(false);
|
52423
52463
|
useEffect(() => {
|
52424
52464
|
addSanitizeFn(replaceAllTextEmojiToString);
|
@@ -52468,7 +52508,7 @@ const EmojiPickerWrapper = ({
|
|
52468
52508
|
function handleSelectEmoji(emoji) {
|
52469
52509
|
appendContent(getImageEmoji(emoji));
|
52470
52510
|
|
52471
|
-
if (!
|
52511
|
+
if (!keepOpened) {
|
52472
52512
|
setShowPicker(currentShowPicker => !currentShowPicker);
|
52473
52513
|
}
|
52474
52514
|
}
|
@@ -52481,10 +52521,12 @@ const EmojiPickerWrapper = ({
|
|
52481
52521
|
}, /*#__PURE__*/React.createElement("div", {
|
52482
52522
|
className: "react-emoji-picker"
|
52483
52523
|
}, /*#__PURE__*/React.createElement(EmojiPicker$1, {
|
52524
|
+
theme: theme,
|
52484
52525
|
onSelectEmoji: handleSelectEmoji,
|
52485
52526
|
disableRecent: disableRecent,
|
52486
52527
|
customEmojis: customEmojis
|
52487
52528
|
})))), /*#__PURE__*/React.createElement("button", {
|
52529
|
+
type: "button",
|
52488
52530
|
className: `react-input-emoji--button${showPicker ? " react-input-emoji--button__show" : ""}`,
|
52489
52531
|
onClick: toggleShowPicker
|
52490
52532
|
}, /*#__PURE__*/React.createElement("svg", {
|
@@ -52596,7 +52638,7 @@ function getElementWithFocus() {
|
|
52596
52638
|
|
52597
52639
|
function getSelectionStart() {
|
52598
52640
|
const node = document.getSelection().anchorNode;
|
52599
|
-
return
|
52641
|
+
return node?.nodeType == 3 ? node : null;
|
52600
52642
|
}
|
52601
52643
|
|
52602
52644
|
// @ts-check
|
@@ -52641,11 +52683,9 @@ function useMention(searchMention) {
|
|
52641
52683
|
/** @type {(event: React.KeyboardEvent) => void} */
|
52642
52684
|
|
52643
52685
|
const onKeyUp = useCallback(async event => {
|
52644
|
-
var _getElementWithFocus;
|
52645
|
-
|
52646
52686
|
if (typeof searchMention !== "function") return;
|
52647
52687
|
|
52648
|
-
if (event.key === "Backspace" &&
|
52688
|
+
if (event.key === "Backspace" && getElementWithFocus()?.element.parentElement.hasAttribute("data-mention-id")) {
|
52649
52689
|
const elementWithFocus = getElementWithFocus();
|
52650
52690
|
elementWithFocus.element.parentElement.remove();
|
52651
52691
|
} else if (!["ArrowUp", "ArrowDown", "Esc", "Escape"].includes(event.key)) {
|
@@ -52788,6 +52828,7 @@ const MentionUserList = ({
|
|
52788
52828
|
}, usersFiltered.map((user, index) => /*#__PURE__*/React.createElement("li", {
|
52789
52829
|
key: user.id
|
52790
52830
|
}, /*#__PURE__*/React.createElement("button", {
|
52831
|
+
type: "button",
|
52791
52832
|
onClick: handleClick(user),
|
52792
52833
|
className: `react-input-emoji--mention--item${selectedUser === index ? " react-input-emoji--mention--item__selected" : ""}`,
|
52793
52834
|
onMouseOver: () => setSelectedUser(index)
|
@@ -52995,7 +53036,8 @@ function useEventListeners() {
|
|
52995
53036
|
arrowUp: createObserver(),
|
52996
53037
|
arrowDown: createObserver(),
|
52997
53038
|
enter: createObserver(),
|
52998
|
-
focus: createObserver()
|
53039
|
+
focus: createObserver(),
|
53040
|
+
blur: createObserver()
|
52999
53041
|
}), []);
|
53000
53042
|
/**
|
53001
53043
|
* @template {keyof TextInputListeners} T, K
|
@@ -53054,14 +53096,16 @@ function usePollute() {
|
|
53054
53096
|
* @typedef {object} Props
|
53055
53097
|
* @property {string} value
|
53056
53098
|
* @property {(value: string) => void} onChange
|
53099
|
+
* @property {"light" | "dark" | "auto"} theme
|
53057
53100
|
* @property {boolean} cleanOnEnter
|
53058
53101
|
* @property {(text: string) => void} onEnter
|
53059
53102
|
* @property {string} placeholder
|
53060
53103
|
* @property {(size: {width: number, height: number}) => void} onResize
|
53061
53104
|
* @property {() => void} onClick
|
53062
53105
|
* @property {() => void} onFocus
|
53106
|
+
* @property {() => void=} onBlur
|
53063
53107
|
* @property {number} maxLength
|
53064
|
-
* @property {boolean}
|
53108
|
+
* @property {boolean} keepOpened
|
53065
53109
|
* @property {(event: KeyboardEvent) => void} onKeyDown
|
53066
53110
|
* @property {string} inputClass
|
53067
53111
|
* @property {boolean} disableRecent
|
@@ -53082,30 +53126,34 @@ function usePollute() {
|
|
53082
53126
|
* @return {JSX.Element}
|
53083
53127
|
*/
|
53084
53128
|
|
53085
|
-
function InputEmoji({
|
53086
|
-
|
53087
|
-
|
53088
|
-
|
53089
|
-
|
53090
|
-
|
53091
|
-
|
53092
|
-
|
53093
|
-
|
53094
|
-
|
53095
|
-
|
53096
|
-
|
53097
|
-
|
53098
|
-
|
53099
|
-
|
53100
|
-
|
53101
|
-
|
53102
|
-
|
53103
|
-
|
53104
|
-
|
53105
|
-
|
53106
|
-
|
53107
|
-
|
53108
|
-
|
53129
|
+
function InputEmoji(props, ref) {
|
53130
|
+
const {
|
53131
|
+
onChange,
|
53132
|
+
onEnter,
|
53133
|
+
onResize,
|
53134
|
+
onClick,
|
53135
|
+
onFocus,
|
53136
|
+
onBlur,
|
53137
|
+
onKeyDown,
|
53138
|
+
theme,
|
53139
|
+
cleanOnEnter,
|
53140
|
+
placeholder,
|
53141
|
+
maxLength,
|
53142
|
+
keepOpened,
|
53143
|
+
inputClass,
|
53144
|
+
disableRecent,
|
53145
|
+
tabIndex,
|
53146
|
+
value,
|
53147
|
+
customEmojis,
|
53148
|
+
searchMention,
|
53149
|
+
// style
|
53150
|
+
borderRadius,
|
53151
|
+
borderColor,
|
53152
|
+
fontSize,
|
53153
|
+
fontFamily
|
53154
|
+
} = props;
|
53155
|
+
/** @type {React.MutableRefObject<import('./text-input').Ref | null>} */
|
53156
|
+
|
53109
53157
|
const textInputRef = useRef(null);
|
53110
53158
|
const {
|
53111
53159
|
addEventListener,
|
@@ -53121,6 +53169,7 @@ function InputEmoji({
|
|
53121
53169
|
pollute
|
53122
53170
|
} = usePollute();
|
53123
53171
|
const updateHTML = useCallback((nextValue = "") => {
|
53172
|
+
if (textInputRef.current === null) return;
|
53124
53173
|
textInputRef.current.html = replaceAllTextEmojis(nextValue);
|
53125
53174
|
sanitizedTextRef.current = nextValue;
|
53126
53175
|
}, [sanitizedTextRef]);
|
@@ -53149,11 +53198,11 @@ function InputEmoji({
|
|
53149
53198
|
* @return {boolean}
|
53150
53199
|
*/
|
53151
53200
|
function handleKeydown(event) {
|
53152
|
-
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) {
|
53153
53202
|
event.preventDefault();
|
53154
53203
|
}
|
53155
53204
|
|
53156
|
-
if (event.key === "Enter") {
|
53205
|
+
if (event.key === "Enter" && textInputRef.current) {
|
53157
53206
|
event.preventDefault();
|
53158
53207
|
const text = sanitize(textInputRef.current.html);
|
53159
53208
|
emitChange(sanitizedTextRef.current);
|
@@ -53202,6 +53251,19 @@ function InputEmoji({
|
|
53202
53251
|
unsubscribe();
|
53203
53252
|
};
|
53204
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]);
|
53205
53267
|
/**
|
53206
53268
|
*
|
53207
53269
|
* @param {string} html
|
@@ -53218,11 +53280,13 @@ function InputEmoji({
|
|
53218
53280
|
|
53219
53281
|
|
53220
53282
|
function appendContent(html) {
|
53221
|
-
if (typeof maxLength !== "undefined" && totalCharacters(textInputRef.current) >= maxLength) {
|
53283
|
+
if (typeof maxLength !== "undefined" && textInputRef.current !== null && totalCharacters(textInputRef.current) >= maxLength) {
|
53222
53284
|
return;
|
53223
53285
|
}
|
53224
53286
|
|
53225
|
-
textInputRef.current
|
53287
|
+
if (textInputRef.current !== null) {
|
53288
|
+
textInputRef.current.appendContent(html);
|
53289
|
+
}
|
53226
53290
|
}
|
53227
53291
|
/**
|
53228
53292
|
* Handle copy of current selected text
|
@@ -53262,6 +53326,7 @@ function InputEmoji({
|
|
53262
53326
|
ref: textInputRef,
|
53263
53327
|
onCopy: handleCopy,
|
53264
53328
|
onPaste: handlePaste,
|
53329
|
+
onBlur: listeners.blur.publish,
|
53265
53330
|
onFocus: listeners.focus.publish,
|
53266
53331
|
onArrowUp: listeners.arrowUp.publish,
|
53267
53332
|
onArrowDown: listeners.arrowDown.publish,
|
@@ -53279,7 +53344,8 @@ function InputEmoji({
|
|
53279
53344
|
className: inputClass,
|
53280
53345
|
onChange: handleTextInputChange
|
53281
53346
|
}), /*#__PURE__*/React.createElement(EmojiPickerWrapper, {
|
53282
|
-
|
53347
|
+
theme: theme,
|
53348
|
+
keepOpened: keepOpened,
|
53283
53349
|
disableRecent: disableRecent,
|
53284
53350
|
customEmojis: customEmojis,
|
53285
53351
|
addSanitizeFn: addSanitizeFn,
|
@@ -53290,6 +53356,9 @@ function InputEmoji({
|
|
53290
53356
|
|
53291
53357
|
const InputEmojiWithRef = /*#__PURE__*/forwardRef(InputEmoji);
|
53292
53358
|
InputEmojiWithRef.defaultProps = {
|
53359
|
+
theme:
|
53360
|
+
/** @type {const} */
|
53361
|
+
"auto",
|
53293
53362
|
height: 30,
|
53294
53363
|
placeholder: "Type a message",
|
53295
53364
|
borderRadius: 21,
|
@@ -53300,5 +53369,5 @@ InputEmojiWithRef.defaultProps = {
|
|
53300
53369
|
customEmojis: []
|
53301
53370
|
};
|
53302
53371
|
|
53303
|
-
export default
|
53372
|
+
export { InputEmojiWithRef as default };
|
53304
53373
|
//# sourceMappingURL=index.es.js.map
|