react-input-emoji 4.1.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.es.js +224 -84
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +426 -285
- package/dist/index.js.map +1 -1
- package/package.json +2 -3
package/dist/index.es.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
import React, { useRef, useCallback, useImperativeHandle, useEffect, forwardRef,
|
1
|
+
import React, { useRef, useCallback, useImperativeHandle, useEffect, forwardRef, useState, useMemo, memo } from 'react';
|
2
|
+
import ReactDOM from 'react-dom';
|
2
3
|
import PropTypes from 'prop-types';
|
3
4
|
|
4
5
|
function styleInject(css, ref) {
|
@@ -156,6 +157,7 @@ function handlePasteHtmlAtCaret(html) {
|
|
156
157
|
if (window.getSelection) {
|
157
158
|
// IE9 and non-IE
|
158
159
|
sel = window.getSelection();
|
160
|
+
if (sel === null) return;
|
159
161
|
|
160
162
|
if (sel.getRangeAt && sel.rangeCount) {
|
161
163
|
range = sel.getRangeAt(0);
|
@@ -251,7 +253,7 @@ function replaceAllHtmlToString(html) {
|
|
251
253
|
/**
|
252
254
|
* @typedef {Object} Props
|
253
255
|
* @property {React.Ref<any>} ref
|
254
|
-
* @property {React.MutableRefObject<import('../text-input').Ref>} textInputRef
|
256
|
+
* @property {React.MutableRefObject<import('../text-input').Ref | null>} textInputRef
|
255
257
|
* @property {(value: string) => void} setValue
|
256
258
|
* @property {() => void} emitChange
|
257
259
|
*/
|
@@ -281,10 +283,14 @@ function useExpose({
|
|
281
283
|
},
|
282
284
|
|
283
285
|
focus: () => {
|
286
|
+
if (textInputRef.current === null) return;
|
284
287
|
textInputRef.current.focus();
|
285
288
|
},
|
286
289
|
blur: () => {
|
287
|
-
|
290
|
+
if (textInputRef.current !== null) {
|
291
|
+
sanitize(textInputRef.current.html);
|
292
|
+
}
|
293
|
+
|
288
294
|
emitChange();
|
289
295
|
}
|
290
296
|
}));
|
@@ -294,16 +300,17 @@ function useExpose({
|
|
294
300
|
|
295
301
|
/**
|
296
302
|
* useEmit
|
297
|
-
* @param {React.MutableRefObject<import('../text-input').Ref>} textInputRef
|
303
|
+
* @param {React.MutableRefObject<import('../text-input').Ref | null>} textInputRef
|
298
304
|
* @param {(size: {width: number, height: number}) => void} onResize
|
299
305
|
* @param {(text: string) => void} onChange
|
300
306
|
*/
|
301
307
|
|
302
308
|
function useEmit(textInputRef, onResize, onChange) {
|
309
|
+
/** @type {React.MutableRefObject<{width: number; height: number} | null>} */
|
303
310
|
const currentSizeRef = useRef(null);
|
304
311
|
const onChangeFn = useRef(onChange);
|
305
312
|
const checkAndEmitResize = useCallback(() => {
|
306
|
-
if (textInputRef.current) {
|
313
|
+
if (textInputRef.current !== null) {
|
307
314
|
const currentSize = currentSizeRef.current;
|
308
315
|
const nextSize = textInputRef.current.size;
|
309
316
|
|
@@ -337,7 +344,7 @@ function useEmit(textInputRef, onResize, onChange) {
|
|
337
344
|
* @property {(event: React.KeyboardEvent) => void} onKeyDown
|
338
345
|
* @property {(event: React.KeyboardEvent) => void} onKeyUp
|
339
346
|
* @property {() => void} onFocus
|
340
|
-
* @property {() => void
|
347
|
+
* @property {() => void} onBlur
|
341
348
|
* @property {(sanitizedText: string) => void=} onChange
|
342
349
|
* @property {(event: React.KeyboardEvent) => void} onArrowUp
|
343
350
|
* @property {(event: React.KeyboardEvent) => void} onArrowDown
|
@@ -374,40 +381,63 @@ const TextInput = ({
|
|
374
381
|
}, ref) => {
|
375
382
|
useImperativeHandle(ref, () => ({
|
376
383
|
appendContent: html => {
|
377
|
-
textInputRef.current
|
384
|
+
if (textInputRef.current) {
|
385
|
+
textInputRef.current.focus();
|
386
|
+
}
|
387
|
+
|
378
388
|
handlePasteHtmlAtCaret(html);
|
379
|
-
textInputRef.current.focus();
|
380
389
|
|
381
|
-
if (textInputRef.current
|
390
|
+
if (textInputRef.current) {
|
391
|
+
textInputRef.current.focus();
|
392
|
+
}
|
393
|
+
|
394
|
+
if (textInputRef.current && placeholderRef.current && textInputRef.current.innerHTML.trim() === "") {
|
382
395
|
placeholderRef.current.style.visibility = "visible";
|
383
|
-
} else {
|
396
|
+
} else if (placeholderRef.current) {
|
384
397
|
placeholderRef.current.style.visibility = "hidden";
|
385
398
|
}
|
386
399
|
|
387
|
-
|
400
|
+
if (textInputRef.current && typeof onChange === 'function') {
|
401
|
+
onChange(textInputRef.current.innerHTML);
|
402
|
+
}
|
388
403
|
},
|
389
404
|
|
390
405
|
set html(value) {
|
391
|
-
textInputRef.current
|
406
|
+
if (textInputRef.current) {
|
407
|
+
textInputRef.current.innerHTML = value;
|
408
|
+
}
|
392
409
|
|
393
|
-
if (
|
394
|
-
|
395
|
-
|
396
|
-
|
410
|
+
if (placeholderRef.current) {
|
411
|
+
if (value.trim() === "") {
|
412
|
+
placeholderRef.current.style.visibility = "visible";
|
413
|
+
} else {
|
414
|
+
placeholderRef.current.style.visibility = "hidden";
|
415
|
+
}
|
397
416
|
}
|
398
417
|
|
399
|
-
onChange
|
418
|
+
if (typeof onChange === 'function' && textInputRef.current) {
|
419
|
+
onChange(textInputRef.current.innerHTML);
|
420
|
+
}
|
400
421
|
},
|
401
422
|
|
402
423
|
get html() {
|
424
|
+
if (!textInputRef.current) return '';
|
403
425
|
return textInputRef.current.innerHTML;
|
404
426
|
},
|
405
427
|
|
406
428
|
get text() {
|
429
|
+
if (!textInputRef.current) return '';
|
407
430
|
return textInputRef.current.innerText;
|
408
431
|
},
|
409
432
|
|
410
433
|
get size() {
|
434
|
+
if (!textInputRef.current) {
|
435
|
+
return {
|
436
|
+
width: 0,
|
437
|
+
height: 0
|
438
|
+
};
|
439
|
+
}
|
440
|
+
|
411
441
|
return {
|
412
442
|
width: textInputRef.current.offsetWidth,
|
413
443
|
height: textInputRef.current.offsetHeight
|
@@ -415,14 +445,15 @@ const TextInput = ({
|
|
415
445
|
},
|
416
446
|
|
417
447
|
focus() {
|
448
|
+
if (!textInputRef.current) return;
|
418
449
|
textInputRef.current.focus();
|
419
450
|
}
|
420
451
|
|
421
452
|
}));
|
422
|
-
/** @type {React.MutableRefObject<HTMLDivElement>} */
|
453
|
+
/** @type {React.MutableRefObject<HTMLDivElement | null>} */
|
423
454
|
|
424
455
|
const placeholderRef = useRef(null);
|
425
|
-
/** @type {React.MutableRefObject<HTMLDivElement>} */
|
456
|
+
/** @type {React.MutableRefObject<HTMLDivElement | null>} */
|
426
457
|
|
427
458
|
const textInputRef = useRef(null);
|
428
459
|
/**
|
@@ -438,7 +469,7 @@ const TextInput = ({
|
|
438
469
|
} else if (event.key === "ArrowDown") {
|
439
470
|
props.onArrowDown(event);
|
440
471
|
} else {
|
441
|
-
if (event.key.length === 1) {
|
472
|
+
if (event.key.length === 1 && placeholderRef.current) {
|
442
473
|
placeholderRef.current.style.visibility = "hidden";
|
443
474
|
}
|
444
475
|
}
|
@@ -458,18 +489,20 @@ const TextInput = ({
|
|
458
489
|
|
459
490
|
|
460
491
|
function handleKeyUp(event) {
|
461
|
-
var _input$innerText;
|
462
|
-
|
463
492
|
props.onKeyUp(event);
|
464
493
|
const input = textInputRef.current;
|
465
494
|
|
466
|
-
if (
|
467
|
-
|
468
|
-
|
469
|
-
|
495
|
+
if (placeholderRef.current) {
|
496
|
+
if (input?.innerText?.trim() === "") {
|
497
|
+
placeholderRef.current.style.visibility = "visible";
|
498
|
+
} else {
|
499
|
+
placeholderRef.current.style.visibility = "hidden";
|
500
|
+
}
|
470
501
|
}
|
471
502
|
|
472
|
-
onChange
|
503
|
+
if (typeof onChange === 'function' && textInputRef.current) {
|
504
|
+
onChange(textInputRef.current.innerHTML);
|
505
|
+
}
|
473
506
|
}
|
474
507
|
|
475
508
|
return /*#__PURE__*/React.createElement("div", {
|
@@ -497,6 +530,51 @@ const TextInput = ({
|
|
497
530
|
|
498
531
|
const TextInputWithRef = /*#__PURE__*/forwardRef(TextInput);
|
499
532
|
|
533
|
+
/* eslint-disable react/prop-types */
|
534
|
+
/**
|
535
|
+
* @typedef {object} Props
|
536
|
+
* @property {boolean} showPicker
|
537
|
+
* @property {(event: React.MouseEvent) => void} toggleShowPicker
|
538
|
+
* @property {HTMLDivElement=} buttonElement
|
539
|
+
*/
|
540
|
+
|
541
|
+
/**
|
542
|
+
* Emoji Picker Button Component
|
543
|
+
* @param {Props} props
|
544
|
+
* @return {JSX.Element}
|
545
|
+
*/
|
546
|
+
|
547
|
+
function EmojiPickerButton({
|
548
|
+
showPicker,
|
549
|
+
toggleShowPicker,
|
550
|
+
buttonElement
|
551
|
+
}) {
|
552
|
+
const buttonRef = useRef(null);
|
553
|
+
const [showCustomButtonContent, setShowCustomButtonContent] = useState(false);
|
554
|
+
useEffect(() => {
|
555
|
+
if ((buttonElement?.childNodes?.length ?? 0) > 2) {
|
556
|
+
buttonRef.current.appendChild(buttonElement?.childNodes[0]);
|
557
|
+
setShowCustomButtonContent(true);
|
558
|
+
}
|
559
|
+
}, [buttonElement?.childNodes]);
|
560
|
+
return /*#__PURE__*/React.createElement("button", {
|
561
|
+
ref: buttonRef,
|
562
|
+
type: "button",
|
563
|
+
className: `react-input-emoji--button${showPicker ? " react-input-emoji--button__show" : ""}`,
|
564
|
+
onClick: toggleShowPicker
|
565
|
+
}, !showCustomButtonContent && /*#__PURE__*/React.createElement("svg", {
|
566
|
+
xmlns: "http://www.w3.org/2000/svg",
|
567
|
+
viewBox: "0 0 24 24",
|
568
|
+
width: "24",
|
569
|
+
height: "24",
|
570
|
+
className: "react-input-emoji--button--icon"
|
571
|
+
}, /*#__PURE__*/React.createElement("path", {
|
572
|
+
d: "M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"
|
573
|
+
}), /*#__PURE__*/React.createElement("path", {
|
574
|
+
d: "M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0"
|
575
|
+
})));
|
576
|
+
}
|
577
|
+
|
500
578
|
var compressed = true;
|
501
579
|
var categories$1 = [
|
502
580
|
{
|
@@ -49301,23 +49379,20 @@ function _defineProperties(target, props) {
|
|
49301
49379
|
function _createClass(Constructor, protoProps, staticProps) {
|
49302
49380
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
49303
49381
|
if (staticProps) _defineProperties(Constructor, staticProps);
|
49382
|
+
Object.defineProperty(Constructor, "prototype", {
|
49383
|
+
writable: false
|
49384
|
+
});
|
49304
49385
|
return Constructor;
|
49305
49386
|
}
|
49306
49387
|
|
49307
49388
|
function _typeof(obj) {
|
49308
49389
|
"@babel/helpers - typeof";
|
49309
49390
|
|
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);
|
49391
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
49392
|
+
return typeof obj;
|
49393
|
+
} : function (obj) {
|
49394
|
+
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
49395
|
+
}, _typeof(obj);
|
49321
49396
|
}
|
49322
49397
|
|
49323
49398
|
var mapping = {
|
@@ -49407,8 +49482,8 @@ var stringFromCodePoint = _String.fromCodePoint || function stringFromCodePoint(
|
|
49407
49482
|
codePoint > 0x10ffff || // not a valid Unicode code point
|
49408
49483
|
Math.floor(codePoint) != codePoint // not an integer
|
49409
49484
|
) {
|
49410
|
-
|
49411
|
-
|
49485
|
+
throw RangeError('Invalid code point: ' + codePoint);
|
49486
|
+
}
|
49412
49487
|
|
49413
49488
|
if (codePoint <= 0xffff) {
|
49414
49489
|
// BMP code point
|
@@ -50011,7 +50086,7 @@ function _defineProperty(obj, key, value) {
|
|
50011
50086
|
}
|
50012
50087
|
|
50013
50088
|
function _extends() {
|
50014
|
-
_extends = Object.assign
|
50089
|
+
_extends = Object.assign ? Object.assign.bind() : function (target) {
|
50015
50090
|
for (var i = 1; i < arguments.length; i++) {
|
50016
50091
|
var source = arguments[i];
|
50017
50092
|
|
@@ -50024,7 +50099,6 @@ function _extends() {
|
|
50024
50099
|
|
50025
50100
|
return target;
|
50026
50101
|
};
|
50027
|
-
|
50028
50102
|
return _extends.apply(this, arguments);
|
50029
50103
|
}
|
50030
50104
|
|
@@ -50039,24 +50113,25 @@ function _assertThisInitialized(self) {
|
|
50039
50113
|
function _possibleConstructorReturn(self, call) {
|
50040
50114
|
if (call && (_typeof(call) === "object" || typeof call === "function")) {
|
50041
50115
|
return call;
|
50116
|
+
} else if (call !== void 0) {
|
50117
|
+
throw new TypeError("Derived constructors may only return object or undefined");
|
50042
50118
|
}
|
50043
50119
|
|
50044
50120
|
return _assertThisInitialized(self);
|
50045
50121
|
}
|
50046
50122
|
|
50047
50123
|
function _getPrototypeOf(o) {
|
50048
|
-
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
|
50124
|
+
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
|
50049
50125
|
return o.__proto__ || Object.getPrototypeOf(o);
|
50050
50126
|
};
|
50051
50127
|
return _getPrototypeOf(o);
|
50052
50128
|
}
|
50053
50129
|
|
50054
50130
|
function _setPrototypeOf(o, p) {
|
50055
|
-
_setPrototypeOf = Object.setPrototypeOf
|
50131
|
+
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
|
50056
50132
|
o.__proto__ = p;
|
50057
50133
|
return o;
|
50058
50134
|
};
|
50059
|
-
|
50060
50135
|
return _setPrototypeOf(o, p);
|
50061
50136
|
}
|
50062
50137
|
|
@@ -50072,6 +50147,9 @@ function _inherits(subClass, superClass) {
|
|
50072
50147
|
configurable: true
|
50073
50148
|
}
|
50074
50149
|
});
|
50150
|
+
Object.defineProperty(subClass, "prototype", {
|
50151
|
+
writable: false
|
50152
|
+
});
|
50075
50153
|
if (superClass) _setPrototypeOf(subClass, superClass);
|
50076
50154
|
}
|
50077
50155
|
|
@@ -52349,7 +52427,7 @@ styleInject(css_248z);
|
|
52349
52427
|
* @property {'light' | 'dark' | 'auto'} theme
|
52350
52428
|
* @property {function(import("../types/types").EmojiMartItem): void} onSelectEmoji
|
52351
52429
|
* @property {boolean} disableRecent
|
52352
|
-
* @property {
|
52430
|
+
* @property {import("emoji-mart").CustomEmoji[]=} customEmojis
|
52353
52431
|
*/
|
52354
52432
|
|
52355
52433
|
/**
|
@@ -52394,6 +52472,43 @@ EmojiPicker.propTypes = {
|
|
52394
52472
|
};
|
52395
52473
|
var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
|
52396
52474
|
|
52475
|
+
/**
|
52476
|
+
* @typedef {object} Props
|
52477
|
+
* @property {boolean} showPicker
|
52478
|
+
* @property {'light' | 'dark' | 'auto'} theme
|
52479
|
+
* @property {(emoji: import("../types/types").EmojiMartItem) => void} handleSelectEmoji
|
52480
|
+
* @property {boolean} disableRecent
|
52481
|
+
* @property {import("emoji-mart").CustomEmoji[]=} customEmojis
|
52482
|
+
*/
|
52483
|
+
|
52484
|
+
/**
|
52485
|
+
* Emoji Picker Button Component
|
52486
|
+
* @param {Props} props
|
52487
|
+
* @return {JSX.Element}
|
52488
|
+
*/
|
52489
|
+
|
52490
|
+
function EmojiPickerContainer({
|
52491
|
+
showPicker,
|
52492
|
+
theme,
|
52493
|
+
handleSelectEmoji,
|
52494
|
+
disableRecent,
|
52495
|
+
customEmojis
|
52496
|
+
}) {
|
52497
|
+
return /*#__PURE__*/React.createElement("div", {
|
52498
|
+
className: "react-emoji-picker--container"
|
52499
|
+
}, showPicker && /*#__PURE__*/React.createElement("div", {
|
52500
|
+
className: "react-emoji-picker--wrapper",
|
52501
|
+
onClick: evt => evt.stopPropagation()
|
52502
|
+
}, /*#__PURE__*/React.createElement("div", {
|
52503
|
+
className: "react-emoji-picker"
|
52504
|
+
}, /*#__PURE__*/React.createElement(EmojiPicker$1, {
|
52505
|
+
theme: theme,
|
52506
|
+
onSelectEmoji: handleSelectEmoji,
|
52507
|
+
disableRecent: disableRecent,
|
52508
|
+
customEmojis: customEmojis
|
52509
|
+
}))));
|
52510
|
+
}
|
52511
|
+
|
52397
52512
|
// @ts-check
|
52398
52513
|
/**
|
52399
52514
|
* @typedef {import('../types/types').SanitizeFn} SanitizeFn
|
@@ -52408,10 +52523,11 @@ var EmojiPicker$1 = /*#__PURE__*/memo(EmojiPicker);
|
|
52408
52523
|
* @property {'light' | 'dark' | 'auto'} theme
|
52409
52524
|
* @property {boolean} keepOpened
|
52410
52525
|
* @property {boolean} disableRecent
|
52411
|
-
* @property {
|
52526
|
+
* @property {import("emoji-mart").CustomEmoji[]=} customEmojis
|
52412
52527
|
* @property {(fn: SanitizeFn) => void} addSanitizeFn
|
52413
52528
|
* @property {(fn: PolluteFn) => void} addPolluteFn
|
52414
52529
|
* @property {(html: string) => void} appendContent
|
52530
|
+
* @property {HTMLDivElement=} buttonElement
|
52415
52531
|
*/
|
52416
52532
|
// eslint-disable-next-line valid-jsdoc
|
52417
52533
|
|
@@ -52425,9 +52541,13 @@ const EmojiPickerWrapper = props => {
|
|
52425
52541
|
customEmojis,
|
52426
52542
|
addSanitizeFn,
|
52427
52543
|
addPolluteFn,
|
52428
|
-
appendContent
|
52544
|
+
appendContent,
|
52545
|
+
buttonElement
|
52429
52546
|
} = props;
|
52430
52547
|
const [showPicker, setShowPicker] = useState(false);
|
52548
|
+
/** @type {[HTMLDivElement | undefined, React.Dispatch<React.SetStateAction<HTMLDivElement | undefined>>]} */
|
52549
|
+
|
52550
|
+
const [customButton, setCustomButton] = useState();
|
52431
52551
|
useEffect(() => {
|
52432
52552
|
addSanitizeFn(replaceAllTextEmojiToString);
|
52433
52553
|
}, [addSanitizeFn]);
|
@@ -52481,33 +52601,32 @@ const EmojiPickerWrapper = props => {
|
|
52481
52601
|
}
|
52482
52602
|
}
|
52483
52603
|
|
52484
|
-
|
52485
|
-
|
52486
|
-
|
52487
|
-
|
52488
|
-
|
52489
|
-
},
|
52490
|
-
|
52491
|
-
|
52604
|
+
useEffect(() => {
|
52605
|
+
if (buttonElement?.style) {
|
52606
|
+
buttonElement.style.position = "relative";
|
52607
|
+
setCustomButton(buttonElement);
|
52608
|
+
}
|
52609
|
+
}, [buttonElement]);
|
52610
|
+
return customButton ? /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EmojiPickerContainer, {
|
52611
|
+
showPicker: showPicker,
|
52492
52612
|
theme: theme,
|
52493
|
-
|
52613
|
+
handleSelectEmoji: handleSelectEmoji,
|
52494
52614
|
disableRecent: disableRecent,
|
52495
52615
|
customEmojis: customEmojis
|
52496
|
-
})
|
52497
|
-
|
52498
|
-
|
52499
|
-
|
52500
|
-
}, /*#__PURE__*/React.createElement(
|
52501
|
-
|
52502
|
-
|
52503
|
-
|
52504
|
-
|
52505
|
-
|
52506
|
-
}, /*#__PURE__*/React.createElement(
|
52507
|
-
|
52508
|
-
|
52509
|
-
|
52510
|
-
}))));
|
52616
|
+
}), /*#__PURE__*/React.createElement(EmojiPickerButton, {
|
52617
|
+
showPicker: showPicker,
|
52618
|
+
toggleShowPicker: toggleShowPicker,
|
52619
|
+
buttonElement: customButton
|
52620
|
+
})), customButton) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EmojiPickerContainer, {
|
52621
|
+
showPicker: showPicker,
|
52622
|
+
theme: theme,
|
52623
|
+
handleSelectEmoji: handleSelectEmoji,
|
52624
|
+
disableRecent: disableRecent,
|
52625
|
+
customEmojis: customEmojis
|
52626
|
+
}), /*#__PURE__*/React.createElement(EmojiPickerButton, {
|
52627
|
+
showPicker: showPicker,
|
52628
|
+
toggleShowPicker: toggleShowPicker
|
52629
|
+
}));
|
52511
52630
|
};
|
52512
52631
|
|
52513
52632
|
// @ts-check
|
@@ -52606,7 +52725,7 @@ function getElementWithFocus() {
|
|
52606
52725
|
|
52607
52726
|
function getSelectionStart() {
|
52608
52727
|
const node = document.getSelection().anchorNode;
|
52609
|
-
return
|
52728
|
+
return node?.nodeType == 3 ? node : null;
|
52610
52729
|
}
|
52611
52730
|
|
52612
52731
|
// @ts-check
|
@@ -52651,11 +52770,9 @@ function useMention(searchMention) {
|
|
52651
52770
|
/** @type {(event: React.KeyboardEvent) => void} */
|
52652
52771
|
|
52653
52772
|
const onKeyUp = useCallback(async event => {
|
52654
|
-
var _getElementWithFocus;
|
52655
|
-
|
52656
52773
|
if (typeof searchMention !== "function") return;
|
52657
52774
|
|
52658
|
-
if (event.key === "Backspace" &&
|
52775
|
+
if (event.key === "Backspace" && getElementWithFocus()?.element.parentElement.hasAttribute("data-mention-id")) {
|
52659
52776
|
const elementWithFocus = getElementWithFocus();
|
52660
52777
|
elementWithFocus.element.parentElement.remove();
|
52661
52778
|
} else if (!["ArrowUp", "ArrowDown", "Esc", "Escape"].includes(event.key)) {
|
@@ -53006,7 +53123,8 @@ function useEventListeners() {
|
|
53006
53123
|
arrowUp: createObserver(),
|
53007
53124
|
arrowDown: createObserver(),
|
53008
53125
|
enter: createObserver(),
|
53009
|
-
focus: createObserver()
|
53126
|
+
focus: createObserver(),
|
53127
|
+
blur: createObserver()
|
53010
53128
|
}), []);
|
53011
53129
|
/**
|
53012
53130
|
* @template {keyof TextInputListeners} T, K
|
@@ -53072,6 +53190,7 @@ function usePollute() {
|
|
53072
53190
|
* @property {(size: {width: number, height: number}) => void} onResize
|
53073
53191
|
* @property {() => void} onClick
|
53074
53192
|
* @property {() => void} onFocus
|
53193
|
+
* @property {() => void=} onBlur
|
53075
53194
|
* @property {number} maxLength
|
53076
53195
|
* @property {boolean} keepOpened
|
53077
53196
|
* @property {(event: KeyboardEvent) => void} onKeyDown
|
@@ -53085,6 +53204,7 @@ function usePollute() {
|
|
53085
53204
|
* @property {string} fontFamily
|
53086
53205
|
* @property {object[]=} customEmojis
|
53087
53206
|
* @property {(text: string) => Promise<MetionUser[]>=} searchMention
|
53207
|
+
* @property {HTMLDivElement=} buttonElement
|
53088
53208
|
*/
|
53089
53209
|
|
53090
53210
|
/**
|
@@ -53101,6 +53221,7 @@ function InputEmoji(props, ref) {
|
|
53101
53221
|
onResize,
|
53102
53222
|
onClick,
|
53103
53223
|
onFocus,
|
53224
|
+
onBlur,
|
53104
53225
|
onKeyDown,
|
53105
53226
|
theme,
|
53106
53227
|
cleanOnEnter,
|
@@ -53113,13 +53234,14 @@ function InputEmoji(props, ref) {
|
|
53113
53234
|
value,
|
53114
53235
|
customEmojis,
|
53115
53236
|
searchMention,
|
53237
|
+
buttonElement,
|
53116
53238
|
// style
|
53117
53239
|
borderRadius,
|
53118
53240
|
borderColor,
|
53119
53241
|
fontSize,
|
53120
53242
|
fontFamily
|
53121
53243
|
} = props;
|
53122
|
-
/** @type {React.MutableRefObject<import('./text-input').Ref>} */
|
53244
|
+
/** @type {React.MutableRefObject<import('./text-input').Ref | null>} */
|
53123
53245
|
|
53124
53246
|
const textInputRef = useRef(null);
|
53125
53247
|
const {
|
@@ -53136,6 +53258,7 @@ function InputEmoji(props, ref) {
|
|
53136
53258
|
pollute
|
53137
53259
|
} = usePollute();
|
53138
53260
|
const updateHTML = useCallback((nextValue = "") => {
|
53261
|
+
if (textInputRef.current === null) return;
|
53139
53262
|
textInputRef.current.html = replaceAllTextEmojis(nextValue);
|
53140
53263
|
sanitizedTextRef.current = nextValue;
|
53141
53264
|
}, [sanitizedTextRef]);
|
@@ -53164,11 +53287,11 @@ function InputEmoji(props, ref) {
|
|
53164
53287
|
* @return {boolean}
|
53165
53288
|
*/
|
53166
53289
|
function handleKeydown(event) {
|
53167
|
-
if (typeof maxLength !== "undefined" && event.key !== "Backspace" && totalCharacters(textInputRef.current) >= maxLength) {
|
53290
|
+
if (typeof maxLength !== "undefined" && event.key !== "Backspace" && textInputRef.current !== null && totalCharacters(textInputRef.current) >= maxLength) {
|
53168
53291
|
event.preventDefault();
|
53169
53292
|
}
|
53170
53293
|
|
53171
|
-
if (event.key === "Enter") {
|
53294
|
+
if (event.key === "Enter" && textInputRef.current) {
|
53172
53295
|
event.preventDefault();
|
53173
53296
|
const text = sanitize(textInputRef.current.html);
|
53174
53297
|
emitChange(sanitizedTextRef.current);
|
@@ -53217,6 +53340,19 @@ function InputEmoji(props, ref) {
|
|
53217
53340
|
unsubscribe();
|
53218
53341
|
};
|
53219
53342
|
}, [addEventListener, onClick, onFocus]);
|
53343
|
+
useEffect(() => {
|
53344
|
+
/** */
|
53345
|
+
function handleBlur() {
|
53346
|
+
if (typeof onBlur === "function") {
|
53347
|
+
onBlur();
|
53348
|
+
}
|
53349
|
+
}
|
53350
|
+
|
53351
|
+
const unsubscribe = addEventListener("blur", handleBlur);
|
53352
|
+
return () => {
|
53353
|
+
unsubscribe();
|
53354
|
+
};
|
53355
|
+
}, [addEventListener, onBlur]);
|
53220
53356
|
/**
|
53221
53357
|
*
|
53222
53358
|
* @param {string} html
|
@@ -53233,11 +53369,13 @@ function InputEmoji(props, ref) {
|
|
53233
53369
|
|
53234
53370
|
|
53235
53371
|
function appendContent(html) {
|
53236
|
-
if (typeof maxLength !== "undefined" && totalCharacters(textInputRef.current) >= maxLength) {
|
53372
|
+
if (typeof maxLength !== "undefined" && textInputRef.current !== null && totalCharacters(textInputRef.current) >= maxLength) {
|
53237
53373
|
return;
|
53238
53374
|
}
|
53239
53375
|
|
53240
|
-
textInputRef.current
|
53376
|
+
if (textInputRef.current !== null) {
|
53377
|
+
textInputRef.current.appendContent(html);
|
53378
|
+
}
|
53241
53379
|
}
|
53242
53380
|
/**
|
53243
53381
|
* Handle copy of current selected text
|
@@ -53277,6 +53415,7 @@ function InputEmoji(props, ref) {
|
|
53277
53415
|
ref: textInputRef,
|
53278
53416
|
onCopy: handleCopy,
|
53279
53417
|
onPaste: handlePaste,
|
53418
|
+
onBlur: listeners.blur.publish,
|
53280
53419
|
onFocus: listeners.focus.publish,
|
53281
53420
|
onArrowUp: listeners.arrowUp.publish,
|
53282
53421
|
onArrowDown: listeners.arrowDown.publish,
|
@@ -53300,7 +53439,8 @@ function InputEmoji(props, ref) {
|
|
53300
53439
|
customEmojis: customEmojis,
|
53301
53440
|
addSanitizeFn: addSanitizeFn,
|
53302
53441
|
addPolluteFn: addPolluteFn,
|
53303
|
-
appendContent: appendContent
|
53442
|
+
appendContent: appendContent,
|
53443
|
+
buttonElement: buttonElement
|
53304
53444
|
}));
|
53305
53445
|
}
|
53306
53446
|
|
@@ -53319,5 +53459,5 @@ InputEmojiWithRef.defaultProps = {
|
|
53319
53459
|
customEmojis: []
|
53320
53460
|
};
|
53321
53461
|
|
53322
|
-
export default
|
53462
|
+
export { InputEmojiWithRef as default };
|
53323
53463
|
//# sourceMappingURL=index.es.js.map
|